require_once __DIR__ . '/Maintenance.php';
+use MediaWiki\MediaWikiServices;
+use Wikimedia\Rdbms\DBReplicationWaitError;
+
/**
* Maintenance script to update cached special pages.
*
foreach ( QueryPage::getPages() as $page ) {
list( $class, $special ) = $page;
- $limit = isset( $page[2] ) ? $page[2] : null;
+ $limit = $page[2] ?? null;
# --list : just show the name of pages
if ( $this->hasOption( 'list' ) ) {
$queryPage = $specialObj;
} else {
$class = get_class( $specialObj );
- $this->error( "$class is not an instance of QueryPage.\n", 1 );
+ $this->fatalError( "$class is not an instance of QueryPage.\n" );
die;
}
if ( $queryPage->isExpensive() ) {
$t1 = microtime( true );
# Do the query
- $num = $queryPage->recache( $limit === null ? $wgQueryCacheLimit : $limit );
+ $num = $queryPage->recache( $limit ?? $wgQueryCacheLimit );
$t2 = microtime( true );
if ( $num === false ) {
$this->output( "FAILED: database error\n" );
$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->reopenAndWaitForReplicas();
} else {
$this->output( "cheap, skipped\n" );
}
}
}
+ /**
+ * 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 reopenAndWaitForReplicas() {
+ $lbFactory = MediaWikiServices::getInstance()->getDBLoadBalancerFactory();
+ $lb = $lbFactory->getMainLB();
+ if ( !$lb->pingAll() ) {
+ $this->output( "\n" );
+ do {
+ $this->error( "Connection failed, reconnecting in 10 seconds..." );
+ sleep( 10 );
+ } while ( !$lb->pingAll() );
+ $this->output( "Reconnected\n\n" );
+ }
+ // Wait for the replica DB to catch up
+ try {
+ $lbFactory->waitForReplication();
+ } catch ( DBReplicationWaitError $e ) {
+ // ignore
+ }
+ }
+
public function doSpecialPageCacheUpdates( $dbw ) {
global $wgSpecialPageCacheUpdates;
}
$this->output( sprintf( "%.2fs\n", $seconds ) );
# Wait for the replica DB to catch up
- wfWaitForSlaves();
+ $this->reopenAndWaitForReplicas();
}
}
}
}
-$maintClass = "UpdateSpecialPages";
+$maintClass = UpdateSpecialPages::class;
require_once RUN_MAINTENANCE_IF_MAIN;