X-Git-Url: http://git.cyclocoop.org/?a=blobdiff_plain;f=includes%2FStorage%2FSqlBlobStore.php;h=d7216c5c7209c91d21e63a435fb39606b023ab1e;hb=36eed95b9a198e867e092cd21617d66c9c18bae9;hp=fb3ef944994cd89a03fdf8d4fec1eb833b3dff25;hpb=f25d33057d248af1782be63714add0d2e9a421d2;p=lhc%2Fweb%2Fwiklou.git diff --git a/includes/Storage/SqlBlobStore.php b/includes/Storage/SqlBlobStore.php index fb3ef94499..d7216c5c72 100644 --- a/includes/Storage/SqlBlobStore.php +++ b/includes/Storage/SqlBlobStore.php @@ -94,7 +94,12 @@ class SqlBlobStore implements IDBAccessObject, BlobStore { /** * @param LoadBalancer $dbLoadBalancer A load balancer for acquiring database connections - * @param WANObjectCache $cache A cache manager for caching blobs + * @param WANObjectCache $cache A cache manager for caching blobs. This can be the local + * wiki's default instance even if $wikiId refers to a different wiki, since + * makeGlobalKey() is used to constructed a key that allows cached blobs from the + * same database to be re-used between wikis. For example, enwiki and frwiki will + * use the same cache keys for blobs from the wikidatawiki database, regardless of + * the cache's default key space. * @param bool|string $wikiId The ID of the target wiki database. Use false for the local wiki. */ public function __construct( @@ -267,8 +272,7 @@ class SqlBlobStore implements IDBAccessObject, BlobStore { // No negative caching; negative hits on text rows may be due to corrupted replica DBs $blob = $this->cache->getWithSetCallback( - // TODO: change key, since this is not necessarily revision text! - $this->cache->makeKey( 'revisiontext', 'textid', $blobAddress ), + $this->getCacheKey( $blobAddress ), $this->getCacheTTL(), function ( $unused, &$ttl, &$setOpts ) use ( $blobAddress, $queryFlags ) { list( $index ) = DBAccessObjectUtils::getDBOptions( $queryFlags ); @@ -356,6 +360,25 @@ class SqlBlobStore implements IDBAccessObject, BlobStore { return $blob; } + /** + * Get a cache key for a given Blob address. + * + * The cache key is constructed in a way that allows cached blobs from the same database + * to be re-used between wikis. For example, enwiki and frwiki will use the same cache keys + * for blobs from the wikidatawiki database. + * + * @param string $blobAddress + * @return string + */ + private function getCacheKey( $blobAddress ) { + return $this->cache->makeGlobalKey( + 'BlobStore', + 'address', + $this->dbLoadBalancer->resolveDomainID( $this->wikiId ), + $blobAddress + ); + } + /** * Expand a raw data blob according to the flags given. * @@ -370,7 +393,8 @@ class SqlBlobStore implements IDBAccessObject, BlobStore { * @param string|string[] $flags Blob flags, such as 'external' or 'gzip'. * Note that not including 'utf-8' in $flags will cause the data to be decoded * according to the legacy encoding specified via setLegacyEncoding. - * @param string|null $cacheKey May be used for caching if given + * @param string|null $cacheKey A blob address for use in the cache key. If not given, + * caching is disabled. * * @return false|string The expanded blob or false on failure */ @@ -387,13 +411,10 @@ class SqlBlobStore implements IDBAccessObject, BlobStore { return false; } - if ( $cacheKey && $this->wikiId === false ) { - // Make use of the wiki-local revision text cache. + if ( $cacheKey ) { // The cached value should be decompressed, so handle that and return here. - // NOTE: we rely on $this->cache being the right cache for $this->wikiId! return $this->cache->getWithSetCallback( - // TODO: change key, since this is not necessarily revision text! - $this->cache->makeKey( 'revisiontext', 'textid', $cacheKey ), + $this->getCacheKey( $cacheKey ), $this->getCacheTTL(), function () use ( $url, $flags ) { // No negative caching per BlobStore::getBlob()