Merge branch 'MDL-52346' of git://github.com/mr-russ/moodle
authorAndrew Nicols <andrew@nicols.co.uk>
Mon, 29 Feb 2016 06:12:03 +0000 (14:12 +0800)
committerAndrew Nicols <andrew@nicols.co.uk>
Mon, 29 Feb 2016 06:12:03 +0000 (14:12 +0800)
1  2 
cache/classes/definition.php
lang/en/cache.php
lib/db/caches.php

@@@ -100,6 -100,11 +100,11 @@@ defined('MOODLE_INTERNAL') || die()
   *     + defaultsharing
   *          [int] The default sharing option to use. It's highly recommended that you don't set this unless there is a very
   *          specific reason not to use the system default.
+  *     + canuselocalstore
+  *          [bool] The cache is able to safely run with multiple copies on different webservers without any need for administrator
+  *                 intervention to ensure that data stays in sync across nodes.  This is usually managed by a revision
+  *                 system as seen in modinfo cache or language cache.  Requiring purge on upgrade is not sufficient as
+  *                 it requires administrator intervention on each node to make it work.
   *
   * For examples take a look at lib/db/caches.php
   *
@@@ -308,6 -313,11 +313,11 @@@ class cache_definition 
       */
      protected $sharingoptions;
  
+     /**
+      * Whether this cache supports local storages.
+      * @var bool
+      */
+     protected $canuselocalstore = false;
      /**
       * The selected sharing option.
       * @var int One of self::SHARING_*
          $sharingoptions = self::SHARING_DEFAULT;
          $selectedsharingoption = self::SHARING_DEFAULT;
          $userinputsharingkey = '';
+         $canuselocalstore = false;
  
          if (array_key_exists('simplekeys', $definition)) {
              $simplekeys = (bool)$definition['simplekeys'];
                  $selectedsharingoption = self::SHARING_ALL;
              }
          }
+         if (array_key_exists('canuselocalstore', $definition)) {
+             $canuselocalstore = (bool)$definition['canuselocalstore'];
+         }
  
          if (array_key_exists('userinputsharingkey', $definition) && !empty($definition['userinputsharingkey'])) {
              $userinputsharingkey = (string)$definition['userinputsharingkey'];
          $cachedefinition->sharingoptions = $sharingoptions;
          $cachedefinition->selectedsharingoption = $selectedsharingoption;
          $cachedefinition->userinputsharingkey = $userinputsharingkey;
+         $cachedefinition->canuselocalstore = $canuselocalstore;
  
          return $cachedefinition;
      }
          return $this->requirelockingwrite;
      }
  
+     /**
+      * Returns true if this definition allows local storage to be used for caching.
+      * @since Moodle 3.1.0
+      * @return bool
+      */
+     public function can_use_localstore() {
+         return $this->canuselocalstore;
+     }
      /**
       * Returns true if this definition requires a searchable cache.
       * @since Moodle 2.4.4
       * Sets the identifiers for this definition, or updates them if they have already been set.
       *
       * @param array $identifiers
 +     * @return bool false if no identifiers where changed, true otherwise.
       * @throws coding_exception
       */
      public function set_identifiers(array $identifiers = array()) {
          // If we are setting the exact same identifiers then just return as nothing really changed.
          // We don't care about order as cache::make will use the same definition order all the time.
          if ($identifiers === $this->identifiers) {
 -            return;
 +            return false;
          }
  
          foreach ($this->requireidentifiers as $identifier) {
          // Reset the key prefix's they need updating now.
          $this->keyprefixsingle = null;
          $this->keyprefixmulti = null;
 +
 +        return true;
      }
  
      /**
diff --combined lang/en/cache.php
@@@ -59,7 -59,6 +59,7 @@@ $string['cachedef_plugin_functions'] = 
  $string['cachedef_plugin_manager'] = 'Plugin info manager';
  $string['cachedef_questiondata'] = 'Question definitions';
  $string['cachedef_repositories'] = 'Repositories instances data';
 +$string['cachedef_search_results'] = 'Search results user data';
  $string['cachedef_string'] = 'Language string cache';
  $string['cachedef_tags'] = 'Tags collections and areas';
  $string['cachedef_userselections'] = 'Data used to persist user selections throughout Moodle';
@@@ -102,6 -101,7 +102,7 @@@ $string['inadequatestoreformapping'] = 
  $string['invalidlock'] = 'Invalid lock';
  $string['invalidplugin'] = 'Invalid plugin';
  $string['invalidstore'] = 'Invalid cache store provided';
+ $string['localstorenotification'] = 'This cache can be safely mapped to a store that is local to each webserver';
  $string['lockdefault'] = 'Default';
  $string['locking'] = 'Locking';
  $string['locking_help'] = 'Locking is a mechanism that restricts access to cached data to one process at a time to prevent the data from being overwritten. The locking method determines how the lock is acquired and checked.';
@@@ -131,6 -131,7 +132,7 @@@ $string['requestcount'] = 'Test with {$
  $string['rescandefinitions'] = 'Rescan definitions';
  $string['result'] = 'Result';
  $string['set'] = 'Set';
+ $string['sharedstorenotification'] = 'This cache must be mapped to a store that is shared to all webservers';
  $string['sharing'] = 'Sharing';
  $string['sharing_all'] = 'Everyone.';
  $string['sharing_input'] = 'Custom key (entered below)';
diff --combined lib/db/caches.php
@@@ -31,22 -31,22 +31,22 @@@ $definitions = array
      // Used to store processed lang files.
      // The keys used are the revision, lang and component of the string file.
      // The static acceleration size has been based upon student access of the site.
-     // NOTE: this data may be safely stored in local caches on cluster nodes.
      'string' => array(
          'mode' => cache_store::MODE_APPLICATION,
          'simplekeys' => true,
          'simpledata' => true,
          'staticacceleration' => true,
-         'staticaccelerationsize' => 30
+         'staticaccelerationsize' => 30,
+         'canuselocalstore' => true
      ),
  
      // Used to store cache of all available translations.
-     // NOTE: this data may be safely stored in local caches on cluster nodes.
      'langmenu' => array(
          'mode' => cache_store::MODE_APPLICATION,
          'simplekeys' => true,
          'simpledata' => true,
          'staticacceleration' => true,
+         'canuselocalstore' => true
      ),
  
      // Used to store database meta information.
@@@ -91,9 -91,9 +91,9 @@@
      // This caches the html purifier cleaned text. This is done because the text is usually cleaned once for every user
      // and context combo. Text caching handles caching for the combination, this cache is responsible for caching the
      // cleaned text which is shareable.
-     // NOTE: this data may be safely stored in local caches on cluster nodes.
      'htmlpurifier' => array(
          'mode' => cache_store::MODE_APPLICATION,
+         'canuselocalstore' => true
      ),
  
      // Used to store data from the config + config_plugins table in the database.
      'coursemodinfo' => array(
          'mode' => cache_store::MODE_APPLICATION,
          'simplekeys' => true,
+         'canuselocalstore' => true
      ),
      // This is the session user selections cache.
      // It's a special cache that is used to record user selections that should persist for the lifetime of the session.
      'tags' => array(
          'mode' => cache_store::MODE_REQUEST,
          'simplekeys' => true,
 -    )
 +    ),
 +
 +    // Caches search results.
 +    'search_results' => array(
 +        'mode' => cache_store::MODE_SESSION,
 +        'simplekeys' => true,
 +        'staticacceleration' => true,
 +        'staticaccelerationsize' => 3
 +    ),
  
  );