__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' ) {
* @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 );
+ }
+ ) );
}
/**
/**
* 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
$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;