Made JobRunner bail more smoothly on near OOM
authorAaron Schulz <aschulz@wikimedia.org>
Fri, 7 Aug 2015 22:09:22 +0000 (15:09 -0700)
committerAaron Schulz <aschulz@wikimedia.org>
Fri, 7 Aug 2015 22:09:22 +0000 (15:09 -0700)
* 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

index 3982134..2465e5a 100644 (file)
@@ -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;
        }
 
        /**