aboutsummaryrefslogtreecommitdiffstats
path: root/includes/filebackend/FileBackendStore.php
diff options
context:
space:
mode:
authorAaron Schulz <aschulz@wikimedia.org>2012-11-16 12:02:42 -0800
committerAaron Schulz <aschulz@wikimedia.org>2012-11-16 12:14:20 -0800
commitae63b9ae10cff9471cc32eb92dc29430bf3cd5cb (patch)
tree88e285ad95198d67602e958ea141c6d7bfb9c3ab /includes/filebackend/FileBackendStore.php
parentc13b693ac8ff536538bc44794e4c8c569468d976 (diff)
downloadmediawikicore-ae63b9ae10cff9471cc32eb92dc29430bf3cd5cb.tar.gz
mediawikicore-ae63b9ae10cff9471cc32eb92dc29430bf3cd5cb.zip
[FileBackend] Stat caching improvements.
Callers often tend to end up calling getFileStat(), at least indirectly, or in various successive function on the same path. This created RTTs when the file didn't exist since negatives were not cached. This change does the following: * Cache definitive negatives (404s) in the process cache. Nothing is cached on failure (like network problems). * Ignore process cache entries after a brief time period so long running scripts do not have overly stale entries. Change-Id: I356bd9f48281e3c7e7a273778b2aca59c521a0c7
Diffstat (limited to 'includes/filebackend/FileBackendStore.php')
-rw-r--r--includes/filebackend/FileBackendStore.php20
1 files changed, 13 insertions, 7 deletions
diff --git a/includes/filebackend/FileBackendStore.php b/includes/filebackend/FileBackendStore.php
index 97e49a5a0925..43e6cb3ed84a 100644
--- a/includes/filebackend/FileBackendStore.php
+++ b/includes/filebackend/FileBackendStore.php
@@ -48,6 +48,8 @@ abstract class FileBackendStore extends FileBackend {
protected $maxFileSize = 4294967296; // integer bytes (4GiB)
+ const CACHE_TTL = 10; // integer; TTL in seconds for process cache entries
+
/**
* @see FileBackend::__construct()
*
@@ -601,14 +603,15 @@ abstract class FileBackendStore extends FileBackend {
wfProfileIn( __METHOD__ );
wfProfileIn( __METHOD__ . '-' . $this->name );
$latest = !empty( $params['latest'] ); // use latest data?
- if ( !$this->cheapCache->has( $path, 'stat' ) ) {
+ if ( !$this->cheapCache->has( $path, 'stat', self::CACHE_TTL ) ) {
$this->primeFileCache( array( $path ) ); // check persistent cache
}
- if ( $this->cheapCache->has( $path, 'stat' ) ) {
+ if ( $this->cheapCache->has( $path, 'stat', self::CACHE_TTL ) ) {
$stat = $this->cheapCache->get( $path, 'stat' );
// If we want the latest data, check that this cached
- // value was in fact fetched with the latest available data.
- if ( !$latest || $stat['latest'] ) {
+ // value was in fact fetched with the latest available data
+ // (the process cache is ignored if it contains a negative).
+ if ( !$latest || ( is_array( $stat ) && $stat['latest'] ) ) {
wfProfileOut( __METHOD__ . '-' . $this->name );
wfProfileOut( __METHOD__ );
return $stat;
@@ -619,7 +622,7 @@ abstract class FileBackendStore extends FileBackend {
$stat = $this->doGetFileStat( $params );
wfProfileOut( __METHOD__ . '-miss-' . $this->name );
wfProfileOut( __METHOD__ . '-miss' );
- if ( is_array( $stat ) ) { // don't cache negatives
+ if ( is_array( $stat ) ) { // file exists
$stat['latest'] = $latest;
$this->cheapCache->set( $path, 'stat', $stat );
$this->setFileCache( $path, $stat ); // update persistent cache
@@ -627,8 +630,11 @@ abstract class FileBackendStore extends FileBackend {
$this->cheapCache->set( $path, 'sha1',
array( 'hash' => $stat['sha1'], 'latest' => $latest ) );
}
- } else {
+ } elseif ( $stat === false ) { // file does not exist
+ $this->cheapCache->set( $path, 'stat', false );
wfDebug( __METHOD__ . ": File $path does not exist.\n" );
+ } else { // an error occurred
+ wfDebug( __METHOD__ . ": Could not stat file $path.\n" );
}
wfProfileOut( __METHOD__ . '-' . $this->name );
wfProfileOut( __METHOD__ );
@@ -682,7 +688,7 @@ abstract class FileBackendStore extends FileBackend {
wfProfileIn( __METHOD__ );
wfProfileIn( __METHOD__ . '-' . $this->name );
$latest = !empty( $params['latest'] ); // use latest data?
- if ( $this->cheapCache->has( $path, 'sha1' ) ) {
+ if ( $this->cheapCache->has( $path, 'sha1', self::CACHE_TTL ) ) {
$stat = $this->cheapCache->get( $path, 'sha1' );
// If we want the latest data, check that this cached
// value was in fact fetched with the latest available data.