Make chunked upload jobs robust in face of exceptions.
authorBrian Wolff <bawolff+wn@gmail.com>
Sun, 6 Apr 2014 02:15:26 +0000 (23:15 -0300)
committerBrian Wolff <bawolff+wn@gmail.com>
Sun, 6 Apr 2014 02:15:26 +0000 (23:15 -0300)
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
includes/jobqueue/jobs/PublishStashedFileJob.php

index 19b0558..9e9bda6 100644 (file)
@@ -112,6 +112,8 @@ class AssembleUploadChunksJob extends Job {
                                )
                        );
                        $this->setLastError( get_class( $e ) . ": " . $e->getText() );
+                       // To be extra robust.
+                       MWExceptionHandler::rollbackMasterChangesAndLog( $e );
 
                        return false;
                }
index d7667f3..918a392 100644 (file)
@@ -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;
                }