Reopen db connection after doing SpecialPageCacheUpdates

Special page updates on commons have been broken recently due
to Mysql "going away" after doing the ActiveUsers special page
cache update. Presumably this is because we were only repinging
the server after QueryPage updates, and not the callback updates
(Combined with a spike in wikidata recentchanges entries making
the ActiveUsers callback now take about an hour to complete)

Bug: T176055
Change-Id: Ic344940460c353544d7c08bbe2d8c900f6cc73da
This commit is contained in:
Brian Wolff 2017-09-26 21:51:31 +00:00
parent 756f1f6aa2
commit 67f04373d6

View file

@ -101,16 +101,7 @@ class UpdateSpecialPages extends Maintenance {
$this->output( sprintf( "%.2fs\n", $seconds ) );
}
# Reopen any connections that have closed
if ( !wfGetLB()->pingAll() ) {
$this->output( "\n" );
do {
$this->error( "Connection failed, reconnecting in 10 seconds..." );
sleep( 10 );
} while ( !wfGetLB()->pingAll() );
$this->output( "Reconnected\n\n" );
}
# Wait for the replica DB to catch up
wfWaitForSlaves();
$this->reopenAndWaitFotReplicas();
} else {
$this->output( "cheap, skipped\n" );
}
@ -121,6 +112,25 @@ class UpdateSpecialPages extends Maintenance {
}
}
/**
* Re-open any closed db connection, and wait for replicas
*
* Queries that take a really long time, might cause the
* mysql connection to "go away"
*/
private function reopenAndWaiFotReplicas() {
if ( !wfGetLB()->pingAll() ) {
$this->output( "\n" );
do {
$this->error( "Connection failed, reconnecting in 10 seconds..." );
sleep( 10 );
} while ( !wfGetLB()->pingAll() );
$this->output( "Reconnected\n\n" );
}
# Wait for the replica DB to catch up
wfWaitForSlaves();
}
public function doSpecialPageCacheUpdates( $dbw ) {
global $wgSpecialPageCacheUpdates;
@ -154,7 +164,7 @@ class UpdateSpecialPages extends Maintenance {
}
$this->output( sprintf( "%.2fs\n", $seconds ) );
# Wait for the replica DB to catch up
wfWaitForSlaves();
$this->reopenAndWaitForReplicas();
}
}
}