]> git.ipfire.org Git - thirdparty/bugzilla.git/commitdiff
Bug 962424: jobqueue's worker process should process messages in batches
authorByron Jones <glob@mozilla.com>
Wed, 11 Jun 2014 14:47:34 +0000 (22:47 +0800)
committerByron Jones <glob@mozilla.com>
Wed, 11 Jun 2014 14:47:34 +0000 (22:47 +0800)
r=?,a=?

Bugzilla/JobQueue.pm
jobqueue.pl
t/011pod.t

index d6706632249f66515172196324c6fc308add8a32..4ff5750da8099020a17f665dab595d13ef76aef3 100644 (file)
@@ -30,6 +30,10 @@ use constant JOB_MAP => {
 # across requests.
 use constant DRIVER_CACHE_TIME => 300; # 5 minutes
 
+# To avoid memory leak/fragmentation, a worker process won't process more than
+# MAX_MESSAGES messages.
+use constant MAX_MESSAGES => 1000;
+
 sub job_map {
     if (!defined(Bugzilla->request_cache->{job_map})) {
         my $job_map = JOB_MAP;
@@ -155,6 +159,16 @@ sub work_once {
     return $self->SUPER::work_once(@_);
 }
 
+# Never process more than MAX_MESSAGES in one batch, to avoid memory
+# leak/fragmentation issues.
+sub work_until_done {
+    my $self = shift;
+    my $count = 0;
+    while ($count++ < MAX_MESSAGES) {
+        $self->work_once or last;
+    }
+}
+
 1;
 
 __END__
index c8afd74cc45dec8812ac59b82539b32042582b04..d538e478469a81a380cee5eda6ed14e188acae01 100755 (executable)
@@ -45,7 +45,7 @@ jobqueue.pl - Runs jobs in the background for Bugzilla.
    restart   Stops a running jobqueue if one is running, and then
              starts a new one.
    once      Checks the job queue once, executes the first item found (if
-             any) and then exits
+             any, up to a limit of 1000 items) and then exits
    onepass   Checks the job queue, executes all items found, and then exits
    check     Report the current status of the daemon.
    install   On some *nix systems, this automatically installs and
index 37cd2da37ece2845a8093d482e57168d03001cd9..c3ec39898deca7d7e3d31ec4a384764ae07e632d 100644 (file)
@@ -30,7 +30,7 @@ use constant DEFAULT_WHITELIST => qr/^(?:new|new_from_list|check|run_create_vali
 use constant SUB_WHITELIST => (
     'Bugzilla::Flag'     => qr/^(?:(force_)?retarget|force_cleanup)$/,
     'Bugzilla::FlagType' => qr/^sqlify_criteria$/,
-    'Bugzilla::JobQueue' => qr/(?:^work_once|subprocess_worker)$/,
+    'Bugzilla::JobQueue' => qr/(?:^work_once|work_until_done|subprocess_worker)$/,
     'Bugzilla::Search'   => qr/^SPECIAL_PARSING$/,
 );