From eef642ef1d0aa68420d334fe25bb7f7a8f5a5540 Mon Sep 17 00:00:00 2001 From: Brian Wolff Date: Sat, 5 Apr 2014 23:15:26 -0300 Subject: [PATCH] Make chunked upload jobs robust in face of exceptions. If an exception occurs when creating the new image page during PublishStashedFile (for example, if ExternalStorage servers become overloaded), the job is aborted, but the current transaction is not aborted. Then the next job comes along, does $dbw->begin(), which implicitly commits the current open transactions, causing database corruption (entries in page table with page_latest = 0). This patch ensures that if some unknown exception occurs during the job, that the database gets rolled back to a known good state. I also plan to make a separate patch to make the recordUpload code handle exceptions properly. Nonetheless, I think its important that the general job code be as robust as possible. Bug: 32551 Change-Id: Icb5e06e81700e5dcf0d4e739c7b2bb3221e718b8 --- includes/jobqueue/jobs/AssembleUploadChunksJob.php | 2 ++ includes/jobqueue/jobs/PublishStashedFileJob.php | 3 +++ 2 files changed, 5 insertions(+) diff --git a/includes/jobqueue/jobs/AssembleUploadChunksJob.php b/includes/jobqueue/jobs/AssembleUploadChunksJob.php index 19b05586d4..9e9bda6ff0 100644 --- a/includes/jobqueue/jobs/AssembleUploadChunksJob.php +++ b/includes/jobqueue/jobs/AssembleUploadChunksJob.php @@ -112,6 +112,8 @@ class AssembleUploadChunksJob extends Job { ) ); $this->setLastError( get_class( $e ) . ": " . $e->getText() ); + // To be extra robust. + MWExceptionHandler::rollbackMasterChangesAndLog( $e ); return false; } diff --git a/includes/jobqueue/jobs/PublishStashedFileJob.php b/includes/jobqueue/jobs/PublishStashedFileJob.php index d7667f390a..918a392db4 100644 --- a/includes/jobqueue/jobs/PublishStashedFileJob.php +++ b/includes/jobqueue/jobs/PublishStashedFileJob.php @@ -125,6 +125,9 @@ class PublishStashedFileJob extends Job { ) ); $this->setLastError( get_class( $e ) . ": " . $e->getText() ); + // To prevent potential database referential integrity issues. + // See bug 32551. + MWExceptionHandler::rollbackMasterChangesAndLog( $e ); return false; } -- 2.20.1