X-Git-Url: https://git.heureux-cyclage.org/?a=blobdiff_plain;f=maintenance%2Fbackup.inc;h=e3dc488b54429487bddd513c6a20a550969cd67b;hb=86a180097bbe38cc314798b48a5a8b8e70566273;hp=583b1093aa45dd89cda930d037ef5e01c8781ba0;hpb=5c4ddbbd525c2f250cc00fa1baad24e00dd61b53;p=lhc%2Fweb%2Fwiklou.git diff --git a/maintenance/backup.inc b/maintenance/backup.inc index 583b1093aa..e3dc488b54 100644 --- a/maintenance/backup.inc +++ b/maintenance/backup.inc @@ -28,7 +28,7 @@ * @ingroup Dump Maintenance */ class DumpDBZip2Output extends DumpPipeOutput { - function DumpDBZip2Output( $file ) { + function __construct( $file ) { parent::__construct( "dbzip2", $file ); } } @@ -47,12 +47,34 @@ class BackupDumper { var $skipFooter = false; // don't output var $startId = 0; var $endId = 0; + var $revStartId = 0; + var $revEndId = 0; var $sink = null; // Output filters var $stubText = false; // include rev_text_id instead of text; for 2-pass dump var $dumpUploads = false; var $dumpUploadFileContents = false; + var $lastTime = 0; + var $pageCountLast = 0; + var $revCountLast = 0; + var $ID = 0; - function BackupDumper( $args ) { + var $outputTypes = array(), $filterTypes = array(); + + /** + * The dependency-injected database to use. + * + * @var DatabaseBase|null + * + * @see self::setDb + */ + protected $forcedDb = null; + + /** + * @var LoadBalancer + */ + protected $lb; + + function __construct( $args ) { $this->stderr = fopen( "php://stderr", "wt" ); // Built-in output and filter plugins @@ -206,6 +228,8 @@ class BackupDumper { } else if ( is_null( $this->pages ) ) { if ( $this->startId || $this->endId ) { $exporter->pagesByRange( $this->startId, $this->endId ); + } elseif ( $this->revStartId || $this->revEndId ) { + $exporter->revsByRange( $this->revStartId, $this->revEndId ); } else { $exporter->allPages(); } @@ -230,27 +254,49 @@ class BackupDumper { $table = ( $history == WikiExporter::CURRENT ) ? 'page' : 'revision'; $field = ( $history == WikiExporter::CURRENT ) ? 'page_id' : 'rev_id'; - $dbr = wfGetDB( DB_SLAVE ); + $dbr = $this->forcedDb; + if ( $this->forcedDb === null ) { + $dbr = wfGetDB( DB_SLAVE ); + } $this->maxCount = $dbr->selectField( $table, "MAX($field)", '', __METHOD__ ); - $this->startTime = wfTime(); + $this->startTime = microtime( true ); + $this->lastTime = $this->startTime; + $this->ID = getmypid(); } /** * @todo Fixme: the --server parameter is currently not respected, as it * doesn't seem terribly easy to ask the load balancer for a particular * connection by name. + * @return DatabaseBase */ function backupDb() { + if ( $this->forcedDb !== null ) { + return $this->forcedDb; + } + $this->lb = wfGetLBFactory()->newMainLB(); $db = $this->lb->getConnection( DB_SLAVE, 'backup' ); // Discourage the server from disconnecting us if it takes a long time // to read out the big ol' batch query. - $db->setTimeout( 3600 * 24 ); + $db->setSessionOptions( array( 'connTimeout' => 3600 * 24 ) ); return $db; } + /** + * Force the dump to use the provided database connection for database + * operations, wherever possible. + * + * @param $db DatabaseBase|null: (Optional) the database connection to + * use. If null, resort to use the globally provided ways to + * get database connections. + */ + function setDb( DatabaseBase $db = null ) { + $this->forcedDb = $db; + } + function __destruct() { if ( isset( $this->lb ) ) { $this->lb->closeAll(); @@ -281,21 +327,35 @@ class BackupDumper { function showReport() { if ( $this->reporting ) { - $delta = wfTime() - $this->startTime; $now = wfTimestamp( TS_DB ); - if ( $delta ) { - $rate = $this->pageCount / $delta; - $revrate = $this->revCount / $delta; + $nowts = microtime( true ); + $deltaAll = $nowts - $this->startTime; + $deltaPart = $nowts - $this->lastTime; + $this->pageCountPart = $this->pageCount - $this->pageCountLast; + $this->revCountPart = $this->revCount - $this->revCountLast; + + if ( $deltaAll ) { $portion = $this->revCount / $this->maxCount; - $eta = $this->startTime + $delta / $portion; + $eta = $this->startTime + $deltaAll / $portion; $etats = wfTimestamp( TS_DB, intval( $eta ) ); + $pageRate = $this->pageCount / $deltaAll; + $revRate = $this->revCount / $deltaAll; } else { - $rate = '-'; - $revrate = '-'; + $pageRate = '-'; + $revRate = '-'; $etats = '-'; } - $this->progress( sprintf( "%s: %s %d pages (%0.3f/sec), %d revs (%0.3f/sec), ETA %s [max %d]", - $now, wfWikiID(), $this->pageCount, $rate, $this->revCount, $revrate, $etats, $this->maxCount ) ); + if ( $deltaPart ) { + $pageRatePart = $this->pageCountPart / $deltaPart; + $revRatePart = $this->revCountPart / $deltaPart; + } else { + $pageRatePart = '-'; + $revRatePart = '-'; + } + $this->progress( sprintf( "%s: %s (ID %d) %d pages (%0.1f|%0.1f/sec all|curr), %d revs (%0.1f|%0.1f/sec all|curr), ETA %s [max %d]", + $now, wfWikiID(), $this->ID, $this->pageCount, $pageRate, $pageRatePart, $this->revCount, $revRate, $revRatePart, $etats, $this->maxCount ) ); + $this->lastTime = $nowts; + $this->revCountLast = $this->revCount; } } @@ -310,7 +370,7 @@ class BackupDumper { } class ExportProgressFilter extends DumpFilter { - function ExportProgressFilter( &$sink, &$progress ) { + function __construct( &$sink, &$progress ) { parent::__construct( $sink ); $this->progress = $progress; }