Some cleanups to MWExceptionHandler::handleException
authorAaron Schulz <aschulz@wikimedia.org>
Tue, 31 Mar 2015 22:41:26 +0000 (15:41 -0700)
committerAaron Schulz <aschulz@wikimedia.org>
Tue, 31 Mar 2015 23:29:20 +0000 (16:29 -0700)
* Do not bother with profiling data, which is just another
  thing that can go wrong.
* Catch DB rollback errors to avoid getting stuck in
  report() loops during network partitions.

Change-Id: I92293b2261c48cf49625ea14a51987e5619ab8d4

includes/exception/MWExceptionHandler.php

index 7110361..0582b24 100644 (file)
@@ -150,22 +150,24 @@ class MWExceptionHandler {
         * @since 1.25
         * @param Exception $e
         */
-       public static function handleException( $e ) {
-               global $wgFullyInitialised;
+       public static function handleException( Exception $e ) {
+               try {
+                       // Rollback DBs to avoid transaction notices. This may fail
+                       // to rollback some DB due to connection issues or exceptions.
+                       // However, any sane DB driver will rollback implicitly anyway.
+                       self::rollbackMasterChangesAndLog( $e );
+               } catch ( DBError $e2 ) {
+                       // If the DB is unreacheable, rollback() will throw an error
+                       // and the error report() method might need messages from the DB,
+                       // which would result in an exception loop. PHP may escalate such
+                       // errors to "Exception thrown without a stack frame" fatals, but
+                       // it's better to be explicit here.
+                       self::logException( $e2 );
+               }
 
-               self::rollbackMasterChangesAndLog( $e );
                self::logException( $e );
                self::report( $e );
 
-               // Final cleanup
-               if ( $wgFullyInitialised ) {
-                       try {
-                               // uses $wgRequest, hence the $wgFullyInitialised condition
-                               wfLogProfilingData();
-                       } catch ( Exception $e ) {
-                       }
-               }
-
                // Exit value should be nonzero for the benefit of shell jobs
                exit( 1 );
        }