Merge "Don't armor french spaces before punctuation followed by word characters"
[lhc/web/wiklou.git] / maintenance / updateSpecialPages.php
index 5ea3828..01aace0 100644 (file)
@@ -24,6 +24,9 @@
 
 require_once __DIR__ . '/Maintenance.php';
 
+use MediaWiki\MediaWikiServices;
+use Wikimedia\Rdbms\DBReplicationWaitError;
+
 /**
  * Maintenance script to update cached special pages.
  *
@@ -48,7 +51,7 @@ class UpdateSpecialPages extends Maintenance {
 
                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' ) ) {
@@ -72,7 +75,7 @@ class UpdateSpecialPages extends Maintenance {
                                $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;
                        }
 
@@ -81,7 +84,7 @@ class UpdateSpecialPages extends Maintenance {
                                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" );
@@ -101,16 +104,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->reopenAndWaitForReplicas();
                                } else {
                                        $this->output( "cheap, skipped\n" );
                                }
@@ -121,6 +115,31 @@ 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 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;
 
@@ -154,11 +173,11 @@ class UpdateSpecialPages extends Maintenance {
                                }
                                $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;