X-Git-Url: https://git.heureux-cyclage.org/?a=blobdiff_plain;f=maintenance%2FsyncFileBackend.php;h=e279ccb1f3263346380ba1c11d4e3f139f1c51d0;hb=6b305fcf55b32972396bfa2e90d85abe55c4c0a4;hp=2e1d1c3f59691346cc6439e2d10e99478887cbc6;hpb=b6fcfa633d8b57eb63057b897403369e511ea40b;p=lhc%2Fweb%2Fwiklou.git diff --git a/maintenance/syncFileBackend.php b/maintenance/syncFileBackend.php index 2e1d1c3f59..e279ccb1f3 100644 --- a/maintenance/syncFileBackend.php +++ b/maintenance/syncFileBackend.php @@ -34,21 +34,44 @@ class SyncFileBackend extends Maintenance { parent::__construct(); $this->mDescription = "Sync one file backend with another using the journal"; $this->addOption( 'src', 'Name of backend to sync from', true, true ); - $this->addOption( 'dst', 'Name of destination backend to sync', true, true ); + $this->addOption( 'dst', 'Name of destination backend to sync', false, true ); $this->addOption( 'start', 'Starting journal ID', false, true ); $this->addOption( 'end', 'Ending journal ID', false, true ); $this->addOption( 'posdir', 'Directory to read/record journal positions', false, true ); + $this->addOption( 'posdump', 'Just dump current journal position into the position dir.' ); $this->addOption( 'verbose', 'Verbose mode', false, false, 'v' ); $this->setBatchSize( 50 ); } public function execute() { $src = FileBackendGroup::singleton()->get( $this->getOption( 'src' ) ); - $dst = FileBackendGroup::singleton()->get( $this->getOption( 'dst' ) ); $posDir = $this->getOption( 'posdir' ); $posFile = $posDir ? $posDir . '/' . wfWikiID() : false; + if ( $this->hasOption( 'posdump' ) ) { + // Just dump the current position into the specified position dir + if ( !$this->hasOption( 'posdir' ) ) { + $this->error( "Param posdir required!", 1 ); + } + $id = (int)$src->getJournal()->getCurrentPosition(); // default to 0 + $this->output( "Current journal position is $id.\n" ); + if ( file_put_contents( $posFile, $id, LOCK_EX ) !== false ) { + $this->output( "Saved journal position file.\n" ); + } else { + $this->output( "Could not save journal position file.\n" ); + } + if ( $this->isQuiet() ) { + print $id; // give a single machine-readable number + } + return; + } + + if ( !$this->hasOption( 'dst' ) ) { + $this->error( "Param dst required!", 1 ); + } + $dst = FileBackendGroup::singleton()->get( $this->getOption( 'dst' ) ); + $start = $this->getOption( 'start', 0 ); if ( !$start && $posFile && is_dir( $posDir ) ) { $start = is_file( $posFile ) @@ -209,7 +232,11 @@ class SyncFileBackend extends Maintenance { } $t_start = microtime( true ); - $status->merge( $dst->doQuickOperations( $ops, array( 'bypassReadOnly' => 1 ) ) ); + $status = $dst->doQuickOperations( $ops, array( 'bypassReadOnly' => 1 ) ); + if ( !$status->isOK() ) { + sleep( 10 ); // wait and retry copy again + $status = $dst->doQuickOperations( $ops, array( 'bypassReadOnly' => 1 ) ); + } $ellapsed_ms = floor( ( microtime( true ) - $t_start ) * 1000 ); if ( $status->isOK() && $this->getOption( 'verbose' ) ) { $this->output( "Synchronized these file(s) [{$ellapsed_ms}ms]:\n" .