From 0844db0b6d98d8346d8561d53691219fc51cab2c Mon Sep 17 00:00:00 2001 From: Aaron Schulz Date: Fri, 2 Aug 2019 15:28:18 -0400 Subject: [PATCH] Make the JobRunner flushReplicaSnapshots() call cover the first job If JobRunner is called when replica transactions exists, the first job would previously use the stale REPEATABLE-READ snapshot data. Also clear any master connection snapshots via commitMasterChanges(). This makes the code more similar to DeferredUpdates::attemptUpdate(). Change-Id: I2157a91fb01ea8c233f964b1f3164e8c3b1a07ca --- includes/jobqueue/JobRunner.php | 20 ++++++++++++-------- 1 file changed, 12 insertions(+), 8 deletions(-) diff --git a/includes/jobqueue/JobRunner.php b/includes/jobqueue/JobRunner.php index 21d8c7e8af..adb4221cc5 100644 --- a/includes/jobqueue/JobRunner.php +++ b/includes/jobqueue/JobRunner.php @@ -279,16 +279,26 @@ class JobRunner implements LoggerAwareInterface { ] ); $this->debugCallback( $msg ); + // Clear out title cache data from prior snapshots + // (e.g. from before JobRunner was invoked in this process) + MediaWikiServices::getInstance()->getLinkCache()->clear(); + // Run the job... $rssStart = $this->getMaxRssKb(); $jobStartTime = microtime( true ); try { $fnameTrxOwner = get_class( $job ) . '::run'; // give run() outer scope - if ( !$job->hasExecutionFlag( $job::JOB_NO_EXPLICIT_TRX_ROUND ) ) { - $lbFactory->beginMasterChanges( $fnameTrxOwner ); + // Flush any pending changes left over from an implicit transaction round + if ( $job->hasExecutionFlag( $job::JOB_NO_EXPLICIT_TRX_ROUND ) ) { + $lbFactory->commitMasterChanges( $fnameTrxOwner ); // new implicit round + } else { + $lbFactory->beginMasterChanges( $fnameTrxOwner ); // new explicit round } + // Clear any stale REPEATABLE-READ snapshots from replica DB connections + $lbFactory->flushReplicaSnapshots( $fnameTrxOwner ); $status = $job->run(); $error = $job->getLastError(); + // Commit all pending changes from this job $this->commitMasterChanges( $lbFactory, $job, $fnameTrxOwner ); // Run any deferred update tasks; doUpdates() manages transactions itself DeferredUpdates::doUpdates(); @@ -304,12 +314,6 @@ class JobRunner implements LoggerAwareInterface { MWExceptionHandler::logException( $e ); } - // Commit all outstanding connections that are in a transaction - // to get a fresh repeatable read snapshot on every connection. - // Note that jobs are still responsible for handling replica DB lag. - $lbFactory->flushReplicaSnapshots( __METHOD__ ); - // Clear out title cache data from prior snapshots - MediaWikiServices::getInstance()->getLinkCache()->clear(); $timeMs = intval( ( microtime( true ) - $jobStartTime ) * 1000 ); $rssEnd = $this->getMaxRssKb(); -- 2.20.1