- # Find the missing revision
- $res = $dbw->select( 'revision', array( 'rev_id' ), array( 'rev_page' => $pageID ), $fname );
- $masterIDs = array();
- while ( $row = $dbw->fetchObject( $res ) ) {
- $masterIDs[] = $row->rev_id;
- }
- $dbw->freeResult( $res );
+ /**
+ * Fix a broken page entry
+ * @param $pageID int The page_id to fix
+ */
+ private function desyncFixPage( $pageID ) {
+ # Check for a corrupted page_latest
+ $dbw = wfGetDB( DB_MASTER );
+ $dbw->begin( __METHOD__ );
+ $realLatest = $dbw->selectField( 'page', 'page_latest', array( 'page_id' => $pageID ),
+ __METHOD__, 'FOR UPDATE' );
+ # list( $masterFile, $masterPos ) = $dbw->getMasterPos();
+ $found = false;
+ foreach ( $this->slaveIndexes as $i ) {
+ $db = wfGetDB( $i );
+ /*
+ if ( !$db->masterPosWait( $masterFile, $masterPos, 10 ) ) {
+ $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__ );
+ 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( __METHOD__ );
+ return;
+ }