Merge "MessageCache: Use checkKeys for large messages"
authorjenkins-bot <jenkins-bot@gerrit.wikimedia.org>
Wed, 19 Oct 2016 04:37:13 +0000 (04:37 +0000)
committerGerrit Code Review <gerrit@wikimedia.org>
Wed, 19 Oct 2016 04:37:13 +0000 (04:37 +0000)
1  2 
includes/cache/MessageCache.php

@@@ -21,7 -21,6 +21,7 @@@
   * @ingroup Cache
   */
  use MediaWiki\MediaWikiServices;
 +use Wikimedia\ScopedCallback;
  
  /**
   * MediaWiki message cache structure version.
@@@ -228,14 -227,17 +228,14 @@@ class MessageCache 
         * or false if populating empty cache fails. Also returns true if MessageCache
         * is disabled.
         *
 -       * @param bool|string $code Language to which load messages
 -       * @param integer $mode Use MessageCache::FOR_UPDATE to skip process cache
 +       * @param string $code Language to which load messages
 +       * @param integer $mode Use MessageCache::FOR_UPDATE to skip process cache [optional]
         * @throws MWException
         * @return bool
         */
 -      function load( $code = false, $mode = null ) {
 +      protected function load( $code, $mode = null ) {
                if ( !is_string( $code ) ) {
 -                      # This isn't really nice, so at least make a note about it and try to
 -                      # fall back
 -                      wfDebug( __METHOD__ . " called without providing a language code\n" );
 -                      $code = 'en';
 +                      throw new InvalidArgumentException( "Missing language code" );
                }
  
                # Don't do double loading...
                                }
                                $alreadyTried[ $langcode ] = true;
                        }
 +              } else {
 +                      $uckey = null;
                }
  
                // Check the CDB cache
                                        continue;
                                }
  
 -                              $message = $this->getMsgFromNamespace( $this->getMessagePageName( $code, $uckey ), $code );
 +                              $message = $this->getMsgFromNamespace(
 +                                      $this->getMessagePageName( $code, $uckey ), $code );
  
                                if ( $message !== false ) {
                                        return $message;
                        return false;
                }
  
-               # Try the individual message cache
+               // Try the individual message cache
                $titleKey = wfMemcKey( 'messages', 'individual', $title );
-               $entry = $this->wanCache->get( $titleKey );
+               $curTTL = null;
+               $entry = $this->wanCache->get(
+                       $titleKey,
+                       $curTTL,
+                       [ wfMemcKey( 'messages', $code ) ]
+               );
+               $entry = ( $curTTL >= 0 ) ? $entry : false;
                if ( $entry ) {
                        if ( substr( $entry, 0, 1 ) === ' ' ) {
                                $this->mCache[$code][$title] = $entry;
-                               // The message exists, so make sure a string
-                               // is returned.
+                               // The message exists, so make sure a string is returned
                                return (string)substr( $entry, 1 );
                        } elseif ( $entry === '!NONEXISTENT' ) {
                                $this->mCache[$code][$title] = '!NONEXISTENT';
  
                                return false;
                        } else {
-                               # Corrupt/obsolete entry, delete it
+                               // Corrupt/obsolete entry, delete it
                                $this->wanCache->delete( $titleKey );
                        }
                }
  
-               # Try loading it from the database
-               $revision = Revision::newFromTitle( Title::makeTitle( NS_MEDIAWIKI, $title ) );
+               // Try loading it from the database
+               $dbr = wfGetDB( DB_REPLICA );
+               $cacheOpts = Database::getCacheSetOptions( $dbr );
+               // Use newKnownCurrent() to avoid querying revision/user tables
+               $titleObj = Title::makeTitle( NS_MEDIAWIKI, $title );
+               if ( $titleObj->getLatestRevID() ) {
+                       $revision = Revision::newKnownCurrent(
+                               $dbr,
+                               $titleObj->getArticleID(),
+                               $titleObj->getLatestRevID()
+                       );
+               } else {
+                       $revision = false;
+               }
                if ( $revision ) {
                        $content = $revision->getContent();
                        if ( !$content ) {
                                        $message = false; // negative caching
                                } else {
                                        $this->mCache[$code][$title] = ' ' . $message;
-                                       $this->wanCache->set( $titleKey, ' ' . $message, $this->mExpiry );
+                                       $this->wanCache->set( $titleKey, ' ' . $message, $this->mExpiry, $cacheOpts );
                                }
                        }
                } else {
  
                if ( $message === false ) { // negative caching
                        $this->mCache[$code][$title] = '!NONEXISTENT';
-                       $this->wanCache->set( $titleKey, '!NONEXISTENT', $this->mExpiry );
+                       $this->wanCache->set( $titleKey, '!NONEXISTENT', $this->mExpiry, $cacheOpts );
                }
  
                return $message;