Merge "MessageCache: Restore 'loadedLanguages' tracking for load()"
authorjenkins-bot <jenkins-bot@gerrit.wikimedia.org>
Mon, 29 Jul 2019 21:41:27 +0000 (21:41 +0000)
committerGerrit Code Review <gerrit@wikimedia.org>
Mon, 29 Jul 2019 21:41:27 +0000 (21:41 +0000)
includes/cache/MessageCache.php

index a8bcfc6..5745451 100644 (file)
@@ -98,6 +98,12 @@ class MessageCache {
        /** @var Language */
        protected $contLang;
 
+       /**
+        * Track which languages have been loaded by load().
+        * @var array
+        */
+       private $loadedLanguages = [];
+
        /**
         * Singleton instance
         *
@@ -264,23 +270,12 @@ class MessageCache {
                }
 
                # Don't do double loading...
-               if ( $this->cache->has( $code ) && $mode != self::FOR_UPDATE ) {
+               if ( isset( $this->loadedLanguages[$code] ) && $mode != self::FOR_UPDATE ) {
                        return true;
                }
 
                $this->overridable = array_flip( Language::getMessageKeysFor( $code ) );
 
-               // T208897 array_flip can fail and return null
-               if ( is_null( $this->overridable ) ) {
-                       LoggerFactory::getInstance( 'MessageCache' )->error(
-                               __METHOD__ . ': $this->overridable is null',
-                               [
-                                       'message_keys' => Language::getMessageKeysFor( $code ),
-                                       'code' => $code
-                               ]
-                       );
-               }
-
                # 8 lines of code just to say (once) that message cache is disabled
                if ( $this->mDisable ) {
                        static $shownDisabled = false;
@@ -396,6 +391,9 @@ class MessageCache {
                        wfDebugLog( 'MessageCacheError', __METHOD__ . ": Failed to load $code\n" );
                        # This used to throw an exception, but that led to nasty side effects like
                        # the whole wiki being instantly down if the memcached server died
+               } else {
+                       # All good, just record the success
+                       $this->loadedLanguages[$code] = true;
                }
 
                if ( !$this->cache->has( $code ) ) { // sanity
@@ -1300,6 +1298,7 @@ class MessageCache {
                        $this->wanCache->touchCheckKey( $this->getCheckKey( $code ) );
                }
                $this->cache->clear();
+               $this->loadedLanguages = [];
        }
 
        /**