Permalink
Browse files

MDL-38387 cache: fixed inifinite initialisation loop with site id

  • Loading branch information...
1 parent 8673a98 commit 17200a016dba8479476a3819b5646855014b8d75 Sam Hemelryk committed with nebgor Mar 8, 2013
Showing with 26 additions and 3 deletions.
  1. +24 −3 cache/classes/helper.php
  2. +2 −0 cache/locallib.php
View
27 cache/classes/helper.php
@@ -511,6 +511,7 @@ public static function update_definitions($coreonly = false) {
* Update the site identifier stored by the cache API.
*
* @param string $siteidentifier
+ * @return string The new site identifier.
*/
public static function update_site_identifier($siteidentifier) {
global $CFG;
@@ -519,9 +520,10 @@ public static function update_site_identifier($siteidentifier) {
$factory = cache_factory::instance();
$factory->updating_started();
$config = $factory->create_config_instance(true);
- $config->update_site_identifier($siteidentifier);
+ $siteidentifier = $config->update_site_identifier($siteidentifier);
$factory->updating_finished();
cache_factory::reset();
+ return $siteidentifier;
}
/**
@@ -530,11 +532,30 @@ public static function update_site_identifier($siteidentifier) {
* @return string
*/
public static function get_site_identifier() {
- if (is_null(self::$siteidentifier)) {
- $factory = cache_factory::instance();
+ global $CFG;
+ if (!is_null(self::$siteidentifier)) {
+ return self::$siteidentifier;
+ }
+ // If site identifier hasn't been collected yet attempt to get it from the cache config.
+ $factory = cache_factory::instance();
+ // If the factory is initialising then we don't want to try to get it from the config or we risk
+ // causing the cache to enter an infinite initialisation loop.
+ if (!$factory->is_initialising()) {
$config = $factory->create_config_instance();
self::$siteidentifier = $config->get_site_identifier();
}
+ if (is_null(self::$siteidentifier)) {
+ // If the site identifier is still null then config isn't aware of it yet.
+ // We'll see if the CFG is loaded, and if not we will just use unknown.
+ // It's very important here that we don't use get_config. We don't want an endless cache loop!
+ if (isset($CFG->siteidentifier)) {
+ self::$siteidentifier = self::update_site_identifier($CFG->siteidentifier);
+ } else {
+ // It's not being recorded in MUC's config and the config data hasn't been loaded yet.
+ // Likely we are initialising.
+ return 'unknown';
+ }
+ }
return self::$siteidentifier;
}
View
2 cache/locallib.php
@@ -529,10 +529,12 @@ public function set_definition_mappings($definition, $mappings) {
* Update the site identifier stored by the cache API.
*
* @param string $siteidentifier
+ * @return string The new site identifier.
*/
public function update_site_identifier($siteidentifier) {
$this->siteidentifier = md5((string)$siteidentifier);
$this->config_save();
+ return $this->siteidentifier;
}
}

0 comments on commit 17200a0

Please sign in to comment.