Skip to content

Commit

Permalink
handle stopped workers more consistently
Browse files Browse the repository at this point in the history
  • Loading branch information
kraih committed Jan 27, 2015
1 parent e180c04 commit 68532eb
Show file tree
Hide file tree
Showing 2 changed files with 17 additions and 12 deletions.
19 changes: 12 additions & 7 deletions lib/Mojo/Server/Prefork.pm
Expand Up @@ -82,9 +82,7 @@ sub run {
local $SIG{INT} = local $SIG{TERM} = sub { $self->_term };
local $SIG{CHLD} = sub {
while ((my $pid = waitpid -1, WNOHANG) > 0) {
next unless my $w = delete $self->emit(reap => $pid)->{pool}{$pid};
$self->app->log->debug("Worker $pid stopped");
$self->{finished} = 1 unless $w->{healthy};
$self->emit(reap => $pid)->_stopped($pid);
}
};
local $SIG{QUIT} = sub { $self->_term(1) };
Expand Down Expand Up @@ -121,8 +119,8 @@ sub _manage {
my $interval = $self->heartbeat_interval;
my $ht = $self->heartbeat_timeout;
my $gt = $self->graceful_timeout;
my $time = steady_time;
my $log = $self->app->log;
my $time = steady_time;

for my $pid (keys %{$self->{pool}}) {
next unless my $w = $self->{pool}{$pid};
Expand All @@ -134,14 +132,14 @@ sub _manage {

# Graceful stop with timeout
my $graceful = $w->{graceful} ||= $self->{graceful} ? $time : undef;
$log->debug("Trying to stop worker $pid gracefully")
and (kill('QUIT', $pid) or delete $self->{pool}{$pid})
$log->debug("Stopping worker $pid gracefully")
and (kill 'QUIT', $pid or $self->_stopped($pid))
if $graceful && !$w->{quit}++;
$w->{force} = 1 if $graceful && $graceful + $gt <= $time;

# Normal stop
$log->debug("Stopping worker $pid")
and (kill('KILL', $pid) or delete $self->{pool}{$pid})
and (kill 'KILL', $pid or $self->_stopped($pid))
if $w->{force} || ($self->{finished} && !$graceful);
}
}
Expand Down Expand Up @@ -199,6 +197,13 @@ sub _spawn {
exit 0;
}

sub _stopped {
my ($self, $pid) = @_;
return unless my $w = delete $self->{pool}{$pid};
$self->app->log->debug("Worker $pid stopped");
$self->{finished} = 1 unless $w->{healthy};
}

sub _term {
my ($self, $graceful) = @_;
$self->emit(finish => $graceful)->{finished} = 1;
Expand Down
10 changes: 5 additions & 5 deletions t/mojo/prefork.t
Expand Up @@ -66,11 +66,11 @@ ok $graceful, 'server has been stopped gracefully';
is_deeply [sort @spawn], [sort @reap], 'same process ids';
is $tx->res->code, 200, 'right status';
is $tx->res->body, 'just works!', 'right content';
like $log, qr/Listening at/, 'right message';
like $log, qr/Manager $$ started/, 'right message';
like $log, qr/Creating process id file/, 'right message';
like $log, qr/Trying to stop worker $spawn[0] gracefully/, 'right message';
like $log, qr/Worker $spawn[0] stopped/, 'right message';
like $log, qr/Listening at/, 'right message';
like $log, qr/Manager $$ started/, 'right message';
like $log, qr/Creating process id file/, 'right message';
like $log, qr/Stopping worker $spawn[0] gracefully/, 'right message';
like $log, qr/Worker $spawn[0] stopped/, 'right message';
$prefork->app->log->unsubscribe(message => $cb);

# Process id and lock files
Expand Down

0 comments on commit 68532eb

Please sign in to comment.