4 require_once( 'commandLine.inc' );
6 //$wgDebugLogFile = '/dev/stdout';
8 $slaveIndexes = array();
9 for ( $i = 1; $i < count( $wgDBservers ); $i++
) {
10 if ( $wgLoadBalancer->isNonZeroLoad( $i ) ) {
15 foreach ( $wgLoadBalancer->mServers as $i => $server ) {
16 $wgLoadBalancer->mServers[$i]['flags'] |= DBO_DEBUG;
18 $reportingInterval = 1000;
20 if ( isset( $args[0] ) ) {
21 desyncFixPage( $args[0] );
23 $dbw = wfGetDB( DB_MASTER
);
24 $maxPage = $dbw->selectField( 'page', 'MAX(page_id)', false, 'fixDesync.php' );
25 $corrupt = findPageLatestCorruption();
26 foreach ( $corrupt as $id => $dummy ) {
30 for ( $i=1; $i <= $maxPage; $i++ ) {
32 if ( !($i % $reportingInterval) ) {
38 function findPageLatestCorruption() {
41 $dbw = wfGetDB( DB_MASTER
);
43 $res = $dbw->select( 'page', array( 'page_id', 'page_latest' ), array( 'page_id<6054123' ), __METHOD__
);
44 print "Number of pages: " . $dbw->numRows( $res ) . "\n";
45 while ( $row = $dbw->fetchObject( $res ) ) {
46 $masterIDs[$row->page_id
] = $row->page_latest
;
47 if ( !( ++
$n %
10000 ) ) {
52 $dbw->freeResult( $res );
55 foreach ( $slaveIndexes as $i ) {
57 $res = $db->select( 'page', array( 'page_id', 'page_latest' ), array( 'page_id<6054123' ), __METHOD__
);
58 while ( $row = $db->fetchObject( $res ) ) {
59 if ( isset( $masterIDs[$row->page_id
] ) && $masterIDs[$row->page_id
] != $row->page_latest
) {
60 $desync[$row->page_id
] = true;
61 print $row->page_id
. "\t";
64 $db->freeResult( $res );
70 function desyncFixPage( $pageID ) {
72 $fname = 'desyncFixPage';
74 # Check for a corrupted page_latest
75 $dbw = wfGetDB( DB_MASTER
);
77 $realLatest = $dbw->selectField( 'page', 'page_latest', array( 'page_id' => $pageID ),
78 $fname, 'FOR UPDATE' );
79 #list( $masterFile, $masterPos ) = $dbw->getMasterPos();
81 foreach ( $slaveIndexes as $i ) {
84 if ( !$db->masterPosWait( $masterFile, $masterPos, 10 ) ) {
85 echo "Slave is too lagged, aborting\n";
90 $latest = $db->selectField( 'page', 'page_latest', array( 'page_id' => $pageID ), $fname );
91 $max = $db->selectField( 'revision', 'MAX(rev_id)', false, $fname );
92 if ( $latest != $realLatest && $realLatest < $max ) {
93 print "page_latest corrupted in page $pageID, server $i\n";
99 print "page_id $pageID seems fine\n";
104 # Find the missing revisions
105 $res = $dbw->select( 'revision', array( 'rev_id' ), array( 'rev_page' => $pageID ),
106 $fname, 'FOR UPDATE' );
107 $masterIDs = array();
108 while ( $row = $dbw->fetchObject( $res ) ) {
109 $masterIDs[] = $row->rev_id
;
111 $dbw->freeResult( $res );
113 $res = $db->select( 'revision', array( 'rev_id' ), array( 'rev_page' => $pageID ), $fname );
115 while ( $row = $db->fetchObject( $res ) ) {
116 $slaveIDs[] = $row->rev_id
;
118 $db->freeResult( $res );
119 if ( count( $masterIDs ) < count( $slaveIDs ) ) {
120 $missingIDs = array_diff( $slaveIDs, $masterIDs );
121 if ( count( $missingIDs ) ) {
122 print "Found " . count( $missingIDs ) . " lost in master, copying from slave... ";
130 $missingIDs = array_diff( $masterIDs, $slaveIDs );
131 if ( count( $missingIDs ) ) {
132 print "Found " . count( $missingIDs ) . " missing revision(s), copying from master... ";
142 foreach ( $missingIDs as $rid ) {
145 $row = $dbFrom->selectRow( 'revision', '*', array( 'rev_id' => $rid ), $fname );
147 $id = $dbw->selectField( 'revision', 'rev_id', array( 'rev_id' => $rid ),
148 $fname, 'FOR UPDATE' );
150 echo "Revision already exists\n";
154 $dbw->insert( 'revision', get_object_vars( $row ), $fname, 'IGNORE' );
157 foreach ( $slaveIndexes as $i ) {
159 $db->insert( 'revision', get_object_vars( $row ), $fname, 'IGNORE' );
164 $row = $dbFrom->selectRow( 'text', '*', array( 'old_id' => $row->rev_text_id
), $fname );
166 $dbw->insert( 'text', get_object_vars( $row ), $fname, 'IGNORE' );
168 foreach ( $slaveIndexes as $i ) {
170 $db->insert( 'text', get_object_vars( $row ), $fname, 'IGNORE' );
178 print "Fixing page_latest... ";
180 #$dbw->update( 'page', array( 'page_latest' => $realLatest ), array( 'page_id' => $pageID ), $fname );
182 foreach ( $slaveIndexes as $i ) {
184 $db->update( 'page', array( 'page_latest' => $realLatest ), array( 'page_id' => $pageID ), $fname );