In fixSlaveDesync.php, don't check slaves that have zero load.
authorTim Starling <tstarling@users.mediawiki.org>
Sat, 3 Jun 2006 22:20:31 +0000 (22:20 +0000)
committerTim Starling <tstarling@users.mediawiki.org>
Sat, 3 Jun 2006 22:20:31 +0000 (22:20 +0000)
includes/LoadBalancer.php
maintenance/fixSlaveDesync.php

index 6cf743b..d77cf3f 100644 (file)
@@ -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)
         */
index 441ca2b..e97f96c 100644 (file)
@@ -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 );
        }