From: Aaron Schulz Date: Wed, 13 Apr 2016 17:54:28 +0000 (-0700) Subject: Allow description text caching for ForeignDBFile X-Git-Tag: 1.31.0-rc.0~7294 X-Git-Url: http://git.cyclocoop.org/ecrire?a=commitdiff_plain;h=04103860a2baaf847ad017d1bb91edd4a0ad00ba;p=lhc%2Fweb%2Fwiklou.git Allow description text caching for ForeignDBFile A large amount of real time is spent in fetching Commons descriptions pages from wikipedias, according to xenon flame graphs. Change-Id: I3935bf8bf23da58b734f897d7a1979e9b2f7e5c8 --- diff --git a/includes/filerepo/file/ForeignDBFile.php b/includes/filerepo/file/ForeignDBFile.php index f38248b52b..cf0045e43f 100644 --- a/includes/filerepo/file/ForeignDBFile.php +++ b/includes/filerepo/file/ForeignDBFile.php @@ -124,8 +124,51 @@ class ForeignDBFile extends LocalFile { * @return string */ function getDescriptionText( $lang = false ) { - // Restore remote behavior - return File::getDescriptionText( $lang ); + global $wgLang; + + if ( !$this->repo->fetchDescription ) { + return false; + } + + $lang = $lang ?: $wgLang; + $renderUrl = $this->repo->getDescriptionRenderUrl( $this->getName(), $lang->getCode() ); + if ( !$renderUrl ) { + return false; + } + + $touched = $this->repo->getSlaveDB()->selectField( + 'page', + 'page_touched', + [ + 'page_namespace' => NS_FILE, + 'page_title' => $this->title->getDBkey() + ] + ); + if ( $touched === false ) { + return false; // no description page + } + + $cache = ObjectCache::getMainWANInstance(); + + return $cache->getWithSetCallback( + $this->repo->getLocalCacheKey( + 'RemoteFileDescription', + 'url', + $lang->getCode(), + $this->getName(), + $touched + ), + $this->repo->descriptionCacheExpiry ?: $cache::TTL_UNCACHEABLE, + function ( $oldValue, &$ttl, array &$setOpts ) use ( $renderUrl ) { + wfDebug( "Fetching shared description from $renderUrl\n" ); + $res = Http::get( $renderUrl, [], __METHOD__ ); + if ( !$res ) { + $ttl = WANObjectCache::TTL_UNCACHEABLE; + } + + return $res; + } + ); } /** @@ -137,10 +180,14 @@ class ForeignDBFile extends LocalFile { */ public function getDescriptionShortUrl() { $dbr = $this->repo->getSlaveDB(); - $pageId = $dbr->selectField( 'page', 'page_id', [ - 'page_namespace' => NS_FILE, - 'page_title' => $this->title->getDBkey() - ] ); + $pageId = $dbr->selectField( + 'page', + 'page_id', + [ + 'page_namespace' => NS_FILE, + 'page_title' => $this->title->getDBkey() + ] + ); if ( $pageId !== false ) { $url = $this->repo->makeUrl( [ 'curid' => $pageId ] );