MDL-76784 core_cache: versioned cache (modinfo) can fail in install

When cache is disabled but temporary in-memory caches are allowed,
these were direct instances of cachestore_static with no loader, which
meant that the get_versioned and set_versioned functions did not work.
This commit is contained in:
sam marshall
2023-02-21 10:40:23 +00:00
parent 8503f2cfd8
commit a3b1e3b4ee
2 changed files with 41 additions and 2 deletions
+7 -2
View File
@@ -294,8 +294,13 @@ class cache_factory_disabled extends cache_factory {
$definition = $this->create_definition($component, $area);
// The cachestore_static class returns true to all three 'SUPPORTS_' checks so it
// can be used with all definitions.
$cache = new cachestore_static('TEMP:' . $component . '/' . $area);
$cache->initialise($definition);
$store = new cachestore_static('TEMP:' . $component . '/' . $area);
$store->initialise($definition);
// We need to use a cache loader wrapper rather than directly returning the store,
// or it wouldn't have support for versioning. The cache_application class is used
// (rather than cache_request which might make more sense logically) because it
// includes support for locking, which might be necessary for some caches.
$cache = new cache_application($definition, $store);
self::$tempcaches[$key] = $cache;
}
return $cache;
+34
View File
@@ -62,4 +62,38 @@ class allow_temporary_caches_test extends \advanced_testcase {
$gecko = new allow_temporary_caches();
$this->assertTrue(allow_temporary_caches::is_allowed());
}
/**
* Tests that the temporary caches actually work, including normal and versioned get and set.
*/
public function test_temporary_cache(): void {
$this->resetAfterTest();
// Disable the cache.
\cache_phpunit_factory::phpunit_disable();
try {
// Try using the cache now - it returns false/null for everything.
$cache = \cache::make('core', 'coursemodinfo');
$cache->set('frog', 'ribbit');
$this->assertFalse($cache->get('frog'));
$cache->set_versioned('toad', 2, 'croak');
$this->assertFalse($cache->get_versioned('toad', 2));
// But when we allow temporary caches, it should work as normal.
$allow = new allow_temporary_caches();
$cache = \cache::make('core', 'coursemodinfo');
$cache->set('frog', 'ribbit');
$this->assertEquals('ribbit', $cache->get('frog'));
$cache->set_versioned('toad', 2, 'croak');
$this->assertEquals('croak', $cache->get_versioned('toad', 2));
// Let's actually use modinfo, to check it works with locking too.
$course = $this->getDataGenerator()->create_course();
get_fast_modinfo($course);
} finally {
// You have to do this after phpunit_disable or it breaks later tests.
\cache_factory::reset();
\cache_factory::instance(true);
}
}
}