<?php
-$user = 'wikiuser';
-$password = `/home/wikipedia/bin/wikiuser_pass`;
-$availableDBs = array_map( 'trim', file( "/home/wikipedia/common/pmtpa.dblist" ) );
-shuffle( $availableDBs );
+/*
+ * Pick a database that has pending jobs
+ */
-$dbs = array();
+$options = array( 'type' );
-# 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();
+require_once( 'commandLine.inc' );
+$type = isset($options['type'])
+ ? $options['type']
+ : false;
-# Now try the rest
-mysql_connect( 'ixia', $user, $password ) || myerror();
+$mckey = $type === false
+ ? "jobqueue:dbs"
+ : "jobqueue:dbs:$type";
-$sql = "(SELECT '-------------------------------------------')";
-foreach ( $availableDBs as $db ) {
- if ( $db == 'enwiki' ) {
- continue;
- }
- if ( $sql != '' ) {
- $sql .= ' UNION ';
+$pendingDBs = $wgMemc->get( $mckey );
+if ( !$pendingDBs ) {
+ $pendingDBs = array();
+ # Cross-reference DBs by master DB server
+ $dbsByMaster = array();
+ $defaultMaster = isset( $wgAlternateMaster['DEFAULT'] )
+ ? $wgAlternateMaster['DEFAULT']
+ : $wgDBserver;
+ 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, $dbs[0] );
+ $stype = $dbConn->addQuotes($type);
-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 ';
+ }
+ if ($type === false)
+ $sql .= "(SELECT '$dbName' FROM `$dbName`.job LIMIT 1)";
+ else
+ $sql .= "(SELECT '$dbName' FROM `$dbName`.job WHERE job_cmd=$stype 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( $mckey, $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)];
}
-?>
+
+