summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorDylan William Hardison <dylan@hardison.net>2018-03-08 21:40:10 +0100
committerGitHub <noreply@github.com>2018-03-08 21:40:10 +0100
commit2056caa180f907c6e5727954547dfd928cf6a360 (patch)
treeca93c1ebd9364ebb99927223ce9101313ba69c9a
parentedf9851a7ddcab83c6dd54f2294041613ace24f7 (diff)
downloadbugzilla-2056caa180f907c6e5727954547dfd928cf6a360.tar.gz
bugzilla-2056caa180f907c6e5727954547dfd928cf6a360.tar.xz
Revert "Bug 832893: change jobqueue.pl to spawn worker processes to deliver bugmail to avoid memory leaks"
-rw-r--r--Bugzilla/JobQueue.pm53
-rw-r--r--Bugzilla/JobQueue/Runner.pm25
-rwxr-xr-xjobqueue.pl3
3 files changed, 10 insertions, 71 deletions
diff --git a/Bugzilla/JobQueue.pm b/Bugzilla/JobQueue.pm
index b3b54de79..55d40bfb8 100644
--- a/Bugzilla/JobQueue.pm
+++ b/Bugzilla/JobQueue.pm
@@ -14,9 +14,7 @@ use warnings;
use Bugzilla::Constants;
use Bugzilla::Error;
use Bugzilla::Install::Util qw(install_string);
-use File::Slurp;
use base qw(TheSchwartz);
-use fields qw(_worker_pidfile);
# This maps job names for Bugzilla::JobQueue to the appropriate modules.
# If you add new types of jobs, you should add a mapping here.
@@ -93,57 +91,6 @@ sub insert {
return $retval;
}
-# To avoid memory leaks/fragmentation which tends to happen for long running
-# perl processes; check for jobs, and spawn a new process to empty the queue.
-sub subprocess_worker {
- my $self = shift;
-
- my $command = "$0 -p '" . $self->{_worker_pidfile} . "' onepass";
-
- while (1) {
- my $time = (time);
- my @jobs = $self->list_jobs({
- funcname => $self->{all_abilities},
- run_after => $time,
- grabbed_until => $time,
- limit => 1,
- });
- if (@jobs) {
- $self->debug("Spawning queue worker process");
- # Run the worker as a daemon
- system $command;
- # And poll the PID to detect when the working has finished.
- # We do this instead of system() to allow for the INT signal to
- # interrup us and trigger kill_worker().
- my $pid = read_file($self->{_worker_pidfile}, err_mode => 'quiet');
- if ($pid) {
- sleep(3) while(kill(0, $pid));
- }
- $self->debug("Queue worker process completed");
- } else {
- $self->debug("No jobs found");
- }
- sleep(5);
- }
-}
-
-sub kill_worker {
- my $self = Bugzilla->job_queue();
- if ($self->{_worker_pidfile} && -e $self->{_worker_pidfile}) {
- my $worker_pid = read_file($self->{_worker_pidfile});
- if ($worker_pid && kill(0, $worker_pid)) {
- $self->debug("Stopping worker process");
- system "$0 -f -p '" . $self->{_worker_pidfile} . "' stop";
- }
- }
-}
-
-sub set_pidfile {
- my ($self, $pidfile) = @_;
- $pidfile =~ s/^(.+)(\..+)$/$1.worker$2/;
- $self->{_worker_pidfile} = $pidfile;
-}
-
# Clear the request cache at the start of each run.
sub work_once {
my $self = shift;
diff --git a/Bugzilla/JobQueue/Runner.pm b/Bugzilla/JobQueue/Runner.pm
index 3adb91857..5b3164ef9 100644
--- a/Bugzilla/JobQueue/Runner.pm
+++ b/Bugzilla/JobQueue/Runner.pm
@@ -39,7 +39,6 @@ our $initscript = "bugzilla-queue";
sub gd_preconfig {
my $self = shift;
- $self->{_run_command} = 'subprocess_worker';
my $pidfile = $self->{gd_args}{pidfile};
if (!$pidfile) {
$pidfile = bz_locations()->{datadir} . '/' . $self->{gd_progname}
@@ -180,26 +179,21 @@ sub gd_setup_signals {
$SIG{TERM} = sub { $self->gd_quit_event(); }
}
-sub gd_quit_event {
- Bugzilla->job_queue->kill_worker();
- exit(1);
-}
-
sub gd_other_cmd {
- my ($self, $do, $locked) = @_;
- if ($do eq "once") {
- $self->{_run_command} = 'work_once';
- } elsif ($do eq "onepass") {
- $self->{_run_command} = 'work_until_done';
- } else {
- $self->SUPER::gd_other_cmd($do, $locked);
+ my ($self) = shift;
+ if ($ARGV[0] eq "once") {
+ $self->_do_work("work_once");
+
+ exit(0);
}
+
+ $self->SUPER::gd_other_cmd();
}
sub gd_run {
my $self = shift;
- $SIG{__DIE__} = \&Carp::confess if $self->{debug};
- $self->_do_work($self->{_run_command});
+
+ $self->_do_work("work");
}
sub _do_work {
@@ -207,7 +201,6 @@ sub _do_work {
my $jq = Bugzilla->job_queue();
$jq->set_verbose($self->{debug});
- $jq->set_pidfile($self->{gd_pidfile});
foreach my $module (values %{ Bugzilla::JobQueue->job_map() }) {
eval "use $module";
$jq->can_do($module);
diff --git a/jobqueue.pl b/jobqueue.pl
index 011d0ff87..f5541e0fb 100755
--- a/jobqueue.pl
+++ b/jobqueue.pl
@@ -46,8 +46,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, up to a limit of 1000 items) and then exits
- onepass Checks the job queue, executes all items found, and then exits
+ any) and then exits
check Report the current status of the daemon.
install On some *nix systems, this automatically installs and
configures jobqueue.pl as a system service so that it will