From 2be38b3670431cb5339790ab02ba9f77e138faa0 Mon Sep 17 00:00:00 2001 From: Aaron Schulz Date: Fri, 13 May 2016 13:49:56 -0700 Subject: [PATCH] Make "presumed-fresh" edit stash case cover when users make intervening edits This still handles users editing inclusions themselves, but is more relaxed in terms of edits by other users to the inclusions. Bug: T134620 Change-Id: I6c0d189957481dfb6da0e73581b1d5b69fd3a352 --- includes/api/ApiStashEdit.php | 21 +++++++++++++++------ 1 file changed, 15 insertions(+), 6 deletions(-) diff --git a/includes/api/ApiStashEdit.php b/includes/api/ApiStashEdit.php index 5efefbd2a2..3539eed4f0 100644 --- a/includes/api/ApiStashEdit.php +++ b/includes/api/ApiStashEdit.php @@ -147,13 +147,15 @@ class ApiStashEdit extends ApiBase { Hooks::run( 'ParserOutputStashForEdit', [ $page, $content, $editInfo->output ] ); list( $stashInfo, $ttl ) = self::buildStashValue( - $editInfo->pstContent, $editInfo->output, $editInfo->timestamp + $editInfo->pstContent, + $editInfo->output, + $editInfo->timestamp, + $user ); if ( $stashInfo ) { $ok = $cache->set( $key, $stashInfo, $ttl ); if ( $ok ) { - $logger->debug( "Cached parser output for key '$key'." ); return self::ERROR_NONE; } else { @@ -223,7 +225,7 @@ class ApiStashEdit extends ApiBase { $pOut->setCacheTime( wfTimestampNow() ); // Build a value to cache with a proper TTL - list( $stashInfo, $ttl ) = self::buildStashValue( $pstContent, $pOut, $timestamp ); + list( $stashInfo, $ttl ) = self::buildStashValue( $pstContent, $pOut, $timestamp, $user ); if ( !$stashInfo ) { $logger->info( "Uncacheable parser output for key '$key' (rev/TTL)." ); return false; @@ -291,6 +293,10 @@ class ApiStashEdit extends ApiBase { $stats->increment( 'editstash.cache_hits.presumed_fresh' ); $logger->debug( "Timestamp-based cache hit for key '$key' (age: $age sec)." ); return $editInfo; // assume nothing changed + } elseif ( isset( $editInfo->edits ) && $editInfo->edits === $user->getEditCount() ) { + $stats->increment( 'editstash.cache_hits.presumed_fresh' ); + $logger->debug( "Edit count based cache hit for key '$key' (age: $age sec)." ); + return $editInfo; // use made no local upload/template edits in the meantime } $dbr = wfGetDB( DB_SLAVE ); @@ -385,12 +391,14 @@ class ApiStashEdit extends ApiBase { * @param Content $pstContent * @param ParserOutput $parserOutput * @param string $timestamp TS_MW + * @param User $user * @return array (stash info array, TTL in seconds) or (null, 0) */ protected static function buildStashValue( - Content $pstContent, ParserOutput $parserOutput, $timestamp + Content $pstContent, ParserOutput $parserOutput, $timestamp, User $user ) { - // If an item is renewed, mind the cache TTL determined by config and parser functions + // If an item is renewed, mind the cache TTL determined by config and parser functions. + // Put an upper limit on the TTL for sanity to avoid extreme template/file staleness. $since = time() - wfTimestamp( TS_UNIX, $parserOutput->getTimestamp() ); $ttl = min( $parserOutput->getCacheExpiry() - $since, 5 * 60 ); @@ -399,7 +407,8 @@ class ApiStashEdit extends ApiBase { $stashInfo = (object)[ 'pstContent' => $pstContent, 'output' => $parserOutput, - 'timestamp' => $timestamp + 'timestamp' => $timestamp, + 'edits' => $user->getEditCount() ]; return [ $stashInfo, $ttl ]; } -- 2.20.1