From 48cffdff8219630b19860dc81cd106a76eecf5fb Mon Sep 17 00:00:00 2001 From: Aaron Schulz Date: Mon, 27 Apr 2015 14:13:02 -0700 Subject: [PATCH] Converted FileBackendStore to using the WAN cache Bug: T93141 Change-Id: I76efb0dc45a697c5fdfc50932e1198a6d663a445 --- includes/filebackend/FileBackendGroup.php | 2 ++ includes/filebackend/FileBackendStore.php | 28 ++++++-------------- includes/filebackend/SwiftFileBackend.php | 4 ++- includes/libs/objectcache/WANObjectCache.php | 11 ++++++++ 4 files changed, 24 insertions(+), 21 deletions(-) diff --git a/includes/filebackend/FileBackendGroup.php b/includes/filebackend/FileBackendGroup.php index 1b88db7ec0..9bb1582568 100644 --- a/includes/filebackend/FileBackendGroup.php +++ b/includes/filebackend/FileBackendGroup.php @@ -160,6 +160,8 @@ class FileBackendGroup { $config['fileJournal'] = isset( $config['fileJournal'] ) ? FileJournal::factory( $config['fileJournal'], $name ) : FileJournal::factory( array( 'class' => 'NullFileJournal' ), $name ); + $config['wanCache'] = ObjectCache::getMainWANInstance(); + $this->backends[$name]['instance'] = new $class( $config ); } diff --git a/includes/filebackend/FileBackendStore.php b/includes/filebackend/FileBackendStore.php index 25e87d435c..9f147f0efd 100644 --- a/includes/filebackend/FileBackendStore.php +++ b/includes/filebackend/FileBackendStore.php @@ -36,7 +36,7 @@ * @since 1.19 */ abstract class FileBackendStore extends FileBackend { - /** @var BagOStuff */ + /** @var WANObjectCache */ protected $memCache; /** @var ProcessCacheLRU Map of paths to small (RAM/disk) cache items */ protected $cheapCache; @@ -58,6 +58,7 @@ abstract class FileBackendStore extends FileBackend { /** * @see FileBackend::__construct() * Additional $config params include: + * - wanCache : WANOBjectCache object to use for persistent caching. * - mimeCallback : Callback that takes (storage path, content, file system path) and * returns the MIME type of the file or 'unknown/unknown'. The file * system path parameter should be used if the content one is null. @@ -72,7 +73,7 @@ abstract class FileBackendStore extends FileBackend { // @todo handle the case of extension-less files using the contents return StreamFile::contentTypeFromPath( $storagePath ) ?: 'unknown/unknown'; }; - $this->memCache = new EmptyBagOStuff(); // disabled by default + $this->memCache = WANObjectCache::newEmpty(); // disabled by default $this->cheapCache = new ProcessCacheLRU( self::CACHE_CHEAP_SIZE ); $this->expensiveCache = new ProcessCacheLRU( self::CACHE_EXPENSIVE_SIZE ); } @@ -1592,7 +1593,7 @@ abstract class FileBackendStore extends FileBackend { * @param array $val Information to cache */ final protected function setContainerCache( $container, array $val ) { - $this->memCache->add( $this->containerCacheKey( $container ), $val, 14 * 86400 ); + $this->memCache->set( $this->containerCacheKey( $container ), $val, 14 * 86400 ); } /** @@ -1602,7 +1603,7 @@ abstract class FileBackendStore extends FileBackend { * @param string $container Resolved container name */ final protected function deleteContainerCache( $container ) { - if ( !$this->memCache->set( $this->containerCacheKey( $container ), 'PURGED', 300 ) ) { + if ( !$this->memCache->delete( $this->containerCacheKey( $container ), 300 ) ) { trigger_error( "Unable to delete stat cache for container $container." ); } } @@ -1682,21 +1683,8 @@ abstract class FileBackendStore extends FileBackend { $age = time() - wfTimestamp( TS_UNIX, $val['mtime'] ); $ttl = min( 7 * 86400, max( 300, floor( .1 * $age ) ) ); $key = $this->fileCacheKey( $path ); - // Set the cache unless it is currently salted with the value "PURGED". - // Using add() handles this except it also is a no-op in that case where - // the current value is not "latest" but $val is, so use CAS in that case. - if ( !$this->memCache->add( $key, $val, $ttl ) && !empty( $val['latest'] ) ) { - $this->memCache->merge( - $key, - function ( BagOStuff $cache, $key, $cValue ) use ( $val ) { - return ( is_array( $cValue ) && empty( $cValue['latest'] ) ) - ? $val // update the stat cache with the lastest info - : false; // do nothing (cache is salted or some error happened) - }, - $ttl, - 1 - ); - } + // Set the cache unless it is currently salted. + $this->memCache->set( $key, $val, $ttl ); } /** @@ -1712,7 +1700,7 @@ abstract class FileBackendStore extends FileBackend { if ( $path === null ) { return; // invalid storage path } - if ( !$this->memCache->set( $this->fileCacheKey( $path ), 'PURGED', 300 ) ) { + if ( !$this->memCache->delete( $this->fileCacheKey( $path ), 300 ) ) { trigger_error( "Unable to delete stat cache for file $path." ); } } diff --git a/includes/filebackend/SwiftFileBackend.php b/includes/filebackend/SwiftFileBackend.php index 5f406c9be0..42f401428b 100644 --- a/includes/filebackend/SwiftFileBackend.php +++ b/includes/filebackend/SwiftFileBackend.php @@ -128,7 +128,9 @@ class SwiftFileBackend extends FileBackendStore { // HTTP helper client $this->http = new MultiHttpClient( array() ); // Cache container information to mask latency - $this->memCache = wfGetMainCache(); + if ( isset( $config['wanCache'] ) && $config['wanCache'] instanceof WANObjectCache ) { + $this->memCache = $config['wanCache']; + } // Process cache for container info $this->containerStatCache = new ProcessCacheLRU( 300 ); // Cache auth token information to avoid RTTs diff --git a/includes/libs/objectcache/WANObjectCache.php b/includes/libs/objectcache/WANObjectCache.php index be62d1a306..3393865ed2 100755 --- a/includes/libs/objectcache/WANObjectCache.php +++ b/includes/libs/objectcache/WANObjectCache.php @@ -108,6 +108,17 @@ class WANObjectCache { $this->relayer = $params['relayer']; } + /** + * @return WANObjectCache Cache that wraps EmptyBagOStuff + */ + public static function newEmpty() { + return new self( array( + 'cache' => new EmptyBagOStuff(), + 'pool' => 'empty', + 'relayer' => new EventRelayerNull( array() ) + ) ); + } + /** * Fetch the value of a key from cache * -- 2.20.1