From dfdf8ba7c98df226b209eb40a0081594ad370d08 Mon Sep 17 00:00:00 2001 From: Mark Johnson Date: Thu, 22 Dec 2022 14:15:59 +0000 Subject: [PATCH] MDL-76745 cache: Implement cache_loader_with_locking in cache_disabled If a plugin attempts to do something that would lock coursemodinfo cache during install (such as creating a course module), this currently fails as check_lock_state is not implemented in cache_disabled. Adding the cache_loader_with_locking interface ensures that all lock methods are implemented. --- cache/disabledlib.php | 22 ++++++++++++++++------ cache/tests/cache_test.php | 9 +++++++++ 2 files changed, 25 insertions(+), 6 deletions(-) diff --git a/cache/disabledlib.php b/cache/disabledlib.php index c7cde7607db..39517137f0e 100644 --- a/cache/disabledlib.php +++ b/cache/disabledlib.php @@ -39,7 +39,7 @@ require_once($CFG->dirroot.'/cache/locallib.php'); * @copyright 2012 Sam Hemelryk * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later */ -class cache_disabled extends cache { +class cache_disabled extends cache implements cache_loader_with_locking { /** * Constructs the cache. @@ -204,20 +204,30 @@ class cache_disabled extends cache { /** * Pretend that we got a lock to avoid errors. * - * @param string $key + * @param int|string $key * @return bool */ - public function acquire_lock(string $key) : bool { + public function acquire_lock($key) : bool { return true; } /** * Pretend that we released a lock to avoid errors. * - * @param string $key - * @return void + * @param int|string $key + * @return bool */ - public function release_lock(string $key) : bool { + public function release_lock($key) : bool { + return true; + } + + /** + * Pretend that we have a lock to avoid errors. + * + * @param int|string $key + * @return bool + */ + public function check_lock_state($key) : bool { return true; } } diff --git a/cache/tests/cache_test.php b/cache/tests/cache_test.php index 2ee1198f6fc..5a660c34cd9 100644 --- a/cache/tests/cache_test.php +++ b/cache/tests/cache_test.php @@ -1426,6 +1426,15 @@ class cache_test extends \advanced_testcase { $this->assertFalse($cache->set_versioned('v', 1, 'data')); $this->assertFalse($cache->delete('test')); $this->assertTrue($cache->purge()); + // Checking a lock should always report that we have one. + // Acquiring or releasing a lock should always report success. + $this->assertTrue($cache->check_lock_state('test')); + $this->assertTrue($cache->acquire_lock('test')); + $this->assertTrue($cache->acquire_lock('test')); + $this->assertTrue($cache->check_lock_state('test')); + $this->assertTrue($cache->release_lock('test')); + $this->assertTrue($cache->release_lock('test')); + $this->assertTrue($cache->check_lock_state('test')); // Test a session cache. $cache = cache::make_from_params(cache_store::MODE_SESSION, 'phpunit', 'disable');