diff --git a/core/lib/Drupal/Core/Lock/PersistentDatabaseLockBackend.php b/core/lib/Drupal/Core/Lock/PersistentDatabaseLockBackend.php index 6aae072..f9c3945 100644 --- a/core/lib/Drupal/Core/Lock/PersistentDatabaseLockBackend.php +++ b/core/lib/Drupal/Core/Lock/PersistentDatabaseLockBackend.php @@ -27,8 +27,8 @@ public function __construct(Connection $database) { // This simply overrides the parent constructor, to not have it register // releaseAll() as a shutdown function. $this->database = $database; - // Also set the lockId to a static global value to make the lock Drupal - // global. + // Set the lockId to a fixed string to make the lock ID the same across + // multiple requests. $this->lockId = 'persistent'; } } diff --git a/core/modules/simpletest/src/KernelTestBase.php b/core/modules/simpletest/src/KernelTestBase.php index 1722b26..5534d7e 100644 --- a/core/modules/simpletest/src/KernelTestBase.php +++ b/core/modules/simpletest/src/KernelTestBase.php @@ -257,7 +257,6 @@ public function containerBuild(ContainerBuilder $container) { $this->container->setParameter('language.default_values', Language::$defaultValues); $container->register('lock', 'Drupal\Core\Lock\NullLockBackend'); - $container->register('lock.persistent', 'Drupal\Core\Lock\NullLockBackend'); $container->register('cache_factory', 'Drupal\Core\Cache\MemoryBackendFactory'); $container diff --git a/core/modules/system/src/Tests/Lock/LockFunctionalTest.php b/core/modules/system/src/Tests/Lock/LockFunctionalTest.php index 6b1518c..846b44d 100644 --- a/core/modules/system/src/Tests/Lock/LockFunctionalTest.php +++ b/core/modules/system/src/Tests/Lock/LockFunctionalTest.php @@ -59,4 +59,29 @@ public function testLockAcquire() { $this->assertText($lock_acquired_exit, 'Lock acquired by the other request before exit.', 'Lock'); $this->assertTrue($lock->acquire('system_test_lock_exit'), 'Lock acquired by this request after the other request exits.', 'Lock'); } + + /** + * Tests that the persistent lock is persisted between requests. + */ + public function testPersistentLock() { + $persistent_lock = $this->container->get('lock.persistent'); + // Get a persistent lock. + $this->drupalGet('system-test/lock-persist/lock1'); + $this->assertText('TRUE: Lock successfully acquired in SystemTestController::lockPersist()'); + // Ensure that a shutdown function has not released the lock. + $this->assertFalse($persistent_lock->lockMayBeAvailable('lock1')); + $this->drupalGet('system-test/lock-persist/lock1'); + $this->assertText('FALSE: Lock not acquired in SystemTestController::lockPersist()'); + + // Get another persistent lock. + $this->drupalGet('system-test/lock-persist/lock2'); + $this->assertText('TRUE: Lock successfully acquired in SystemTestController::lockPersist()'); + $this->assertFalse($persistent_lock->lockMayBeAvailable('lock2')); + + // Release the first lock and try getting it again. + $persistent_lock->release('lock1'); + $this->drupalGet('system-test/lock-persist/lock1'); + $this->assertText('TRUE: Lock successfully acquired in SystemTestController::lockPersist()'); + } + } diff --git a/core/modules/system/tests/modules/system_test/src/Controller/SystemTestController.php b/core/modules/system/tests/modules/system_test/src/Controller/SystemTestController.php index 0b9290b..70da955 100644 --- a/core/modules/system/tests/modules/system_test/src/Controller/SystemTestController.php +++ b/core/modules/system/tests/modules/system_test/src/Controller/SystemTestController.php @@ -8,6 +8,8 @@ namespace Drupal\system_test\Controller; use Drupal\Core\Controller\ControllerBase; +use Drupal\Core\Lock\LockBackendInterface; +use Symfony\Component\DependencyInjection\ContainerInterface; /** * Controller routines for system_test routes. @@ -15,6 +17,30 @@ class SystemTestController extends ControllerBase { /** + * The persistent lock service. + * + * @var \Drupal\Core\Lock\LockBackendInterface + */ + protected $persistentLock; + + /** + * Constructs the SystemTestController. + * + * @param \Drupal\Core\Lock\LockBackendInterface $persistent_lock + * The persistent lock service. + */ + public function __construct(LockBackendInterface $persistent_lock) { + $this->persistentLock = $persistent_lock; + } + + /** + * {@inheritdoc} + */ + public static function create(ContainerInterface $container) { + return new static($container->get('lock.persistent')); + } + + /** * Tests main content fallback. * * @return string @@ -39,6 +65,24 @@ public function lockExit() { } /** + * Creates a lock that will persist across requests. + * + * @param string $lock_name + * The name of the persistent lock to acquire. + * + * @return string + * The text to display. + */ + public function lockPersist($lock_name) { + if ($this->persistentLock->acquire($lock_name)) { + return 'TRUE: Lock successfully acquired in SystemTestController::lockPersist()'; + } + else { + return 'FALSE: Lock not acquired in SystemTestController::lockPersist()'; + } + } + + /** * Set cache tag on on the returned render array. */ public function system_test_cache_tags_page() { diff --git a/core/modules/system/tests/modules/system_test/system_test.routing.yml b/core/modules/system/tests/modules/system_test/system_test.routing.yml index 520ba37..f025995 100644 --- a/core/modules/system/tests/modules/system_test/system_test.routing.yml +++ b/core/modules/system/tests/modules/system_test/system_test.routing.yml @@ -45,6 +45,14 @@ system_test.lock_exit: requirements: _access: 'TRUE' +system_test.lock_persist: + path: '/system-test/lock-persist/{lock_name}' + defaults: + _title: 'Persistent lock acquire' + _content: '\Drupal\system_test\Controller\SystemTestController::lockPersist' + requirements: + _access: 'TRUE' + system_test.cache_tags_page: path: '/system-test/cache_tags_page' defaults: