diff options
Diffstat (limited to 'maintenance/storage/trackBlobs.php')
-rw-r--r-- | maintenance/storage/trackBlobs.php | 56 |
1 files changed, 49 insertions, 7 deletions
diff --git a/maintenance/storage/trackBlobs.php b/maintenance/storage/trackBlobs.php index 63327d53..15aeec3b 100644 --- a/maintenance/storage/trackBlobs.php +++ b/maintenance/storage/trackBlobs.php @@ -1,6 +1,6 @@ <?php -require( dirname( __FILE__ ) .'/../commandLine.inc' ); +require( dirname( __FILE__ ) . '/../commandLine.inc' ); if ( count( $args ) < 1 ) { @@ -35,6 +35,7 @@ class TrackBlobs { } function run() { + $this->checkIntegrity(); $this->initTrackingTable(); $this->trackRevisions(); $this->trackOrphanText(); @@ -43,6 +44,47 @@ class TrackBlobs { } } + function checkIntegrity() { + echo "Doing integrity check...\n"; + $dbr = wfGetDB( DB_SLAVE ); + + // Scan for HistoryBlobStub objects in the text table (bug 20757) + + $exists = $dbr->selectField( 'text', 1, + 'old_flags LIKE \'%object%\' AND old_flags NOT LIKE \'%external%\' ' . + 'AND LOWER(CONVERT(LEFT(old_text,22) USING latin1)) = \'o:15:"historyblobstub"\'', + __METHOD__ + ); + + if ( $exists ) { + echo "Integrity check failed: found HistoryBlobStub objects in your text table.\n" . + "This script could destroy these objects if it continued. Run resolveStubs.php\n" . + "to fix this.\n"; + exit( 1 ); + } + + // Scan the archive table for HistoryBlobStub objects or external flags (bug 22624) + $flags = $dbr->selectField( 'archive', 'ar_flags', + 'ar_flags LIKE \'%external%\' OR (' . + 'ar_flags LIKE \'%object%\' ' . + 'AND LOWER(CONVERT(LEFT(ar_text,22) USING latin1)) = \'o:15:"historyblobstub"\' )', + __METHOD__ + ); + + if ( strpos( $flags, 'external' ) !== false ) { + echo "Integrity check failed: found external storage pointers in your archive table.\n" . + "Run normaliseArchiveTable.php to fix this.\n"; + exit( 1 ); + } elseif ( $flags ) { + echo "Integrity check failed: found HistoryBlobStub objects in your archive table.\n" . + "These objects are probably already broken, continuing would make them\n" . + "unrecoverable. Run \"normaliseArchiveTable.php --fix-cgz-bug\" to fix this.\n"; + exit( 1 ); + } + + echo "Integrity check OK\n"; + } + function initTrackingTable() { $dbw = wfGetDB( DB_MASTER ); if ( $dbw->tableExists( 'blob_tracking' ) ) { @@ -170,9 +212,9 @@ class TrackBlobs { # Scan the text table for orphan text while ( true ) { - $res = $dbr->select( array( 'text', 'blob_tracking' ), + $res = $dbr->select( array( 'text', 'blob_tracking' ), array( 'old_id', 'old_flags', 'old_text' ), - array( + array( 'old_id>' . $dbr->addQuotes( $startId ), $textClause, 'old_flags ' . $dbr->buildLike( $dbr->anyString(), 'external', $dbr->anyString() ), @@ -181,7 +223,7 @@ class TrackBlobs { __METHOD__, array( 'ORDER BY' => 'old_id', - 'LIMIT' => $this->batchSize + 'LIMIT' => $this->batchSize ), array( 'blob_tracking' => array( 'LEFT JOIN', 'bt_text_id=old_id' ) ) ); @@ -275,8 +317,8 @@ class TrackBlobs { // Build a bitmap of actual blob rows while ( true ) { - $res = $extDB->select( $table, - array( 'blob_id' ), + $res = $extDB->select( $table, + array( 'blob_id' ), array( 'blob_id > ' . $extDB->addQuotes( $startId ) ), __METHOD__, array( 'LIMIT' => $this->batchSize, 'ORDER BY' => 'blob_id' ) @@ -301,7 +343,7 @@ class TrackBlobs { // Find actual blobs that weren't tracked by the previous passes // This is a set-theoretic difference A \ B, or in bitwise terms, A & ~B $orphans = gmp_and( $actualBlobs, gmp_com( $this->trackedBlobs[$cluster] ) ); - + // Traverse the orphan list $insertBatch = array(); $id = 0; |