From 3816a80a2c61cd07ed29f28b3256730e2f1f87b0 Mon Sep 17 00:00:00 2001 From: Andrew Green Date: Mon, 17 Oct 2016 11:37:36 -0500 Subject: [PATCH] MessageCache: Use checkKeys for large messages Also make use of the cache set options and use Revision::newKnownCurrent() to avoid excessive revision table queries during miss periods. Bug: T144952 Change-Id: Ic1c649478b0f87420052d8c99b2962920f8b5c96 --- includes/cache/MessageCache.php | 39 ++++++++++++++++++++++++--------- 1 file changed, 29 insertions(+), 10 deletions(-) diff --git a/includes/cache/MessageCache.php b/includes/cache/MessageCache.php index 6834ac0981..ca6e28dcf1 100644 --- a/includes/cache/MessageCache.php +++ b/includes/cache/MessageCache.php @@ -946,28 +946,47 @@ class MessageCache { 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 ) { @@ -994,7 +1013,7 @@ class MessageCache { $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 { @@ -1003,7 +1022,7 @@ class MessageCache { 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; -- 2.20.1