summaryrefslogtreecommitdiff
path: root/maintenance/nextJobDB.php
diff options
context:
space:
mode:
Diffstat (limited to 'maintenance/nextJobDB.php')
-rw-r--r--maintenance/nextJobDB.php48
1 files changed, 48 insertions, 0 deletions
diff --git a/maintenance/nextJobDB.php b/maintenance/nextJobDB.php
new file mode 100644
index 00000000..7aa05a27
--- /dev/null
+++ b/maintenance/nextJobDB.php
@@ -0,0 +1,48 @@
+<?php
+
+/*
+ * 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;
+ }
+ }
+
+ foreach ( $dbsByMaster as $master => $dbs ) {
+ $dbConn = new Database( $master, $wgDBuser, $wgDBpassword );
+
+ # 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];
+ }
+ }
+
+ $wgMemc->set( 'jobqueue:dbs', $pendingDBs, 300 );
+}
+
+if ( $pendingDBs ) {
+ echo $pendingDBs[mt_rand(0, count( $pendingDBs ) - 1)];
+}
+
+?>