Skip to content
Browse files

MDL-37683 cache: siteidentifier is now included in the keys

Conflicts:
	lib/db/upgrade.php
	lib/moodlelib.php
	version.php
  • Loading branch information...
1 parent 09de5eb commit a2b5f389de4fa68271c34dec1c53714c5c5c04bd Sam Hemelryk committed Feb 6, 2013
View
20 cache/classes/config.php
@@ -72,6 +72,12 @@ class cache_config {
protected $configlocks = array();
/**
+ * The site identifier used when the cache config was last saved.
+ * @var string
+ */
+ protected $siteidentifier = null;
+
+ /**
* Please use cache_config::instance to get an instance of the cache config that is ready to be used.
*/
public function __construct() {
@@ -139,6 +145,12 @@ public function load($configuration = false) {
$this->configdefinitionmappings = array();
$this->configlockmappings = array();
+ $siteidentifier = 'unknown';
+ if (array_key_exists('siteidentifier', $configuration)) {
+ $siteidentifier = $configuration['siteidentifier'];
+ }
+ $this->siteidentifier = $siteidentifier;
+
// Filter the lock instances.
$defaultlock = null;
foreach ($configuration['locks'] as $conf) {
@@ -272,6 +284,14 @@ public function load($configuration = false) {
}
/**
+ * Returns the site identifier used by the cache API.
+ * @return string
+ */
+ public function get_site_identifier() {
+ return $this->siteidentifier;
+ }
+
+ /**
* Includes the configuration file and makes sure it contains the expected bits.
*
* You need to ensure that the config file exists before this is called.
View
19 cache/classes/definition.php
@@ -275,6 +275,12 @@ class cache_definition {
protected $definitionhash = null;
/**
+ * An identifier to make cache keys predictably unique.
+ * @var string
+ */
+ protected $cacheidentifier = '0';
+
+ /**
* Creates a cache definition given a definition from the cache configuration or from a caches.php file.
*
* @param string $id
@@ -675,6 +681,15 @@ public function set_identifiers(array $identifiers = array()) {
}
/**
+ * Sets an identifier for the cache.
+ * This can be used
+ * @param string $identifier
+ */
+ public function set_cache_identifier($identifier) {
+ $this->cacheidentifier = (string)$identifier;
+ }
+
+ /**
* Returns the requirements of this definition as a binary flag.
* @return int
*/
@@ -723,7 +738,8 @@ public function generate_definition_hash() {
*/
public function generate_single_key_prefix() {
if ($this->keyprefixsingle === null) {
- $this->keyprefixsingle = $this->mode.'/'.$this->mode;
+ $this->keyprefixsingle = $this->mode.'/'.$this->component.'/'.$this->area;
+ $this->keyprefixsingle .= '/'.$this->cacheidentifier;
$identifiers = $this->get_identifiers();
if ($identifiers) {
foreach ($identifiers as $key => $value) {
@@ -746,6 +762,7 @@ public function generate_multi_key_parts() {
'mode' => $this->mode,
'component' => $this->component,
'area' => $this->area,
+ 'siteidentifier' => $this->cacheidentifier
);
if (!empty($this->identifiers)) {
$identifiers = array();
View
3 cache/classes/factory.php
@@ -203,6 +203,8 @@ public function create_cache_from_params($mode, $component, $area, array $identi
}
// Get the class. Note this is a late static binding so we need to use get_called_class.
$definition = cache_definition::load_adhoc($mode, $component, $area, $options);
+ $config = $this->create_config_instance();
+ $definition->set_cache_identifier($config->get_site_identifier());
$definition->set_identifiers($identifiers);
$cache = $this->create_cache($definition, $identifiers);
if ($definition->should_be_persistent()) {
@@ -390,6 +392,7 @@ public function create_definition($component, $area, $aggregate = null) {
} else {
$definition = cache_definition::load($id, $definition, $aggregate);
}
+ $definition->set_cache_identifier($instance->get_site_identifier());
}
$this->definitions[$id] = $definition;
}
View
19 cache/classes/helper.php
@@ -234,6 +234,7 @@ public static function invalidate_by_event($event, array $keys) {
$factory = cache_factory::instance();
foreach ($instance->get_definitions() as $name => $definitionarr) {
$definition = cache_definition::load($name, $definitionarr);
+ $definition->set_cache_identifier($instance->get_site_identifier());
if ($definition->invalidates_on_event($event)) {
// OK at this point we know that the definition has information to invalidate on the event.
// There are two routes, either its an application cache in which case we can invalidate it now.
@@ -304,6 +305,7 @@ public static function purge_by_event($event) {
$factory = cache_factory::instance();
foreach ($instance->get_definitions() as $name => $definitionarr) {
$definition = cache_definition::load($name, $definitionarr);
+ $definition->set_cache_identifier($instance->get_site_identifier());
if ($definition->invalidates_on_event($event)) {
// Create the cache.
$cache = $factory->create_cache($definition);
@@ -496,4 +498,21 @@ public static function update_definitions($coreonly = false) {
// Second reset anything we have already initialised to ensure we're all up to date.
cache_factory::reset();
}
+
+ /**
+ * Update the site identifier stored by the cache API.
+ *
+ * @param string $siteidentifier
+ */
+ public static function update_site_identifier($siteidentifier) {
+ global $CFG;
+ // Include locallib
+ require_once($CFG->dirroot.'/cache/locallib.php');
+ $factory = cache_factory::instance();
+ $factory->updating_started();
+ $config = $factory->create_config_instance(true);
+ $config->update_site_identifier($siteidentifier);
+ $factory->updating_finished();
+ cache_factory::reset();
+ }
}
View
10 cache/locallib.php
@@ -119,6 +119,7 @@ protected function config_save() {
*/
protected function generate_configuration_array() {
$configuration = array();
+ $configuration['siteidentifier'] = $this->siteidentifier;;
$configuration['stores'] = $this->configstores;
$configuration['modemappings'] = $this->configmodemappings;
$configuration['definitions'] = $this->configdefinitions;
@@ -524,6 +525,15 @@ public function set_definition_mappings($definition, $mappings) {
$this->config_save();
}
+ /**
+ * Update the site identifier stored by the cache API.
+ *
+ * @param string $siteidentifier
+ */
+ public function update_site_identifier($siteidentifier) {
+ $this->siteidentifier = md5((string)$siteidentifier);
+ $this->config_save();
+ }
}
/**
View
13 cache/tests/cache_test.php
@@ -553,6 +553,8 @@ public function test_distributed_application_event_invalidation() {
'mode' => cache_store::MODE_APPLICATION,
'component' => 'phpunit',
'area' => 'eventinvalidationtest',
+ 'simplekeys' => true,
+ 'simpledata' => true,
'invalidationevents' => array(
'crazyevent'
)
@@ -567,13 +569,16 @@ public function test_distributed_application_event_invalidation() {
// OK data added, data invalidated, and invalidation time has been set.
// Now we need to manually add back the data and adjust the invalidation time.
- $timefile = $CFG->dataroot.'/cache/cachestore_file/default_application/phpunit_eventinvalidationtest/a65/a65b1dc524cf6e03c1795197c84d5231eb229b86.cache';
+ $hash = md5(cache_store::MODE_APPLICATION.'/phpunit/eventinvalidationtest/'.$CFG->wwwroot.'phpunit');
+ $timefile = $CFG->dataroot."/cache/cachestore_file/default_application/phpunit_eventinvalidationtest/las/lastinvalidation-$hash.cache";
+ // Make sure the file is correct.
+ $this->assertTrue(file_exists($timefile));
$timecont = serialize(cache::now() - 60); // Back 60sec in the past to force it to re-invalidate.
make_writable_directory(dirname($timefile));
file_put_contents($timefile, $timecont);
$this->assertTrue(file_exists($timefile));
- $datafile = $CFG->dataroot.'/cache/cachestore_file/default_application/phpunit_eventinvalidationtest/626/626e9c7a45febd98f064c2b383de8d9d4ebbde7b.cache';
+ $datafile = $CFG->dataroot."/cache/cachestore_file/default_application/phpunit_eventinvalidationtest/tes/testkey1-$hash.cache";
$datacont = serialize("test data 1");
make_writable_directory(dirname($datafile));
file_put_contents($datafile, $datacont);
@@ -586,6 +591,8 @@ public function test_distributed_application_event_invalidation() {
'mode' => cache_store::MODE_APPLICATION,
'component' => 'phpunit',
'area' => 'eventinvalidationtest',
+ 'simplekeys' => true,
+ 'simpledata' => true,
));
$cache = cache::make('phpunit', 'eventinvalidationtest');
$this->assertEquals('test data 1', $cache->get('testkey1'));
@@ -597,6 +604,8 @@ public function test_distributed_application_event_invalidation() {
'mode' => cache_store::MODE_APPLICATION,
'component' => 'phpunit',
'area' => 'eventinvalidationtest',
+ 'simplekeys' => true,
+ 'simpledata' => true,
'invalidationevents' => array(
'crazyevent'
)
View
10 cache/tests/fixtures/lib.php
@@ -102,6 +102,16 @@ public function phpunit_add_definition_mapping($definition, $store, $sort) {
'sort' => (int)$sort
);
}
+
+ /**
+ * Overrides the default site identifier used by the Cache API so that we can be sure of what it is.
+ *
+ * @return string
+ */
+ public function get_site_identifier() {
+ global $CFG;
+ return $CFG->wwwroot.'phpunit';
+ }
}
/**
View
9 lib/db/upgrade.php
@@ -1524,5 +1524,14 @@ function xmldb_main_upgrade($oldversion) {
upgrade_main_savepoint(true, 2012120300.04);
}
+ if ($oldversion < 2012120301.09) {
+ // Add the site identifier to the cache config's file.
+ $siteidentifier = $DB->get_field('config', 'value', array('name' => 'siteidentifier'));
+ cache_helper::update_site_identifier($siteidentifier);
+
+ // Main savepoint reached.
+ upgrade_main_savepoint(true, 2012120301.09);
+ }
+
return true;
}
View
11 lib/upgradelib.php
@@ -1446,8 +1446,9 @@ function install_core($version, $verbose) {
print_upgrade_part_end(null, true, $verbose);
- // Reset the cache, this returns it to a normal operation state.
- cache_factory::reset();
+ // Purge all caches. They're disabled but this ensures that we don't have any persistent data just in case something
+ // during installation didn't use APIs.
+ cache_helper::purge_all();
} catch (exception $ex) {
upgrade_handle_exception($ex);
}
@@ -1534,8 +1535,8 @@ function upgrade_noncore($verbose) {
// upgrade all plugins types
try {
- // Disable the use of cache stores here. We will reset the factory after we've performed the installation.
- // This ensures that we don't permanently cache anything during installation.
+ // Disable the use of cache stores here.
+ // We don't reset this, the site can live without proper caching for life of this request.
cache_factory::disable_stores();
$plugintypes = get_plugin_types();
@@ -1544,8 +1545,6 @@ function upgrade_noncore($verbose) {
}
// Update cache definitions. Involves scanning each plugin for any changes.
cache_helper::update_definitions();
- // Reset the cache system to a normal state.
- cache_factory::reset();
} catch (Exception $ex) {
upgrade_handle_exception($ex);
}
View
2 version.php
@@ -30,7 +30,7 @@
defined('MOODLE_INTERNAL') || die();
-$version = 2012120301.08; // 20121203 = branching date YYYYMMDD - do not modify!
+$version = 2012120301.09; // 20121203 = branching date YYYYMMDD - do not modify!
// RR = release increments - 00 in DEV branches
// .XX = incremental changes

0 comments on commit a2b5f38

Please sign in to comment.
Something went wrong with that request. Please try again.