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