summaryrefslogtreecommitdiff
path: root/maintenance/fixSlaveDesync.php
diff options
context:
space:
mode:
authorPierre Schmitz <pierre@archlinux.de>2010-07-28 11:52:48 +0200
committerPierre Schmitz <pierre@archlinux.de>2010-07-28 11:52:48 +0200
commit222b01f5169f1c7e69762e0e8904c24f78f71882 (patch)
tree8e932e12546bb991357ec48eb1638d1770be7a35 /maintenance/fixSlaveDesync.php
parent00ab76a6b686e98a914afc1975812d2b1aaa7016 (diff)
update to MediaWiki 1.16.0
Diffstat (limited to 'maintenance/fixSlaveDesync.php')
-rw-r--r--maintenance/fixSlaveDesync.php335
1 files changed, 178 insertions, 157 deletions
diff --git a/maintenance/fixSlaveDesync.php b/maintenance/fixSlaveDesync.php
index 7817bc56..c585beb1 100644
--- a/maintenance/fixSlaveDesync.php
+++ b/maintenance/fixSlaveDesync.php
@@ -1,196 +1,217 @@
<?php
/**
- * @file
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program; if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ * http://www.gnu.org/copyleft/gpl.html
+ *
* @ingroup Maintenance
*/
-$wgUseRootUser = true;
-require_once( 'commandLine.inc' );
+require_once( dirname(__FILE__) . '/Maintenance.php' );
-//$wgDebugLogFile = '/dev/stdout';
+class FixSlaveDesync extends Maintenance {
+ public function __construct() {
+ global $wgUseRootUser;
+ $wgUseRootUser = true;
-$slaveIndexes = array();
-for ( $i = 1; $i < count( $wgDBservers ); $i++ ) {
- if ( wfGetLB()->isNonZeroLoad( $i ) ) {
- $slaveIndexes[] = $i;
+ parent::__construct();
+ $this->mDescription = "";
+
}
-}
-/*
-foreach ( wfGetLB()->mServers as $i => $server ) {
- wfGetLB()->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' );
- $corrupt = findPageLatestCorruption();
- foreach ( $corrupt as $id => $dummy ) {
- desyncFixPage( $id );
- }
- /*
- for ( $i=1; $i <= $maxPage; $i++ ) {
- desyncFixPage( $i );
- if ( !($i % $reportingInterval) ) {
- print "$i\n";
+
+ public function execute() {
+ global $slaveIndexes, $wgDBservers;
+ $slaveIndexes = array();
+ for ( $i = 1; $i < count( $wgDBservers ); $i++ ) {
+ if ( wfGetLB()->isNonZeroLoad( $i ) ) {
+ $slaveIndexes[] = $i;
+ }
}
- }*/
-}
-function findPageLatestCorruption() {
- $desync = array();
- $n = 0;
- $dbw = wfGetDB( DB_MASTER );
- $masterIDs = array();
- $res = $dbw->select( 'page', array( 'page_id', 'page_latest' ), array( 'page_id<6054123' ), __METHOD__ );
- print "Number of pages: " . $dbw->numRows( $res ) . "\n";
- while ( $row = $dbw->fetchObject( $res ) ) {
- $masterIDs[$row->page_id] = $row->page_latest;
- if ( !( ++$n % 10000 ) ) {
- print "$n\r";
+ if ( $this->hasArg() ) {
+ $this->desyncFixPage( $this->getArg() );
+ } else {
+ $dbw = wfGetDB( DB_MASTER );
+ $maxPage = $dbw->selectField( 'page', 'MAX(page_id)', false, __METHOD__ );
+ $corrupt = $this->findPageLatestCorruption();
+ foreach ( $corrupt as $id => $dummy ) {
+ $this->desyncFixPage( $id );
+ }
}
}
- print "\n";
- $dbw->freeResult( $res );
-
- global $slaveIndexes;
- foreach ( $slaveIndexes as $i ) {
- $db = wfGetDB( $i );
- $res = $db->select( 'page', array( 'page_id', 'page_latest' ), array( 'page_id<6054123' ), __METHOD__ );
- while ( $row = $db->fetchObject( $res ) ) {
- if ( isset( $masterIDs[$row->page_id] ) && $masterIDs[$row->page_id] != $row->page_latest ) {
- $desync[$row->page_id] = true;
- print $row->page_id . "\t";
+
+ /**
+ * Find all pages that have a corrupted page_latest
+ * @return array
+ */
+ private function findPageLatestCorruption() {
+ $desync = array();
+ $n = 0;
+ $dbw = wfGetDB( DB_MASTER );
+ $masterIDs = array();
+ $res = $dbw->select( 'page', array( 'page_id', 'page_latest' ), array( 'page_id<6054123' ), __METHOD__ );
+ $this->output( "Number of pages: " . $dbw->numRows( $res ) . "\n" );
+ foreach ( $res as $row ) {
+ $masterIDs[$row->page_id] = $row->page_latest;
+ if ( !( ++$n % 10000 ) ) {
+ $this->output( "$n\r" );
}
}
- $db->freeResult( $res );
+ $this->output( "\n" );
+ $dbw->freeResult( $res );
+
+ global $slaveIndexes;
+ foreach ( $slaveIndexes as $i ) {
+ $db = wfGetDB( $i );
+ $res = $db->select( 'page', array( 'page_id', 'page_latest' ), array( 'page_id<6054123' ), __METHOD__ );
+ foreach ( $res as $row ) {
+ if ( isset( $masterIDs[$row->page_id] ) && $masterIDs[$row->page_id] != $row->page_latest ) {
+ $desync[$row->page_id] = true;
+ $this->output( $row->page_id . "\t" );
+ }
+ }
+ $db->freeResult( $res );
+ }
+ $this->output( "\n" );
+ return $desync;
}
- print "\n";
- return $desync;
-}
-function desyncFixPage( $pageID ) {
- global $slaveIndexes;
- $fname = 'desyncFixPage';
+ /**
+ * Fix a broken page entry
+ * @param $pageID int The page_id to fix
+ */
+ private function desyncFixPage( $pageID ) {
+ global $slaveIndexes;
- # Check for a corrupted page_latest
- $dbw = wfGetDB( DB_MASTER );
- $dbw->begin();
- $realLatest = $dbw->selectField( 'page', 'page_latest', array( 'page_id' => $pageID ),
- $fname, 'FOR UPDATE' );
- #list( $masterFile, $masterPos ) = $dbw->getMasterPos();
- $found = false;
- foreach ( $slaveIndexes as $i ) {
- $db = wfGetDB( $i );
- /*
- if ( !$db->masterPosWait( $masterFile, $masterPos, 10 ) ) {
- echo "Slave is too lagged, aborting\n";
- $dbw->commit();
- sleep(10);
- return;
- }*/
- $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;
+ # Check for a corrupted page_latest
+ $dbw = wfGetDB( DB_MASTER );
+ $dbw->begin();
+ $realLatest = $dbw->selectField( 'page', 'page_latest', array( 'page_id' => $pageID ),
+ __METHOD__, 'FOR UPDATE' );
+ #list( $masterFile, $masterPos ) = $dbw->getMasterPos();
+ $found = false;
+ foreach ( $slaveIndexes as $i ) {
+ $db = wfGetDB( $i );
+ /*
+ if ( !$db->masterPosWait( $masterFile, $masterPos, 10 ) ) {
+ $this->output( "Slave is too lagged, aborting\n" );
+ $dbw->commit();
+ sleep(10);
+ return;
+ }*/
+ $latest = $db->selectField( 'page', 'page_latest', array( 'page_id' => $pageID ), __METHOD__ );
+ $max = $db->selectField( 'revision', 'MAX(rev_id)', false, __METHOD__ );
+ if ( $latest != $realLatest && $realLatest < $max ) {
+ $this->output( "page_latest corrupted in page $pageID, server $i\n" );
+ $found = true;
+ break;
+ }
+ }
+ if ( !$found ) {
+ $this->output( "page_id $pageID seems fine\n" );
+ $dbw->commit();
+ return;
}
- }
- if ( !$found ) {
- print "page_id $pageID seems fine\n";
- $dbw->commit();
- return;
- }
- # Find the missing revisions
- $res = $dbw->select( 'revision', array( 'rev_id' ), array( 'rev_page' => $pageID ),
- $fname, 'FOR UPDATE' );
- $masterIDs = array();
- while ( $row = $dbw->fetchObject( $res ) ) {
- $masterIDs[] = $row->rev_id;
- }
- $dbw->freeResult( $res );
+ # Find the missing revisions
+ $res = $dbw->select( 'revision', array( 'rev_id' ), array( 'rev_page' => $pageID ),
+ __METHOD__, 'FOR UPDATE' );
+ $masterIDs = array();
+ foreach ( $res as $row ) {
+ $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 );
- if ( count( $masterIDs ) < count( $slaveIDs ) ) {
- $missingIDs = array_diff( $slaveIDs, $masterIDs );
- if ( count( $missingIDs ) ) {
- print "Found " . count( $missingIDs ) . " lost in master, copying from slave... ";
- $dbFrom = $db;
- $found = true;
- $toMaster = true;
- } else {
- $found = false;
+ $res = $db->select( 'revision', array( 'rev_id' ), array( 'rev_page' => $pageID ), __METHOD__ );
+ $slaveIDs = array();
+ foreach ( $res as $row ) {
+ $slaveIDs[] = $row->rev_id;
}
- } else {
- $missingIDs = array_diff( $masterIDs, $slaveIDs );
- if ( count( $missingIDs ) ) {
- print "Found " . count( $missingIDs ) . " missing revision(s), copying from master... ";
- $dbFrom = $dbw;
- $found = true;
- $toMaster = false;
+ $db->freeResult( $res );
+ if ( count( $masterIDs ) < count( $slaveIDs ) ) {
+ $missingIDs = array_diff( $slaveIDs, $masterIDs );
+ if ( count( $missingIDs ) ) {
+ $this->output( "Found " . count( $missingIDs ) . " lost in master, copying from slave... " );
+ $dbFrom = $db;
+ $found = true;
+ $toMaster = true;
+ } else {
+ $found = false;
+ }
} else {
- $found = false;
+ $missingIDs = array_diff( $masterIDs, $slaveIDs );
+ if ( count( $missingIDs ) ) {
+ $this->output( "Found " . count( $missingIDs ) . " missing revision(s), copying from master... " );
+ $dbFrom = $dbw;
+ $found = true;
+ $toMaster = false;
+ } else {
+ $found = false;
+ }
}
- }
- if ( $found ) {
- foreach ( $missingIDs as $rid ) {
- print "$rid ";
- # Revision
- $row = $dbFrom->selectRow( 'revision', '*', array( 'rev_id' => $rid ), $fname );
- if ( $toMaster ) {
- $id = $dbw->selectField( 'revision', 'rev_id', array( 'rev_id' => $rid ),
- $fname, 'FOR UPDATE' );
- if ( $id ) {
- echo "Revision already exists\n";
- $found = false;
- break;
+ if ( $found ) {
+ foreach ( $missingIDs as $rid ) {
+ $this->output( "$rid " );
+ # Revision
+ $row = $dbFrom->selectRow( 'revision', '*', array( 'rev_id' => $rid ), __METHOD__ );
+ if ( $toMaster ) {
+ $id = $dbw->selectField( 'revision', 'rev_id', array( 'rev_id' => $rid ),
+ __METHOD__, 'FOR UPDATE' );
+ if ( $id ) {
+ $this->output( "Revision already exists\n" );
+ $found = false;
+ break;
+ } else {
+ $dbw->insert( 'revision', get_object_vars( $row ), __METHOD__, 'IGNORE' );
+ }
} else {
- $dbw->insert( 'revision', get_object_vars( $row ), $fname, 'IGNORE' );
+ foreach ( $slaveIndexes as $i ) {
+ $db = wfGetDB( $i );
+ $db->insert( 'revision', get_object_vars( $row ), __METHOD__, 'IGNORE' );
+ }
}
- } else {
- foreach ( $slaveIndexes as $i ) {
- $db = wfGetDB( $i );
- $db->insert( 'revision', get_object_vars( $row ), $fname, 'IGNORE' );
+
+ # Text
+ $row = $dbFrom->selectRow( 'text', '*', array( 'old_id' => $row->rev_text_id ), __METHOD__ );
+ if ( $toMaster ) {
+ $dbw->insert( 'text', get_object_vars( $row ), __METHOD__, 'IGNORE' );
+ } else {
+ foreach ( $slaveIndexes as $i ) {
+ $db = wfGetDB( $i );
+ $db->insert( 'text', get_object_vars( $row ), __METHOD__, 'IGNORE' );
+ }
}
}
+ $this->output( "done\n" );
+ }
- # Text
- $row = $dbFrom->selectRow( 'text', '*', array( 'old_id' => $row->rev_text_id ), $fname );
+ if ( $found ) {
+ $this->output( "Fixing page_latest... " );
if ( $toMaster ) {
- $dbw->insert( 'text', get_object_vars( $row ), $fname, 'IGNORE' );
+ #$dbw->update( 'page', array( 'page_latest' => $realLatest ), array( 'page_id' => $pageID ), __METHOD__ );
} else {
foreach ( $slaveIndexes as $i ) {
$db = wfGetDB( $i );
- $db->insert( 'text', get_object_vars( $row ), $fname, 'IGNORE' );
+ $db->update( 'page', array( 'page_latest' => $realLatest ), array( 'page_id' => $pageID ), __METHOD__ );
}
}
+ $this->output( "done\n" );
}
- print "done\n";
- }
-
- if ( $found ) {
- print "Fixing page_latest... ";
- if ( $toMaster ) {
- #$dbw->update( 'page', array( 'page_latest' => $realLatest ), array( 'page_id' => $pageID ), $fname );
- } else {
- foreach ( $slaveIndexes as $i ) {
- $db = wfGetDB( $i );
- $db->update( 'page', array( 'page_latest' => $realLatest ), array( 'page_id' => $pageID ), $fname );
- }
- }
- print "done\n";
+ $dbw->commit();
}
- $dbw->commit();
}
-
+$maintClass = "FixSlaveDesync";
+require_once( DO_MAINTENANCE );