Aaron Schulz has uploaded a new change for review. ( 
https://gerrit.wikimedia.org/r/394525 )

Change subject: objectcache: add example use case to 
WANObjectCache::getMultiCheckKeyTime()
......................................................................

objectcache: add example use case to WANObjectCache::getMultiCheckKeyTime()

Change-Id: I874070d2f770be7f9e06c381b2413f6e133418b8
---
M includes/libs/objectcache/WANObjectCache.php
1 file changed, 45 insertions(+), 0 deletions(-)


  git pull ssh://gerrit.wikimedia.org:29418/mediawiki/core 
refs/changes/25/394525/1

diff --git a/includes/libs/objectcache/WANObjectCache.php 
b/includes/libs/objectcache/WANObjectCache.php
index 0bdfed3..f157cc9 100644
--- a/includes/libs/objectcache/WANObjectCache.php
+++ b/includes/libs/objectcache/WANObjectCache.php
@@ -598,7 +598,52 @@
         * This works like getCheckKeyTime() except it takes a list of keys
         * and returns a list of timestamps instead of just that of one key
         *
+        * This might be useful when an entity depends on hundreds of other 
other entities,
+        * which themselves are used by millions of entities. The later can use 
"check" keys
+        * to invalidate their many dependee entities. However, it might be too 
expensive for the
+        * former to fetch all the "check" keys of the entities it depends on 
within every single
+        * getWithSetCallback() call. In this case the "check" keys can be 
fetched and compared to
+        * only after a "time-till-verify" has passed. The verifications are 
middle ground between
+        * a blind cache use and a full value computation.
+        *
+        * Example usage:
+        * @code
+        *     $value = $cache->getWithSetCallback(
+        *         $cache->makeGlobalKey( 'wikibase-item', $id ),
+        *         self::INITIAL_TTV, // initial time-till-verify
+        *         function ( $oldValue, &$ttv, &$setOpts, $oldAsOf ) use ( 
$checkKeys, $cache ) {
+        *             $now = microtime( true );
+        *             // Use $oldValue if it passes max ultimate age and 
"check" key comparisons
+        *             if ( $oldValue &&
+        *                 $oldAsOf > max( $cache->getCheckKeyTimeMulti( 
$checkKeys ) ) &&
+        *                 ( $now - $oldValue['ctime'] ) <= self::MAX_CACHE_AGE
+        *             ) {
+        *                 // Increase time-till-verify by 50% of last time to 
reduce overhead
+        *                 $ttv = $cache->adaptiveTTL( $oldAsOf, self::MAX_TTV, 
self::MIN_TTV, 1.5 );
+        *                 // Unlike $oldAsOf, "ctime" is the ultimate age of 
the cached data
+        *                 return $oldValue;
+        *             }
+        *
+        *             $mtimes = []; // mtimes of dependencies; passed by 
reference
+        *             $value = [ 'data' => $this->computeValue( $mtimes ), 
'ctime' => $now ];
+        *             // Guess time-till-change among the dependencies, e.g. 
1/(total change rate)
+        *             $ttc = 1 / array_sum( array_map(
+        *                 function ( $mtime ) use ( $now ) {
+        *                     return 1 / ( $mtime ? ( $now - $mtime ) : 900 );
+        *                 },
+        *                 $mtimes
+        *             ) );
+        *             // The time-to-verify should not be overly pessimistic 
nor optimistic
+        *             $ttv = min( max( $ttc, self::MIN_TTV ), self::MAX_TTV );
+        *
+        *             return $value;
+        *         },
+        *         [ 'staleTTL' => $cache::TTL_DAY ] // keep around to verify 
and re-save
+        *     );
+        * @endcode
+        *
         * @see WANObjectCache::getCheckKeyTime()
+        * @see WANObjectCache::getWithSetCallback()
         *
         * @param array $keys
         * @return float[] Map of (key => UNIX timestamps)

-- 
To view, visit https://gerrit.wikimedia.org/r/394525
To unsubscribe, visit https://gerrit.wikimedia.org/r/settings

Gerrit-MessageType: newchange
Gerrit-Change-Id: I874070d2f770be7f9e06c381b2413f6e133418b8
Gerrit-PatchSet: 1
Gerrit-Project: mediawiki/core
Gerrit-Branch: master
Gerrit-Owner: Aaron Schulz <asch...@wikimedia.org>

_______________________________________________
MediaWiki-commits mailing list
MediaWiki-commits@lists.wikimedia.org
https://lists.wikimedia.org/mailman/listinfo/mediawiki-commits

Reply via email to