Proposed new method which will work with split master. Committing for test on server.
authorTim Starling <tstarling@users.mediawiki.org>
Mon, 26 Feb 2007 00:19:17 +0000 (00:19 +0000)
committerTim Starling <tstarling@users.mediawiki.org>
Mon, 26 Feb 2007 00:19:17 +0000 (00:19 +0000)
maintenance/nextJobDB.php

index f67b026..7aa05a2 100644 (file)
@@ -1,65 +1,48 @@
 <?php
 
-$user = 'wikiuser';
-$password = `/home/wikipedia/bin/wikiuser_pass`;
-$availableDBs = array_map( 'trim', file( "/home/wikipedia/common/pmtpa.dblist" ) );
-shuffle( $availableDBs );
-
-$dbs = array();
-
-# Connect to enwiki
-mysql_connect( 'db4', $user, $password ) || myerror();
-mysql_select_db( 'enwiki' ) || myerror();
-( $res = mysql_query( 'SELECT 1 FROM job LIMIT 1' ) ) || myerror();
-$enwikiHasJobs = ( mysql_num_rows( $res ) != 0 );
-mysql_free_result( $res );
-mysql_close();
-
-
-# Now try the rest
-mysql_connect( 'ixia', $user, $password ) || myerror();
-
-$sql = "(SELECT '-------------------------------------------')";
-foreach ( $availableDBs as $db ) {
-       if ( $db == 'enwiki' ) {
-               continue;
-       }
-       if ( $sql != '' ) {
-               $sql .= ' UNION ';
+/*
+ * Pick a database that has pending jobs
+ */
+
+require_once( 'commandLine.inc' );
+
+$pendingDBs = $wgMemc->get( 'jobqueue:dbs' );
+if ( !$pendingDBs ) {
+       $pendingDBs = array();
+       # Cross-reference DBs by master DB server
+       $dbsByMaster = array();
+       $defaultMaster = $wgAlternateMaster['DEFAULT'];
+       foreach ( $wgLocalDatabases as $db ) {
+               if ( isset( $wgAlternateMaster[$db] ) ) {
+                       $dbsByMaster[$wgAlternateMaster[$db]][] = $db;
+               } else {
+                       $dbsByMaster[$defaultMaster][] = $db;
+               }
        }
-       $sql .= "(SELECT '$db' FROM `$db`.job)";
-}
-$sql .= ' LIMIT 1,1';
-( $res = mysql_query( $sql ) ) || myerror();
-$row = mysql_fetch_row( $res );
-if ( $row ) {
-       $db = $row[0];
-} else {
-       $db = false;
-}
-
-mysql_free_result( $res );
-mysql_close();
 
+       foreach ( $dbsByMaster as $master => $dbs ) {
+               $dbConn = new Database( $master, $wgDBuser, $wgDBpassword );
 
-if ( $enwikiHasJobs ) {
-       if ( $db ) {
-               # Choose enwiki with arbitrary constant probability
-               if ( mt_rand( 0, 4 ) == 0 ) {
-                       $db = 'enwiki';
+               # Padding row for MySQL bug
+               $sql = "(SELECT '-------------------------------------------')";
+               foreach ( $dbs as $dbName ) {
+                       if ( $sql != '' ) {
+                               $sql .= ' UNION ';
+                       }
+                       $sql .= "(SELECT '$dbName' FROM `$dbName`.job LIMIT 1)";
+               }
+               $res = $dbConn->query( $sql, 'nextJobDB.php' );
+               $row = $dbConn->fetchRow( $res ); // discard padding row
+               while ( $row = $dbConn->fetchRow( $res ) ) {
+                       $pendingDBs[] = $row[0];
                }
-       } else {
-               $db = 'enwiki';
        }
-}
 
-if ( $db ) {
-       echo $db;
+       $wgMemc->set( 'jobqueue:dbs', $pendingDBs, 300 );
 }
 
-function myerror() {
-       $f = fopen( 'php://stderr', 'w' );
-       fwrite( $f, mysql_error() . "\n" );
-       exit(1);
+if ( $pendingDBs ) {
+       echo $pendingDBs[mt_rand(0, count( $pendingDBs ) - 1)];
 }
+
 ?>