wfProfileOut( $fname );
}
- function getWriterIndex()
- {
+ function getWriterIndex() {
return 0;
}
- function force( $i )
- {
+ /**
+ * Force subsequent calls to getConnection(DB_SLAVE) to return the
+ * given index. Set to -1 to restore the original load balancing
+ * behaviour. I thought this was a good idea when I originally
+ * wrote this class, but it has never been used.
+ */
+ function force( $i ) {
$this->mForce = $i;
}
- function haveIndex( $i )
- {
+ /**
+ * Returns true if the specified index is a valid server index
+ */
+ function haveIndex( $i ) {
return array_key_exists( $i, $this->mServers );
}
+ /**
+ * Returns true if the specified index is valid and has non-zero load
+ */
+ function isNonZeroLoad( $i ) {
+ return array_key_exists( $i, $this->mServers ) && $this->mLoads[$i] != 0;
+ }
+
/**
* Get the number of defined servers (not the number of open connections)
*/
//$wgDebugLogFile = '/dev/stdout';
-$numServers = count( $wgDBservers );
+$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;
}*/
-define( 'REPORTING_INTERVAL', 1000 );
+$reportingInterval = 1000;
if ( isset( $args[0] ) ) {
desyncFixPage( $args[0] );
$maxPage = $dbw->selectField( 'page', 'MAX(page_id)', false, 'fixDesync.php' );
for ( $i=1; $i <= $maxPage; $i++ ) {
desyncFixPage( $i );
- if ( !($i % REPORTING_INTERVAL) ) {
+ if ( !($i % $reportingInterval) ) {
print "$i\n";
}
}
}
function desyncFixPage( $pageID ) {
- global $numServers;
+ 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 );
- for ( $i = 1; $i < $numServers; $i++ ) {
+ $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 ( $i == $numServers ) {
+ if ( !$found ) {
return;
}
print "$rid ";
# Revision
$row = $dbw->selectRow( 'revision', '*', array( 'rev_id' => $rid ), $fname );
- for ( $i = 1; $i < $numServers; $i++ ) {
+ 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 );
- for ( $i = 1; $i < $numServers; $i++ ) {
+ foreach ( $slaveIndexes as $i ) {
$db =& wfGetDB( $i );
$db->insert( 'text', get_object_vars( $row ), $fname, 'IGNORE' );
}
}
print "Fixing page_latest... ";
- for ( $i = 1; $i < $numServers; $i++ ) {
+ foreach ( $slaveIndexes as $i ) {
$db =& wfGetDB( $i );
$db->update( 'page', array( 'page_latest' => $realLatest ), array( 'page_id' => $pageID ), $fname );
}