Add --wait option for runJobs.php
authorNiklas Laxström <niklas.laxstrom@gmail.com>
Sat, 20 Feb 2016 20:22:58 +0000 (21:22 +0100)
committerNemo bis <federicoleva@tiscali.it>
Sun, 21 Feb 2016 09:24:39 +0000 (09:24 +0000)
It is now very easy to implement a simple low delay job runner:

while true; do php runJobs.php --wait; sleep 1; done;

Change-Id: I50cf00aed4b15d90384a2cc12bddd64d96d5a1ad

maintenance/runJobs.php

index 0ac81a4..c3c2391 100644 (file)
@@ -40,6 +40,7 @@ class RunJobs extends Maintenance {
                $this->addOption( 'procs', 'Number of processes to use', false, true );
                $this->addOption( 'nothrottle', 'Ignore job throttling configuration', false, false );
                $this->addOption( 'result', 'Set to JSON to print only a JSON response', false, true );
+               $this->addOption( 'wait', 'Wait for new jobs instead of exiting', false, false );
        }
 
        public function memoryLimit() {
@@ -67,6 +68,7 @@ class RunJobs extends Maintenance {
                }
 
                $outputJSON = ( $this->getOption( 'result' ) === 'json' );
+               $wait = $this->hasOption( 'wait' );
 
                // Enable DBO_TRX for atomicity; JobRunner manages transactions
                // and works well in web server mode already (@TODO: this is a hack)
@@ -77,15 +79,37 @@ class RunJobs extends Maintenance {
                        $runner->setDebugHandler( [ $this, 'debugInternal' ] );
                }
 
-               $response = $runner->run( [
-                       'type'     => $this->getOption( 'type', false ),
-                       'maxJobs'  => $this->getOption( 'maxjobs', false ),
-                       'maxTime'  => $this->getOption( 'maxtime', false ),
-                       'throttle' => $this->hasOption( 'nothrottle' ) ? false : true,
-               ] );
+               $type = $this->getOption( 'type', false );
+               $maxJobs = $this->getOption( 'maxjobs', false );
+               $maxTime = $this->getOption( 'maxtime', false );
+               $throttle = !$this->hasOption( 'nothrottle' );
 
-               if ( $outputJSON ) {
-                       $this->output( FormatJson::encode( $response, true ) );
+               while ( true ) {
+                       $response = $runner->run( [
+                               'type'     => $type,
+                               'maxJobs'  => $maxJobs,
+                               'maxTime'  => $maxTime,
+                               'throttle' => $throttle,
+                       ] );
+
+                       if ( $outputJSON ) {
+                               $this->output( FormatJson::encode( $response, true ) );
+                       }
+
+                       if (
+                               !$wait ||
+                               $response['reached'] === 'time-limit' ||
+                               $response['reached'] === 'job-limit' ||
+                               $response['reached'] === 'memory-limit'
+                       ) {
+                               break;
+                       }
+
+                       if ( $maxJobs !== false ) {
+                               $maxJobs -= count( $response['jobs'] );
+                       }
+
+                       sleep( 1 );
                }
 
                $wgCommandLineMode = true;