diff --git a/includes/MediaWiki.php b/includes/MediaWiki.php index a7214c7ce65..2125c23499d 100644 --- a/includes/MediaWiki.php +++ b/includes/MediaWiki.php @@ -898,12 +898,13 @@ class MediaWiki { __METHOD__ ); + // Push lazilly-pushed jobs + // Important: this must be the last deferred update added (T100085, T154425) + DeferredUpdates::addCallableUpdate( [ 'JobQueueGroup', 'pushLazyJobs' ] ); + // Do any deferred jobs DeferredUpdates::doUpdates( 'enqueue' ); - // Make sure any lazy jobs are pushed - JobQueueGroup::pushLazyJobs(); - // Now that everything specific to this request is done, // try to occasionally run jobs (if enabled) from the queues if ( $mode === 'normal' ) { diff --git a/includes/jobqueue/JobQueueDB.php b/includes/jobqueue/JobQueueDB.php index 924aacc7447..5e457300e93 100644 --- a/includes/jobqueue/JobQueueDB.php +++ b/includes/jobqueue/JobQueueDB.php @@ -185,15 +185,13 @@ class JobQueueDB extends JobQueue { * @return void */ protected function doBatchPush( array $jobs, $flags ) { - $dbw = $this->getMasterDB(); - - $method = __METHOD__; - $dbw->onTransactionIdle( - function () use ( $dbw, $jobs, $flags, $method ) { - $this->doBatchPushInternal( $dbw, $jobs, $flags, $method ); - }, - __METHOD__ - ); + DeferredUpdates::addUpdate( new AutoCommitUpdate( + wfGetDB( DB_MASTER ), + __METHOD__, + function ( IDatabase $dbw, $fname ) use ( $jobs, $flags ) { + $this->doBatchPushInternal( $dbw, $jobs, $flags, $fname ); + } + ) ); } /** diff --git a/includes/jobqueue/JobQueueGroup.php b/includes/jobqueue/JobQueueGroup.php index 9f78404efea..5d5ea26df61 100644 --- a/includes/jobqueue/JobQueueGroup.php +++ b/includes/jobqueue/JobQueueGroup.php @@ -163,7 +163,9 @@ class JobQueueGroup { /** * Buffer jobs for insertion via push() or call it now if in CLI mode * - * Note that MediaWiki::restInPeace() calls pushLazyJobs() + * Note that pushLazyJobs() is registered as a deferred update just before + * DeferredUpdates::doUpdates() in MediaWiki and JobRunner classes in order + * to be executed as the very last deferred update (T100085, T154425). * * @param IJobSpecification|IJobSpecification[] $jobs A single Job or a list of Jobs * @return void diff --git a/includes/jobqueue/JobRunner.php b/includes/jobqueue/JobRunner.php index a1aeaba4357..0a0e9e0eb00 100644 --- a/includes/jobqueue/JobRunner.php +++ b/includes/jobqueue/JobRunner.php @@ -289,10 +289,11 @@ class JobRunner implements LoggerAwareInterface { $status = $job->run(); $error = $job->getLastError(); $this->commitMasterChanges( $lbFactory, $job, $fnameTrxOwner ); + // Push lazilly-pushed jobs + // Important: this must be the last deferred update added (T100085, T154425) + DeferredUpdates::addCallableUpdate( [ 'JobQueueGroup', 'pushLazyJobs' ] ); // Run any deferred update tasks; doUpdates() manages transactions itself DeferredUpdates::doUpdates(); - // Push lazy jobs added by the job or its deferred udpates - JobQueueGroup::pushLazyJobs(); } catch ( Exception $e ) { MWExceptionHandler::rollbackMasterChangesAndLog( $e ); $status = false;