Migrate feeds from $messageMemc to the WAN cache

This makes the delete() calls work properly for all DCs.
Also, using the message cache was fairly bizzare.

Change-Id: Idec7fa47811e982ba89bb8fbbd9565a26585e77f
This commit is contained in:
Aaron Schulz 2015-11-09 22:48:36 -08:00
parent da4a378e74
commit 3517be1cf0
2 changed files with 18 additions and 16 deletions

View file

@ -30,18 +30,19 @@ class FeedUtils {
/**
* Check whether feed's cache should be cleared; for changes feeds
* If the feed should be purged; $timekey and $key will be removed from
* $messageMemc
* If the feed should be purged; $timekey and $key will be removed from cache
*
* @param string $timekey Cache key of the timestamp of the last item
* @param string $key Cache key of feed's content
*/
public static function checkPurge( $timekey, $key ) {
global $wgRequest, $wgUser, $messageMemc;
global $wgRequest, $wgUser;
$purge = $wgRequest->getVal( 'action' ) === 'purge';
if ( $purge && $wgUser->isAllowed( 'purge' ) ) {
$messageMemc->delete( $timekey );
$messageMemc->delete( $key );
$cache = ObjectCache::getMainWANInstance();
$cache->delete( $timekey, 1 );
$cache->delete( $key, 1 );
}
}

View file

@ -83,7 +83,8 @@ class ChangesFeed {
}
$optionsHash = md5( serialize( $opts->getAllValues() ) ) . $wgRenderHashAppend;
$timekey = wfMemcKey( $this->type, $this->format, $wgLang->getCode(), $optionsHash, 'timestamp' );
$timekey = wfMemcKey(
$this->type, $this->format, $wgLang->getCode(), $optionsHash, 'timestamp' );
$key = wfMemcKey( $this->type, $this->format, $wgLang->getCode(), $optionsHash );
FeedUtils::checkPurge( $timekey, $key );
@ -110,21 +111,20 @@ class ChangesFeed {
}
/**
* Save to feed result to $messageMemc
* Save to feed result to cache
*
* @param string $feed Feed's content
* @param string $timekey Memcached key of the last modification
* @param string $key Memcached key of the content
*/
public function saveToCache( $feed, $timekey, $key ) {
global $messageMemc;
$expire = 3600 * 24; # One day
$messageMemc->set( $key, $feed, $expire );
$messageMemc->set( $timekey, wfTimestamp( TS_MW ), $expire );
$cache = ObjectCache::getMainWANInstance();
$cache->set( $key, $feed, $cache::TTL_DAY );
$cache->set( $timekey, wfTimestamp( TS_MW ), $cache::TTL_DAY );
}
/**
* Try to load the feed result from $messageMemc
* Try to load the feed result from cache
*
* @param int $lastmod Timestamp of the last item in the recentchanges table
* @param string $timekey Memcached key of the last modification
@ -132,9 +132,10 @@ class ChangesFeed {
* @return string|bool Feed's content on cache hit or false on cache miss
*/
public function loadFromCache( $lastmod, $timekey, $key ) {
global $wgFeedCacheTimeout, $wgOut, $messageMemc;
global $wgFeedCacheTimeout, $wgOut;
$feedLastmod = $messageMemc->get( $timekey );
$cache = ObjectCache::getMainWANInstance();
$feedLastmod = $cache->get( $timekey );
if ( ( $wgFeedCacheTimeout > 0 ) && $feedLastmod ) {
/**
@ -153,7 +154,7 @@ class ChangesFeed {
if ( $feedLastmodUnix < $lastmodUnix ) {
$wgOut->setLastModified( $feedLastmod ); // bug 21916
}
return $messageMemc->get( $key );
return $cache->get( $key );
} else {
wfDebug( "RC: cached feed timestamp check failed ($feedLastmod; $lastmod)\n" );
}
@ -164,7 +165,7 @@ class ChangesFeed {
/**
* Generate the feed items given a row from the database, printing the feed.
* @param object $rows DatabaseBase resource with recentchanges rows
* @param Feed $feed
* @param ChannelFeed $feed
*/
public static function generateFeed( $rows, &$feed ) {
$items = self::buildItems( $rows );