* Remove redundant extra span tag
[lhc/web/wiklou.git] / maintenance / fixSlaveDesync.php
1 <?php
2
3 $wgUseRootUser = true;
4 require_once( 'commandLine.inc' );
5
6 //$wgDebugLogFile = '/dev/stdout';
7
8 $numServers = count( $wgDBservers );
9 /*
10 foreach ( $wgLoadBalancer->mServers as $i => $server ) {
11 $wgLoadBalancer->mServers[$i]['flags'] |= DBO_DEBUG;
12 }*/
13 define( 'REPORTING_INTERVAL', 1000 );
14
15 if ( isset( $args[0] ) ) {
16 desyncFixPage( $args[0] );
17 } else {
18 $dbw =& wfGetDB( DB_MASTER );
19 $maxPage = $dbw->selectField( 'page', 'MAX(page_id)', false, 'fixDesync.php' );
20 for ( $i=1; $i <= $maxPage; $i++ ) {
21 desyncFixPage( $i );
22 if ( !($i % REPORTING_INTERVAL) ) {
23 print "$i\n";
24 }
25 }
26 }
27
28 function desyncFixPage( $pageID ) {
29 global $numServers;
30 $fname = 'desyncFixPage';
31
32 # Check for a corrupted page_latest
33 $dbw =& wfGetDB( DB_MASTER );
34 $realLatest = $dbw->selectField( 'page', 'page_latest', array( 'page_id' => $pageID ), $fname );
35 for ( $i = 1; $i < $numServers; $i++ ) {
36 $db =& wfGetDB( $i );
37 $latest = $db->selectField( 'page', 'page_latest', array( 'page_id' => $pageID ), $fname );
38 $max = $db->selectField( 'revision', 'MAX(rev_id)', false, $fname );
39 if ( $latest != $realLatest && $realLatest < $max ) {
40 print "page_latest corrupted in page $pageID, server $i\n";
41 break;
42 }
43 }
44 if ( $i == $numServers ) {
45 return;
46 }
47
48 # Find the missing revision
49 $res = $dbw->select( 'revision', array( 'rev_id' ), array( 'rev_page' => $pageID ), $fname );
50 $masterIDs = array();
51 while ( $row = $dbw->fetchObject( $res ) ) {
52 $masterIDs[] = $row->rev_id;
53 }
54 $dbw->freeResult( $res );
55
56 $res = $db->select( 'revision', array( 'rev_id' ), array( 'rev_page' => $pageID ), $fname );
57 $slaveIDs = array();
58 while ( $row = $db->fetchObject( $res ) ) {
59 $slaveIDs[] = $row->rev_id;
60 }
61 $db->freeResult( $res );
62 $missingIDs = array_diff( $masterIDs, $slaveIDs );
63
64 if ( count( $missingIDs ) ) {
65 print "Found " . count( $missingIDs ) . " missing revision(s), copying from master... ";
66 foreach ( $missingIDs as $rid ) {
67 print "$rid ";
68 # Revision
69 $row = $dbw->selectRow( 'revision', '*', array( 'rev_id' => $rid ), $fname );
70 for ( $i = 1; $i < $numServers; $i++ ) {
71 $db =& wfGetDB( $i );
72 $db->insert( 'revision', get_object_vars( $row ), $fname, 'IGNORE' );
73 }
74
75 # Text
76 $row = $dbw->selectRow( 'text', '*', array( 'old_id' => $row->rev_text_id ), $fname );
77 for ( $i = 1; $i < $numServers; $i++ ) {
78 $db =& wfGetDB( $i );
79 $db->insert( 'text', get_object_vars( $row ), $fname, 'IGNORE' );
80 }
81 }
82 print "done\n";
83 }
84
85 print "Fixing page_latest... ";
86 for ( $i = 1; $i < $numServers; $i++ ) {
87 $db =& wfGetDB( $i );
88 $db->update( 'page', array( 'page_latest' => $realLatest ), array( 'page_id' => $pageID ), $fname );
89 }
90 print "done\n";
91 }
92
93 ?>