X-Git-Url: https://git.heureux-cyclage.org/?a=blobdiff_plain;f=includes%2Ffilerepo%2Ffile%2FLocalFile.php;h=fe42c2d81c0e1e73a6f455aa5901114292784a01;hb=19bff2537ed3344a763300f51d713b8e2e3a362c;hp=be5ca7f954eaec41e8f514c9712900c10723def2;hpb=badc035712ded02e8ec7ee4c5e8a0fe09e2811d2;p=lhc%2Fweb%2Fwiklou.git diff --git a/includes/filerepo/file/LocalFile.php b/includes/filerepo/file/LocalFile.php index be5ca7f954..fe42c2d81c 100644 --- a/includes/filerepo/file/LocalFile.php +++ b/includes/filerepo/file/LocalFile.php @@ -243,21 +243,19 @@ class LocalFile extends File { * @return bool */ function loadFromCache() { - global $wgMemc; - $this->dataLoaded = false; $this->extraDataLoaded = false; $key = $this->getCacheKey(); if ( !$key ) { - return false; } - $cachedValues = $wgMemc->get( $key ); + $cache = ObjectCache::getMainWANInstance(); + $cachedValues = $cache->get( $key ); // Check if the key existed and belongs to this version of MediaWiki - if ( isset( $cachedValues['version'] ) && $cachedValues['version'] == MW_FILE_VERSION ) { + if ( is_array( $cachedValues ) && $cachedValues['version'] == MW_FILE_VERSION ) { wfDebug( "Pulling file metadata from cache key $key\n" ); $this->fileExists = $cachedValues['fileExists']; if ( $this->fileExists ) { @@ -283,22 +281,20 @@ class LocalFile extends File { * Save the file metadata to memcached */ function saveToCache() { - global $wgMemc; - $this->load(); - $key = $this->getCacheKey(); + $key = $this->getCacheKey(); if ( !$key ) { return; } $fields = $this->getCacheFields( '' ); - $cache = array( 'version' => MW_FILE_VERSION ); - $cache['fileExists'] = $this->fileExists; + $cacheVal = array( 'version' => MW_FILE_VERSION ); + $cacheVal['fileExists'] = $this->fileExists; if ( $this->fileExists ) { foreach ( $fields as $field ) { - $cache[$field] = $this->$field; + $cacheVal[$field] = $this->$field; } } @@ -306,13 +302,29 @@ class LocalFile extends File { // If the cache value gets to large it will not fit in memcached and nothing will // get cached at all, causing master queries for any file access. foreach ( $this->getLazyCacheFields( '' ) as $field ) { - if ( isset( $cache[$field] ) && strlen( $cache[$field] ) > 100 * 1024 ) { - unset( $cache[$field] ); // don't let the value get too big + if ( isset( $cacheVal[$field] ) && strlen( $cacheVal[$field] ) > 100 * 1024 ) { + unset( $cacheVal[$field] ); // don't let the value get too big } } // Cache presence for 1 week and negatives for 1 day - $wgMemc->set( $key, $cache, $this->fileExists ? 86400 * 7 : 86400 ); + $cache = ObjectCache::getMainWANInstance(); + $cache->set( $key, $cacheVal, $this->fileExists ? 86400 * 7 : 86400 ); + } + + /** + * Purge the file object/metadata cache + */ + function invalidateCache() { + $this->load(); + + $key = $this->getCacheKey(); + if ( !$key ) { + return; + } + + $cache = ObjectCache::getMainWANInstance(); + $cache->delete( $key ); } /** @@ -612,7 +624,7 @@ class LocalFile extends File { __METHOD__ ); - $this->saveToCache(); + $this->invalidateCache(); $this->unlock(); // done @@ -734,7 +746,7 @@ class LocalFile extends File { if ( $type == 'text' ) { return $this->user_text; } elseif ( $type == 'id' ) { - return $this->user; + return (int)$this->user; } } @@ -753,7 +765,7 @@ class LocalFile extends File { function getBitDepth() { $this->load(); - return $this->bits; + return (int)$this->bits; } /** @@ -842,25 +854,7 @@ class LocalFile extends File { * Refresh metadata in memcached, but don't touch thumbnails or squid */ function purgeMetadataCache() { - $this->loadFromDB(); - $this->saveToCache(); - $this->purgeHistory(); - } - - /** - * Purge the shared history (OldLocalFile) cache. - * - * @note This used to purge old thumbnails as well. - */ - function purgeHistory() { - global $wgMemc; - - $hashedName = md5( $this->getName() ); - $oldKey = $this->repo->getSharedCacheKey( 'oldfile', $hashedName ); - - if ( $oldKey ) { - $wgMemc->delete( $oldKey ); - } + $this->invalidateCache(); } /** @@ -1406,11 +1400,8 @@ class LocalFile extends File { # to after $wikiPage->doEdit has been called. $dbw->commit( __METHOD__ ); - # Save to memcache. - # We shall not saveToCache before the commit since otherwise - # in case of a rollback there is an usable file from memcached - # which in fact doesn't really exist (bug 24978) - $this->saveToCache(); + # Update memcache after the commit + $this->invalidateCache(); if ( $exists ) { # Invalidate the cache for the description page @@ -1612,21 +1603,21 @@ class LocalFile extends File { // Hack: the lock()/unlock() pair is nested in a transaction so the locking is not // tied to BEGIN/COMMIT. To avoid slow purges in the transaction, move them outside. - $file = $this; + $that = $this; $this->getRepo()->getMasterDB()->onTransactionIdle( - function () use ( $file, $archiveNames ) { + function () use ( $that, $archiveNames ) { global $wgUseSquid; - $file->purgeEverything(); + $that->purgeEverything(); foreach ( $archiveNames as $archiveName ) { - $file->purgeOldThumbnails( $archiveName ); + $that->purgeOldThumbnails( $archiveName ); } if ( $wgUseSquid ) { // Purge the squid $purgeUrls = array(); foreach ( $archiveNames as $archiveName ) { - $purgeUrls[] = $file->getArchiveUrl( $archiveName ); + $purgeUrls[] = $that->getArchiveUrl( $archiveName ); } SquidUpdate::purge( $purgeUrls ); } @@ -1667,7 +1658,6 @@ class LocalFile extends File { $this->purgeOldThumbnails( $archiveName ); if ( $status->isOK() ) { $this->purgeDescription(); - $this->purgeHistory(); } if ( $wgUseSquid ) { @@ -1811,7 +1801,7 @@ class LocalFile extends File { array( 'img_sha1' => $this->sha1 ), array( 'img_name' => $this->getName() ), __METHOD__ ); - $this->saveToCache(); + $this->invalidateCache(); } $this->unlock(); // done @@ -2565,7 +2555,6 @@ class LocalFileRestoreBatch { } else { wfDebug( __METHOD__ . " restored {$status->successCount} as archived versions\n" ); $this->file->purgeDescription(); - $this->file->purgeHistory(); } }