Reopen db connection after doing SpecialPageCacheUpdates
authorBrian Wolff <bawolff+wn@gmail.com>
Tue, 26 Sep 2017 21:51:31 +0000 (21:51 +0000)
committerBrian Wolff <bawolff+wn@gmail.com>
Wed, 27 Sep 2017 22:48:31 +0000 (22:48 +0000)
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

maintenance/updateSpecialPages.php

index 5ea3828..cc9f763 100644 (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();
                        }
                }
        }