From 1ac63f17676e0e641b023e661451167a36d62807 Mon Sep 17 00:00:00 2001 From: Aaron Schulz Date: Tue, 16 Feb 2016 19:25:24 -0800 Subject: [PATCH] Reset scoped session for upload jobs after deferred updates Bug: T126450 Change-Id: I8a6588209647252a4509078aaa7bf0cb1d9d299a --- includes/jobqueue/Job.php | 22 +++++++++++++++++++ includes/jobqueue/JobRunner.php | 1 + .../jobqueue/jobs/AssembleUploadChunksJob.php | 4 ++++ .../jobqueue/jobs/PublishStashedFileJob.php | 4 ++++ 4 files changed, 31 insertions(+) diff --git a/includes/jobqueue/Job.php b/includes/jobqueue/Job.php index 2d13c7e5e5..abab142782 100644 --- a/includes/jobqueue/Job.php +++ b/includes/jobqueue/Job.php @@ -47,6 +47,9 @@ abstract class Job implements IJobSpecification { /** @var string Text for error that occurred last */ protected $error; + /** @var callable[] */ + protected $teardownCallbacks = []; + /** * Run the job * @return bool Success @@ -279,6 +282,25 @@ abstract class Job implements IJobSpecification { return $this->hasRootJobParams() && !empty( $this->params['rootJobIsSelf'] ); } + /** + * @param callable $callback + * @since 1.27 + */ + protected function addTeardownCallback( $callback ) { + $this->teardownCallbacks[] = $callback; + } + + /** + * Do any final cleanup after run(), deferred updates, and all DB commits happen + * + * @since 1.27 + */ + public function teardown() { + foreach ( $this->teardownCallbacks as $callback ) { + call_user_func( $callback ); + } + } + /** * Insert a single job into the queue. * @return bool True on success diff --git a/includes/jobqueue/JobRunner.php b/includes/jobqueue/JobRunner.php index 39193187cf..60372d1a5e 100644 --- a/includes/jobqueue/JobRunner.php +++ b/includes/jobqueue/JobRunner.php @@ -265,6 +265,7 @@ class JobRunner implements LoggerAwareInterface { DeferredUpdates::doUpdates(); $this->commitMasterChanges( $job ); + $job->teardown(); } catch ( Exception $e ) { MWExceptionHandler::rollbackMasterChangesAndLog( $e ); $status = false; diff --git a/includes/jobqueue/jobs/AssembleUploadChunksJob.php b/includes/jobqueue/jobs/AssembleUploadChunksJob.php index 4de19bc5ae..3699afe2a2 100644 --- a/includes/jobqueue/jobs/AssembleUploadChunksJob.php +++ b/includes/jobqueue/jobs/AssembleUploadChunksJob.php @@ -35,6 +35,10 @@ class AssembleUploadChunksJob extends Job { public function run() { /** @noinspection PhpUnusedLocalVariableInspection */ $scope = RequestContext::importScopedSession( $this->params['session'] ); + $this->addTeardownCallback( function () use ( &$scope ) { + ScopedCallback::consume( $scope ); // T126450 + } ); + $context = RequestContext::getMain(); $user = $context->getUser(); try { diff --git a/includes/jobqueue/jobs/PublishStashedFileJob.php b/includes/jobqueue/jobs/PublishStashedFileJob.php index 5f8af8b309..caedf46058 100644 --- a/includes/jobqueue/jobs/PublishStashedFileJob.php +++ b/includes/jobqueue/jobs/PublishStashedFileJob.php @@ -37,6 +37,10 @@ class PublishStashedFileJob extends Job { public function run() { /** @noinspection PhpUnusedLocalVariableInspection */ $scope = RequestContext::importScopedSession( $this->params['session'] ); + $this->addTeardownCallback( function () use ( &$scope ) { + ScopedCallback::consume( $scope ); // T126450 + } ); + $context = RequestContext::getMain(); $user = $context->getUser(); try { -- 2.20.1