From: jenkins-bot Date: Fri, 20 Oct 2017 17:18:39 +0000 (+0000) Subject: Merge "objectcache: Split off some code in WANObjectCache::getWithSetCallback" X-Git-Tag: 1.31.0-rc.0~1708 X-Git-Url: https://git.heureux-cyclage.org/?p=lhc%2Fweb%2Fwiklou.git;a=commitdiff_plain;h=1380b0dbeaa37aab3d46e44a77fe16034296a93d;hp=-c Merge "objectcache: Split off some code in WANObjectCache::getWithSetCallback" --- 1380b0dbeaa37aab3d46e44a77fe16034296a93d diff --combined includes/libs/objectcache/WANObjectCache.php index 8ad2b93d6d,a0652c6cdc..15e5759ce8 --- a/includes/libs/objectcache/WANObjectCache.php +++ b/includes/libs/objectcache/WANObjectCache.php @@@ -987,11 -987,8 +987,8 @@@ class WANObjectCache implements IExpiri // Use the INTERIM value for tombstoned keys to reduce regeneration load. // For hot keys, either another thread has the lock or the lock failed; // use the INTERIM value from the last thread that regenerated it. - $wrapped = $this->cache->get( self::INTERIM_KEY_PREFIX . $key ); - list( $value ) = $this->unwrap( $wrapped, microtime( true ) ); - if ( $value !== false && $this->isValid( $value, $versioned, $asOf, $minTime ) ) { - $asOf = $wrapped[self::FLD_TIME]; - + $value = $this->getInterimValue( $key, $versioned, $minTime, $asOf ); + if ( $value !== false ) { return $value; } // Use the busy fallback value if nothing else @@@ -1013,24 -1010,19 +1010,19 @@@ } finally { --$this->callbackDepth; } + $valueIsCacheable = ( $value !== false && $ttl >= 0 ); + // When delete() is called, writes are write-holed by the tombstone, // so use a special INTERIM key to pass the new value around threads. - if ( ( $isTombstone && $lockTSE > 0 ) && $value !== false && $ttl >= 0 ) { + if ( ( $isTombstone && $lockTSE > 0 ) && $valueIsCacheable ) { $tempTTL = max( 1, (int)$lockTSE ); // set() expects seconds $newAsOf = microtime( true ); $wrapped = $this->wrap( $value, $tempTTL, $newAsOf ); // Avoid using set() to avoid pointless mcrouter broadcasting - $this->cache->merge( - self::INTERIM_KEY_PREFIX . $key, - function () use ( $wrapped ) { - return $wrapped; - }, - $tempTTL, - 1 - ); + $this->setInterimValue( $key, $wrapped, $tempTTL ); } - if ( $value !== false && $ttl >= 0 ) { + if ( $valueIsCacheable ) { $setOpts['lockTSE'] = $lockTSE; // Use best known "since" timestamp if not provided $setOpts += [ 'since' => $preCallbackTime ]; @@@ -1046,6 -1038,41 +1038,41 @@@ return $value; } + /** + * @param string $key + * @param bool $versioned + * @param float $minTime + * @param mixed $asOf + * @return mixed + */ + protected function getInterimValue( $key, $versioned, $minTime, &$asOf ) { + $wrapped = $this->cache->get( self::INTERIM_KEY_PREFIX . $key ); + list( $value ) = $this->unwrap( $wrapped, microtime( true ) ); + if ( $value !== false && $this->isValid( $value, $versioned, $asOf, $minTime ) ) { + $asOf = $wrapped[self::FLD_TIME]; + + return $value; + } + + return false; + } + + /** + * @param string $key + * @param array $wrapped + * @param int $tempTTL + */ + protected function setInterimValue( $key, $wrapped, $tempTTL ) { + $this->cache->merge( + self::INTERIM_KEY_PREFIX . $key, + function () use ( $wrapped ) { + return $wrapped; + }, + $tempTTL, + 1 + ); + } + /** * Method to fetch multiple cache keys at once with regeneration * @@@ -1315,8 -1342,8 +1342,8 @@@ /** * @see BagOStuff::makeKey() - * @param string $keys,... Key component - * @return string + * @param string $keys,... Key component (starting with a key collection name) + * @return string Colon-delimited list of $keyspace followed by escaped components of $args * @since 1.27 */ public function makeKey() { @@@ -1325,8 -1352,8 +1352,8 @@@ /** * @see BagOStuff::makeGlobalKey() - * @param string $keys,... Key component - * @return string + * @param string $keys,... Key component (starting with a key collection name) + * @return string Colon-delimited list of $keyspace followed by escaped components of $args * @since 1.27 */ public function makeGlobalKey() {