In fixSlaveDesync.php, don't check slaves that have zero load.
This commit is contained in:
parent
50c5b04d49
commit
c6f0a73ae0
2 changed files with 35 additions and 15 deletions
|
|
@ -484,21 +484,34 @@ class LoadBalancer {
|
|||
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)
|
||||
*/
|
||||
|
|
|
|||
|
|
@ -5,12 +5,17 @@ require_once( 'commandLine.inc' );
|
|||
|
||||
//$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] );
|
||||
|
|
@ -19,29 +24,31 @@ if ( isset( $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;
|
||||
}
|
||||
|
||||
|
|
@ -67,14 +74,14 @@ function desyncFixPage( $pageID ) {
|
|||
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' );
|
||||
}
|
||||
|
|
@ -83,7 +90,7 @@ function desyncFixPage( $pageID ) {
|
|||
}
|
||||
|
||||
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 );
|
||||
}
|
||||
|
|
|
|||
Loading…
Reference in a new issue