X-Git-Url: https://git.heureux-cyclage.org/?p=lhc%2Fweb%2Fwiklou.git;a=blobdiff_plain;f=includes%2Ffilebackend%2FFileBackendMultiWrite.php;h=3b2004827d8d2709a6fda6e6886f18ae3d3d47b2;hp=6f40bda945bc98eb428fd471cdc6c9e94beb92e5;hb=59280c4c929dc9c073e48879d3d44d5e55499c1c;hpb=42324aff4e173b70aeed4f520ff0f5b96557d24e diff --git a/includes/filebackend/FileBackendMultiWrite.php b/includes/filebackend/FileBackendMultiWrite.php index 6f40bda945..3b2004827d 100644 --- a/includes/filebackend/FileBackendMultiWrite.php +++ b/includes/filebackend/FileBackendMultiWrite.php @@ -178,7 +178,9 @@ class FileBackendMultiWrite extends FileBackend { wfDebugLog( 'FileOperation', get_class( $this ) . " failed sync check: " . FormatJson::encode( $relevantPaths ) ); // Try to resync the clone backends to the master on the spot... - if ( !$this->autoResync || !$this->resyncFiles( $relevantPaths )->isOK() ) { + if ( $this->autoResync === false + || !$this->resyncFiles( $relevantPaths, $this->autoResync )->isOK() + ) { $status->merge( $syncStatus ); return $status; // abort @@ -239,6 +241,12 @@ class FileBackendMultiWrite extends FileBackend { return $status; // skip checks } + // Preload all of the stat info in as few round trips as possible... + foreach ( $this->backends as $backend ) { + $realPaths = $this->substPaths( $paths, $backend ); + $backend->preloadFileStat( [ 'srcs' => $realPaths, 'latest' => true ] ); + } + $mBackend = $this->backends[$this->masterIndex]; foreach ( $paths as $path ) { $params = [ 'src' => $path, 'latest' => true ]; @@ -322,9 +330,10 @@ class FileBackendMultiWrite extends FileBackend { * and re-synchronize those files against the "multi master" if needed. * * @param array $paths List of storage paths + * @param string|bool $resyncMode False, True, or "conservative"; see __construct() * @return Status */ - public function resyncFiles( array $paths ) { + public function resyncFiles( array $paths, $resyncMode = true ) { $status = Status::newGood(); $mBackend = $this->backends[$this->masterIndex]; @@ -355,7 +364,7 @@ class FileBackendMultiWrite extends FileBackend { if ( $mSha1 === $cSha1 ) { // already synced; nothing to do } elseif ( $mSha1 !== false ) { // file is in master - if ( $this->autoResync === 'conservative' + if ( $resyncMode === 'conservative' && $cStat && $cStat['mtime'] > $mStat['mtime'] ) { $status->fatal( 'backend-fail-synced', $path ); @@ -367,7 +376,7 @@ class FileBackendMultiWrite extends FileBackend { [ 'src' => $fsFile->getPath(), 'dst' => $cPath ] ) ); } elseif ( $mStat === false ) { // file is not in master - if ( $this->autoResync === 'conservative' ) { + if ( $resyncMode === 'conservative' ) { $status->fatal( 'backend-fail-synced', $path ); continue; // don't delete data } @@ -376,6 +385,11 @@ class FileBackendMultiWrite extends FileBackend { } } + if ( !$status->isOK() ) { + wfDebugLog( 'FileOperation', get_class( $this ) . + " failed to resync: " . FormatJson::encode( $paths ) ); + } + return $status; }