summaryrefslogtreecommitdiff
path: root/maintenance/fixSlaveDesync.php
diff options
context:
space:
mode:
authorPierre Schmitz <pierre@archlinux.de>2006-10-11 18:12:39 +0000
committerPierre Schmitz <pierre@archlinux.de>2006-10-11 18:12:39 +0000
commit183851b06bd6c52f3cae5375f433da720d410447 (patch)
treea477257decbf3360127f6739c2f9d0ec57a03d39 /maintenance/fixSlaveDesync.php
MediaWiki 1.7.1 wiederhergestellt
Diffstat (limited to 'maintenance/fixSlaveDesync.php')
-rw-r--r--maintenance/fixSlaveDesync.php100
1 files changed, 100 insertions, 0 deletions
diff --git a/maintenance/fixSlaveDesync.php b/maintenance/fixSlaveDesync.php
new file mode 100644
index 00000000..e97f96c9
--- /dev/null
+++ b/maintenance/fixSlaveDesync.php
@@ -0,0 +1,100 @@
+<?php
+
+$wgUseRootUser = true;
+require_once( 'commandLine.inc' );
+
+//$wgDebugLogFile = '/dev/stdout';
+
+$slaveIndexes = array();
+for ( $i = 1; $i < count( $wgDBservers ); $i++ ) {
+ if ( $wgLoadBalancer->isNonZeroLoad( $i ) ) {
+ $slaveIndexes[] = $i;
+ }
+}
+/*
+foreach ( $wgLoadBalancer->mServers as $i => $server ) {
+ $wgLoadBalancer->mServers[$i]['flags'] |= DBO_DEBUG;
+}*/
+$reportingInterval = 1000;
+
+if ( isset( $args[0] ) ) {
+ desyncFixPage( $args[0] );
+} else {
+ $dbw =& wfGetDB( DB_MASTER );
+ $maxPage = $dbw->selectField( 'page', 'MAX(page_id)', false, 'fixDesync.php' );
+ for ( $i=1; $i <= $maxPage; $i++ ) {
+ desyncFixPage( $i );
+ if ( !($i % $reportingInterval) ) {
+ print "$i\n";
+ }
+ }
+}
+
+function desyncFixPage( $pageID ) {
+ global $slaveIndexes;
+ $fname = 'desyncFixPage';
+
+ # Check for a corrupted page_latest
+ $dbw =& wfGetDB( DB_MASTER );
+ $realLatest = $dbw->selectField( 'page', 'page_latest', array( 'page_id' => $pageID ), $fname );
+ $found = false;
+ foreach ( $slaveIndexes as $i ) {
+ $db =& wfGetDB( $i );
+ $latest = $db->selectField( 'page', 'page_latest', array( 'page_id' => $pageID ), $fname );
+ $max = $db->selectField( 'revision', 'MAX(rev_id)', false, $fname );
+ if ( $latest != $realLatest && $realLatest < $max ) {
+ print "page_latest corrupted in page $pageID, server $i\n";
+ $found = true;
+ break;
+ }
+ }
+ if ( !$found ) {
+ return;
+ }
+
+ # Find the missing revision
+ $res = $dbw->select( 'revision', array( 'rev_id' ), array( 'rev_page' => $pageID ), $fname );
+ $masterIDs = array();
+ while ( $row = $dbw->fetchObject( $res ) ) {
+ $masterIDs[] = $row->rev_id;
+ }
+ $dbw->freeResult( $res );
+
+ $res = $db->select( 'revision', array( 'rev_id' ), array( 'rev_page' => $pageID ), $fname );
+ $slaveIDs = array();
+ while ( $row = $db->fetchObject( $res ) ) {
+ $slaveIDs[] = $row->rev_id;
+ }
+ $db->freeResult( $res );
+ $missingIDs = array_diff( $masterIDs, $slaveIDs );
+
+ if ( count( $missingIDs ) ) {
+ print "Found " . count( $missingIDs ) . " missing revision(s), copying from master... ";
+ foreach ( $missingIDs as $rid ) {
+ print "$rid ";
+ # Revision
+ $row = $dbw->selectRow( 'revision', '*', array( 'rev_id' => $rid ), $fname );
+ foreach ( $slaveIndexes as $i ) {
+ $db =& wfGetDB( $i );
+ $db->insert( 'revision', get_object_vars( $row ), $fname, 'IGNORE' );
+ }
+
+ # Text
+ $row = $dbw->selectRow( 'text', '*', array( 'old_id' => $row->rev_text_id ), $fname );
+ foreach ( $slaveIndexes as $i ) {
+ $db =& wfGetDB( $i );
+ $db->insert( 'text', get_object_vars( $row ), $fname, 'IGNORE' );
+ }
+ }
+ print "done\n";
+ }
+
+ print "Fixing page_latest... ";
+ foreach ( $slaveIndexes as $i ) {
+ $db =& wfGetDB( $i );
+ $db->update( 'page', array( 'page_latest' => $realLatest ), array( 'page_id' => $pageID ), $fname );
+ }
+ print "done\n";
+}
+
+?>