X-Git-Url: https://git.heureux-cyclage.org/?a=blobdiff_plain;f=includes%2Fexception%2FMWExceptionHandler.php;h=ef8136687d7b45b58c5c1eac03d5018e83783334;hb=86310a4fbaee17b68304c5d7a161a0fa2a392849;hp=433274e3395681590b6cdc9811952dd8afdcc7e7;hpb=a4943f548be4cfc8f286f00fc8064ff0e377f2ba;p=lhc%2Fweb%2Fwiklou.git diff --git a/includes/exception/MWExceptionHandler.php b/includes/exception/MWExceptionHandler.php index 433274e339..ef8136687d 100644 --- a/includes/exception/MWExceptionHandler.php +++ b/includes/exception/MWExceptionHandler.php @@ -83,29 +83,32 @@ class MWExceptionHandler { } /** - * If there are any open database transactions, roll them back and log - * the stack trace of the exception that should have been caught so the - * transaction could be aborted properly. + * Roll back any open database transactions and log the stack trace of the exception + * + * This method is used to attempt to recover from exceptions * * @since 1.23 * @param Exception|Throwable $e */ public static function rollbackMasterChangesAndLog( $e ) { $services = MediaWikiServices::getInstance(); - if ( $services->isServiceDisabled( 'DBLoadBalancerFactory' ) ) { - return; // T147599 + if ( !$services->isServiceDisabled( 'DBLoadBalancerFactory' ) ) { + // Rollback DBs to avoid transaction notices. This might fail + // to rollback some databases due to connection issues or exceptions. + // However, any sane DB driver will rollback implicitly anyway. + try { + $services->getDBLoadBalancerFactory()->rollbackMasterChanges( __METHOD__ ); + } 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::CAUGHT_BY_HANDLER ); + } } - $lbFactory = $services->getDBLoadBalancerFactory(); - if ( $lbFactory->hasMasterChanges() ) { - $logger = LoggerFactory::getInstance( 'Bug56269' ); - $logger->warning( - 'Exception thrown with an uncommited database transaction: ' . - self::getLogMessage( $e ), - self::getLogContext( $e ) - ); - } - $lbFactory->rollbackMasterChanges( __METHOD__ ); + self::logException( $e, self::CAUGHT_BY_HANDLER ); } /** @@ -123,23 +126,8 @@ class MWExceptionHandler { * @param Exception|Throwable $e */ public static function handleException( $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::CAUGHT_BY_HANDLER ); - } - - self::logException( $e, self::CAUGHT_BY_HANDLER ); + self::rollbackMasterChangesAndLog( $e ); self::report( $e ); - // Exit value should be nonzero for the benefit of shell jobs exit( 1 ); }