Merge "Explicitly mark HTMLCacheUpdateJob jobs that are recursive for clarity"
[lhc/web/wiklou.git] / maintenance / fixSlaveDesync.php
index 321c041..a5418ce 100644 (file)
@@ -1,5 +1,7 @@
 <?php
 /**
+ * Fix erroneous page_latest values due to slave desynchronisation.
+ *
  * 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
  * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
  * http://www.gnu.org/copyleft/gpl.html
  *
+ * @file
  * @ingroup Maintenance
  */
 
-require_once( dirname( __FILE__ ) . '/Maintenance.php' );
+require_once __DIR__ . '/Maintenance.php';
 
+/**
+ * Maintenance script that fixes erroneous page_latest values
+ * due to slave desynchronisation.
+ *
+ * @ingroup Maintenance
+ */
 class FixSlaveDesync extends Maintenance {
+       /** @var array */
+       private $slaveIndexes;
+
        public function __construct() {
                parent::__construct();
                $this->mDescription = "";
-               
        }
-       
+
+       public function getDbType() {
+               return Maintenance::DB_ADMIN;
+       }
+
        public function execute() {
-               global $wgDBservers;
                $this->slaveIndexes = array();
-               for ( $i = 1; $i < count( $wgDBservers ); $i++ ) {
+               $serverCount = wfGetLB()->getServerCount();
+               for ( $i = 1; $i < $serverCount; $i++ ) {
                        if ( wfGetLB()->isNonZeroLoad( $i ) ) {
                                $this->slaveIndexes[] = $i;
                        }
@@ -39,8 +54,6 @@ class FixSlaveDesync extends Maintenance {
                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 );
@@ -57,8 +70,13 @@ class FixSlaveDesync extends Maintenance {
                $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" );
+               $res = $dbw->select(
+                       'page',
+                       array( 'page_id', 'page_latest' ),
+                       array( 'page_id<6054123' ),
+                       __METHOD__
+               );
+               $this->output( "Number of pages: " . $res->numRows() . "\n" );
                foreach ( $res as $row ) {
                        $masterIDs[$row->page_id] = $row->page_latest;
                        if ( !( ++$n % 10000 ) ) {
@@ -69,7 +87,12 @@ class FixSlaveDesync extends Maintenance {
 
                foreach ( $this->slaveIndexes as $i ) {
                        $db = wfGetDB( $i );
-                       $res = $db->select( 'page', array( 'page_id', 'page_latest' ), array( 'page_id<6054123' ), __METHOD__ );
+                       $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;
@@ -78,17 +101,18 @@ class FixSlaveDesync extends Maintenance {
                        }
                }
                $this->output( "\n" );
+
                return $desync;
        }
 
        /**
         * Fix a broken page entry
-        * @param $pageID int The page_id to fix
+        * @param int $pageID The page_id to fix
         */
        private function desyncFixPage( $pageID ) {
                # Check for a corrupted page_latest
                $dbw = wfGetDB( DB_MASTER );
-               $dbw->begin();
+               $dbw->begin( __METHOD__ );
                $realLatest = $dbw->selectField( 'page', 'page_latest', array( 'page_id' => $pageID ),
                        __METHOD__, 'FOR UPDATE' );
                # list( $masterFile, $masterPos ) = $dbw->getMasterPos();
@@ -97,10 +121,10 @@ class FixSlaveDesync extends Maintenance {
                        $db = wfGetDB( $i );
                        /*
                        if ( !$db->masterPosWait( $masterFile, $masterPos, 10 ) ) {
-                                  $this->output( "Slave is too lagged, aborting\n" );
-                                  $dbw->commit();
-                                  sleep(10);
-                                  return;
+                               $this->output( "Slave is too lagged, aborting\n" );
+                               $dbw->commit( __METHOD__ );
+                               sleep(10);
+                               return;
                        }*/
                        $latest = $db->selectField( 'page', 'page_latest', array( 'page_id' => $pageID ), __METHOD__ );
                        $max = $db->selectField( 'revision', 'MAX(rev_id)', false, __METHOD__ );
@@ -112,7 +136,8 @@ class FixSlaveDesync extends Maintenance {
                }
                if ( !$found ) {
                        $this->output( "page_id $pageID seems fine\n" );
-                       $dbw->commit();
+                       $dbw->commit( __METHOD__ );
+
                        return;
                }
 
@@ -124,7 +149,7 @@ class FixSlaveDesync extends Maintenance {
                        $masterIDs[] = $row->rev_id;
                }
 
-               $res = $db->select( 'revision', array( 'rev_id' ), array( 'rev_page' => $pageID ), __METHOD__ );
+               $res = $dbw->select( 'revision', array( 'rev_id' ), array( 'rev_page' => $pageID ), __METHOD__ );
                $slaveIDs = array();
                foreach ( $res as $row ) {
                        $slaveIDs[] = $row->rev_id;
@@ -132,8 +157,9 @@ class FixSlaveDesync extends Maintenance {
                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;
+                               $this->output( "Found " . count( $missingIDs )
+                                       . " lost in master, copying from slave... " );
+                               $dbFrom = $dbw;
                                $found = true;
                                $toMaster = true;
                        } else {
@@ -142,7 +168,8 @@ class FixSlaveDesync extends Maintenance {
                } else {
                        $missingIDs = array_diff( $masterIDs, $slaveIDs );
                        if ( count( $missingIDs ) ) {
-                               $this->output( "Found " . count( $missingIDs ) . " missing revision(s), copying from master... " );
+                               $this->output( "Found " . count( $missingIDs )
+                                       . " missing revision(s), copying from master... " );
                                $dbFrom = $dbw;
                                $found = true;
                                $toMaster = false;
@@ -190,18 +217,30 @@ class FixSlaveDesync extends Maintenance {
                if ( $found ) {
                        $this->output( "Fixing page_latest... " );
                        if ( $toMaster ) {
-                               # $dbw->update( 'page', array( 'page_latest' => $realLatest ), array( 'page_id' => $pageID ), __METHOD__ );
+                               /*
+                               $dbw->update(
+                                       'page',
+                                       array( 'page_latest' => $realLatest ),
+                                       array( 'page_id' => $pageID ),
+                                       __METHOD__
+                               );
+                               */
                        } else {
                                foreach ( $this->slaveIndexes as $i ) {
                                        $db = wfGetDB( $i );
-                                       $db->update( 'page', array( 'page_latest' => $realLatest ), array( 'page_id' => $pageID ), __METHOD__ );
+                                       $db->update(
+                                               'page',
+                                               array( 'page_latest' => $realLatest ),
+                                               array( 'page_id' => $pageID ),
+                                               __METHOD__
+                                       );
                                }
                        }
                        $this->output( "done\n" );
                }
-               $dbw->commit();
+               $dbw->commit( __METHOD__ );
        }
 }
 
 $maintClass = "FixSlaveDesync";
-require_once( DO_MAINTENANCE );
+require_once RUN_MAINTENANCE_IF_MAIN;