Merge "objectcache: Split off some code in WANObjectCache::getWithSetCallback"
authorjenkins-bot <jenkins-bot@gerrit.wikimedia.org>
Fri, 20 Oct 2017 17:18:39 +0000 (17:18 +0000)
committerGerrit Code Review <gerrit@wikimedia.org>
Fri, 20 Oct 2017 17:18:39 +0000 (17:18 +0000)
1  2 
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
                } 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 ];
                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
         *
  
        /**
         * @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() {
  
        /**
         * @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() {