X-Git-Url: http://git.cyclocoop.org/%7B%24admin_url%7Dmes_infos.php?a=blobdiff_plain;f=includes%2Fjobqueue%2FJobRunner.php;h=adb4221cc5ce447f608103dfd5237cbc8945214c;hb=c63a37679c8e96940702fa84e4def02484dd8e24;hp=454f694c8451b5c06acc65bc77a9c93b038adda7;hpb=b76b9e9745955cdd0b610927800dfb6e2a660008;p=lhc%2Fweb%2Fwiklou.git diff --git a/includes/jobqueue/JobRunner.php b/includes/jobqueue/JobRunner.php index 454f694c84..adb4221cc5 100644 --- a/includes/jobqueue/JobRunner.php +++ b/includes/jobqueue/JobRunner.php @@ -23,7 +23,7 @@ use MediaWiki\MediaWikiServices; use MediaWiki\Logger\LoggerFactory; -use Liuggio\StatsdClient\Factory\StatsdDataFactory; +use Liuggio\StatsdClient\Factory\StatsdDataFactoryInterface; use Psr\Log\LoggerAwareInterface; use Psr\Log\LoggerInterface; use Wikimedia\ScopedCallback; @@ -265,13 +265,13 @@ class JobRunner implements LoggerAwareInterface { } /** - * @param Job $job + * @param RunnableJob $job * @param LBFactory $lbFactory - * @param StatsdDataFactory $stats + * @param StatsdDataFactoryInterface $stats * @param float $popTime * @return array Map of status/error/timeMs */ - private function executeJob( Job $job, LBFactory $lbFactory, $stats, $popTime ) { + private function executeJob( RunnableJob $job, LBFactory $lbFactory, $stats, $popTime ) { $jType = $job->getType(); $msg = $job->toString() . " STARTING"; $this->logger->debug( $msg, [ @@ -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(); @@ -367,11 +371,11 @@ class JobRunner implements LoggerAwareInterface { } /** - * @param Job $job + * @param RunnableJob $job * @return int Seconds for this runner to avoid doing more jobs of this type * @see $wgJobBackoffThrottling */ - private function getBackoffTimeToWait( Job $job ) { + private function getBackoffTimeToWait( RunnableJob $job ) { $throttling = $this->config->get( 'JobBackoffThrottling' ); if ( !isset( $throttling[$job->getType()] ) || $job instanceof DuplicateJob ) { @@ -526,11 +530,11 @@ class JobRunner implements LoggerAwareInterface { * $wgJobSerialCommitThreshold for more. * * @param LBFactory $lbFactory - * @param Job $job + * @param RunnableJob $job * @param string $fnameTrxOwner * @throws DBError */ - private function commitMasterChanges( LBFactory $lbFactory, Job $job, $fnameTrxOwner ) { + private function commitMasterChanges( LBFactory $lbFactory, RunnableJob $job, $fnameTrxOwner ) { $syncThreshold = $this->config->get( 'JobSerialCommitThreshold' ); $time = false;