resourceloader: Make MessageBlobStore global check key actually global
authorTimo Tijhof <krinklemail@gmail.com>
Mon, 20 May 2019 23:02:47 +0000 (00:02 +0100)
committerKrinkle <krinklemail@gmail.com>
Wed, 22 May 2019 18:08:23 +0000 (18:08 +0000)
Because it was still per-wiki, which isn't useful and makes
it really slow to invalidate by requiring a 900-wiki iteration
during deployments all of which fully initialise MW just to
send a single Memcached command basically.

Bug: T222539
Change-Id: I02a3e7d83172ccd7d8d0fba3be1e3f1ebb77efb2

includes/resourceloader/MessageBlobStore.php

index 635e433..74d0616 100644 (file)
@@ -96,7 +96,7 @@ class MessageBlobStore implements LoggerAwareInterface {
                $cache = $this->wanCache;
                $checkKeys = [
                        // Global check key, see clear()
-                       $cache->makeKey( __CLASS__ )
+                       $cache->makeGlobalKey( __CLASS__ )
                ];
                $cacheKeys = [];
                foreach ( $modules as $name => $module ) {
@@ -173,9 +173,14 @@ class MessageBlobStore implements LoggerAwareInterface {
         */
        public function clear() {
                $cache = $this->wanCache;
-               // Disable holdoff because this invalidates all modules and also not needed since
-               // LocalisationCache is stored outside the database and doesn't have lag.
-               $cache->touchCheckKey( $cache->makeKey( __CLASS__ ), $cache::HOLDOFF_NONE );
+               // Disable hold-off because:
+               // - LocalisationCache is populated by messages on-disk and don't have DB lag,
+               //   thus there is no need for hold off. We only clear it after new localisation
+               //   updates are known to be deployed to all servers.
+               // - This global check key invalidates message blobs for all modules for all wikis
+               //   in cache contexts (e.g. languages, skins). Setting a hold-off on this key could
+               //   cause a cache stampede since no values would be stored for several seconds.
+               $cache->touchCheckKey( $cache->makeGlobalKey( __CLASS__ ), $cache::HOLDOFF_NONE );
        }
 
        /**