From 9d39f509048641ff533cfcd277cd5aaafb81d986 Mon Sep 17 00:00:00 2001 From: Aaron Schulz Date: Fri, 7 Aug 2015 15:09:22 -0700 Subject: [PATCH] Made JobRunner bail more smoothly on near OOM * Use the regular limit-X style response instead of throwing an exception. This avoids loss of statd data and the like. Change-Id: Ia08384a0d13c268f6e7a673b2265ab77772e5539 --- includes/jobqueue/JobRunner.php | 17 +++++++++++++---- 1 file changed, 13 insertions(+), 4 deletions(-) diff --git a/includes/jobqueue/JobRunner.php b/includes/jobqueue/JobRunner.php index 3982134b6b..2465e5aed7 100644 --- a/includes/jobqueue/JobRunner.php +++ b/includes/jobqueue/JobRunner.php @@ -263,7 +263,10 @@ class JobRunner implements LoggerAwareInterface { } // Bail if near-OOM instead of in a job - $this->assertMemoryOK(); + if ( !$this->checkMemoryOK() ) { + $response['reached'] = 'memory-limit'; + break; + } } } while ( $job ); // stop when there are no jobs @@ -392,9 +395,9 @@ class JobRunner implements LoggerAwareInterface { /** * Make sure that this script is not too close to the memory usage limit. * It is better to die in between jobs than OOM right in the middle of one. - * @throws MWException + * @return bool */ - private function assertMemoryOK() { + private function checkMemoryOK() { static $maxBytes = null; if ( $maxBytes === null ) { $m = array(); @@ -408,8 +411,14 @@ class JobRunner implements LoggerAwareInterface { } $usedBytes = memory_get_usage(); if ( $maxBytes && $usedBytes >= 0.95 * $maxBytes ) { - throw new MWException( "Detected excessive memory usage ($usedBytes/$maxBytes)." ); + $msg = "Detected excessive memory usage ($usedBytes/$maxBytes)."; + $this->debugCallback( $msg ); + $this->logger->error( $msg ); + + return false; } + + return true; } /** -- 2.20.1