[JobQueue] Try to cut down on waitForBackups() calls in runJobs.php.
[lhc/web/wiklou.git] / maintenance / runJobs.php
index ff09683..b1be714 100644 (file)
@@ -73,7 +73,7 @@ class RunJobs extends Maintenance {
                $type = $this->getOption( 'type', false );
                $wgTitle = Title::newFromText( 'RunJobs.php' );
                $dbw = wfGetDB( DB_MASTER );
-               $n = 0;
+               $jobsRun = 0; // counter
 
                $group = JobQueueGroup::singleton();
                // Handle any required periodic queue maintenance
@@ -82,40 +82,53 @@ class RunJobs extends Maintenance {
                        $this->runJobsLog( "Executed $count periodic queue task(s)." );
                }
 
+               $lastTime = time();
                do {
                        $job = ( $type === false )
                                ? $group->pop( JobQueueGroup::TYPE_DEFAULT, JobQueueGroup::USE_CACHE )
-                               : $group->get( $type )->pop(); // job from a single queue
+                               : $group->pop( $type ); // job from a single queue
                        if ( $job ) { // found a job
-                               // Perform the job (logging success/failure and runtime)...
-                               $t = microtime( true );
+                               ++$jobsRun;
                                $this->runJobsLog( $job->toString() . " STARTING" );
 
-                               $status = $job->run();
-                               if ( !is_bool( $status ) ) {
-                                       wfWarn( $job->getType() . " job failed to return a boolean." );
-                                       $status = true; // sanity
+                               // Run the job...
+                               $t = microtime( true );
+                               try {
+                                       $status = $job->run();
+                                       $error = $job->getLastError();
+                               } catch ( MWException $e ) {
+                                       $status = false;
+                                       $error = get_class( $e ) . ': ' . $e->getMessage();
                                }
-                               if ( $status || !$job->allowRetries() ) {
+                               $timeMs = intval( ( microtime( true ) - $t ) * 1000 );
+
+                               // Mark the job as done on success or when the job cannot be retried
+                               if ( $status !== false || !$job->allowRetries() ) {
                                        $group->ack( $job ); // done
                                }
 
-                               $t = microtime( true ) - $t;
-                               $timeMs = intval( $t * 1000 );
                                if ( !$status ) {
-                                       $this->runJobsLog( $job->toString() . " t=$timeMs error={$job->error}" );
+                                       $this->runJobsLog( $job->toString() . " t=$timeMs error={$error}" );
                                } else {
                                        $this->runJobsLog( $job->toString() . " t=$timeMs good" );
                                }
+
                                // Break out if we hit the job count or wall time limits...
-                               if ( $maxJobs && ++$n >= $maxJobs ) {
+                               if ( $maxJobs && $jobsRun >= $maxJobs ) {
                                        break;
-                               }
-                               if ( $maxTime && ( time() - $startTime ) > $maxTime ) {
+                               } elseif ( $maxTime && ( time() - $startTime ) > $maxTime ) {
                                        break;
                                }
-                               // Don't let any slaves/backups fall behind...
-                               $group->get( $job->getType() )->waitForBackups();
+
+                               // Don't let any of the main DB slaves get backed up
+                               $timePassed = time() - $lastTime;
+                               if ( $timePassed >= 5 || $timePassed < 0 ) {
+                                       wfWaitForSlaves();
+                               }
+                               // Don't let any queue slaves/backups fall behind
+                               if ( $jobsRun > 0 && ( $jobsRun % 100 ) == 0 ) {
+                                       $group->waitForBackups();
+                               }
                        }
                } while ( $job ); // stop when there are no jobs
        }