Aaron Schulz has uploaded a new change for review.

  https://gerrit.wikimedia.org/r/70781


Change subject: Made runJobs.php respect time limits better and try to bail 
before OOMs.
......................................................................

Made runJobs.php respect time limits better and try to bail before OOMs.

Change-Id: I93b9cebda591f15d42c401f4dc51ecd746d45a0d
---
M maintenance/runJobs.php
1 file changed, 27 insertions(+), 2 deletions(-)


  git pull ssh://gerrit.wikimedia.org:29418/mediawiki/core 
refs/changes/81/70781/1

diff --git a/maintenance/runJobs.php b/maintenance/runJobs.php
index 9dac031..efc89f1 100644
--- a/maintenance/runJobs.php
+++ b/maintenance/runJobs.php
@@ -93,9 +93,11 @@
                                ++$jobsRun;
                                $this->runJobsLog( $job->toString() . " 
STARTING" );
 
+                               // Set timer to stop the job if too much CPU 
time is used
+                               set_time_limit( $maxTime ?: 0 );
                                // Run the job...
-                               $t = microtime( true );
                                wfProfileIn( __METHOD__ . '-' . get_class( $job 
) );
+                               $t = microtime( true );
                                try {
                                        $status = $job->run();
                                        $error = $job->getLastError();
@@ -104,8 +106,10 @@
                                        $error = get_class( $e ) . ': ' . 
$e->getMessage();
                                        $e->report(); // write error to STDERR 
and the log
                                }
-                               wfProfileOut( __METHOD__ . '-' . get_class( 
$job ) );
                                $timeMs = intval( ( microtime( true ) - $t ) * 
1000 );
+                               wfProfileOut( __METHOD__ . '-' . get_class( 
$job ) );
+                               // Disable the timer
+                               set_time_limit( 0 );
 
                                // Mark the job as done on success or when the 
job cannot be retried
                                if ( $status !== false || !$job->allowRetries() 
) {
@@ -135,11 +139,32 @@
                                if ( $jobsRun > 0 && ( $jobsRun % 100 ) == 0 ) {
                                        $group->waitForBackups();
                                }
+
+                               // Bail if near-OOM instead of in a job
+                               $this->assertMemoryOK();
                        }
                } while ( $job ); // stop when there are no jobs
        }
 
        /**
+        * Make sure that this script is not too close to the memory usage limit
+        * @throws MWException
+        */
+       private function assertMemoryOK() {
+               static $maxBytes = null;
+               if ( $maxBytes === null ) {
+                       $maxMem = ini_get( 'memory_limit' );
+                       $conv = array( 'g' => 1024*1024*1024, 'm' => 1024*1024, 
'k' => 1024 );
+                       $unit = strtolower( substr( $maxMem, -1 ) );
+                       $maxBytes = substr( $maxMem, 0, -1 ) * $conv[$unit];
+               }
+               $usedBytes = memory_get_usage();
+               if ( $maxBytes && $usedBytes >= .95*$maxBytes ) {
+                       throw new MWException( "Detected excessive memory usage 
($usedBytes/$maxBytes)." );
+               }
+       }
+
+       /**
         * Log the job message
         * @param $msg String The message to log
         */

-- 
To view, visit https://gerrit.wikimedia.org/r/70781
To unsubscribe, visit https://gerrit.wikimedia.org/r/settings

Gerrit-MessageType: newchange
Gerrit-Change-Id: I93b9cebda591f15d42c401f4dc51ecd746d45a0d
Gerrit-PatchSet: 1
Gerrit-Project: mediawiki/core
Gerrit-Branch: master
Gerrit-Owner: Aaron Schulz <asch...@wikimedia.org>

_______________________________________________
MediaWiki-commits mailing list
MediaWiki-commits@lists.wikimedia.org
https://lists.wikimedia.org/mailman/listinfo/mediawiki-commits

Reply via email to