From 50b7a49e66180e06ab510e4f6a365177ed2b8990 Mon Sep 17 00:00:00 2001 From: Aaron Schulz Date: Tue, 31 Mar 2015 15:41:26 -0700 Subject: [PATCH] Some cleanups to MWExceptionHandler::handleException * 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 | 26 ++++++++++++----------- 1 file changed, 14 insertions(+), 12 deletions(-) diff --git a/includes/exception/MWExceptionHandler.php b/includes/exception/MWExceptionHandler.php index 7110361066..0582b24f83 100644 --- a/includes/exception/MWExceptionHandler.php +++ b/includes/exception/MWExceptionHandler.php @@ -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 ); } -- 2.20.1