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:
Vendored
+7
-2
@@ -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
@@ -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);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user