Skip to content

Commit

Permalink
mention in the log if a worker stopped too early
Browse files Browse the repository at this point in the history
  • Loading branch information
kraih committed Jan 27, 2015
1 parent 68532eb commit a1d8aea
Show file tree
Hide file tree
Showing 3 changed files with 31 additions and 31 deletions.
24 changes: 12 additions & 12 deletions lib/Mojo/Server/Hypnotoad.pm
Expand Up @@ -57,7 +57,7 @@ sub run {
$self->configure('hypnotoad');
weaken $self;
$prefork->on(wait => sub { $self->_manage });
$prefork->on(reap => sub { $self->_reap(pop) });
$prefork->on(reap => sub { $self->_cleanup(pop) });
$prefork->on(finish => sub { $self->{finished} = 1 });
# Testing
Expand All @@ -78,6 +78,15 @@ sub run {
$prefork->cleanup(1)->run;
}
sub _cleanup {
my ($self, $pid) = @_;
# Clean up failed upgrade
return unless ($self->{new} || '') eq $pid;
$self->prefork->app->log->error('Zero downtime software upgrade failed');
delete @$self{qw(new upgrade)};
}
sub _exit { say shift and exit 0 }
sub _hot_deploy {
Expand Down Expand Up @@ -119,15 +128,6 @@ sub _manage {
}
}

sub _reap {
my ($self, $pid) = @_;

# Clean up failed upgrade
return unless ($self->{new} || '') eq $pid;
$self->prefork->app->log->error('Zero downtime software upgrade failed');
delete @$self{qw(new upgrade)};
}

sub _stop {
_exit('Hypnotoad server not running.')
unless my $pid = shift->prefork->check_pid;
Expand Down Expand Up @@ -190,11 +190,11 @@ with the following signals.
=head2 INT, TERM
Shutdown server immediately.
Shut down server immediately.
=head2 QUIT
Shutdown server gracefully.
Shut down server gracefully.
=head2 TTIN
Expand Down
8 changes: 4 additions & 4 deletions lib/Mojo/Server/Morbo.pm
Expand Up @@ -33,7 +33,7 @@ sub run {
# Clean manager environment
local $SIG{CHLD} = sub { $self->_reap if $self->{worker} };
local $SIG{INT} = local $SIG{TERM} = local $SIG{QUIT} = sub {
$self->{finished} = 1;
$self->{stop} = 1;
kill 'TERM', $self->{worker} if $self->{worker};
};
unshift @{$self->watch}, $app;
Expand All @@ -42,7 +42,7 @@ sub run {
# Prepare and cache listen sockets for smooth restarting
my $daemon = Mojo::Server::Daemon->new(silent => 1)->start->stop;

$self->_manage while !$self->{finished} || $self->{worker};
$self->_manage while !$self->{stop} || $self->{worker};
exit 0;
}

Expand Down Expand Up @@ -88,14 +88,14 @@ sub _spawn {

# Worker
$SIG{CHLD} = 'DEFAULT';
$SIG{INT} = $SIG{TERM} = $SIG{QUIT} = sub { $self->{finished} = 1 };
$SIG{INT} = $SIG{TERM} = $SIG{QUIT} = sub { $self->{stop} = 1 };
my $daemon = Mojo::Server::Daemon->new;
$daemon->load_app($self->watch->[0]);
$daemon->silent(1) if $ENV{MORBO_REV} > 1;
$daemon->start;
my $loop = $daemon->ioloop;
$loop->recurring(
1 => sub { shift->stop if !kill(0, $manager) || $self->{finished} });
1 => sub { shift->stop if !kill(0, $manager) || $self->{stop} });
$loop->start;
exit 0;
}
Expand Down
30 changes: 15 additions & 15 deletions lib/Mojo/Server/Prefork.pm
Expand Up @@ -59,7 +59,7 @@ sub ensure_pid_file {
}

sub healthy {
scalar grep { $_->{healthy} } values %{$_[0]{pool}};
scalar grep { $_->{healthy} } values %{shift->{pool}};
}

sub run {
Expand All @@ -81,9 +81,7 @@ sub run {
# Clean manager environment
local $SIG{INT} = local $SIG{TERM} = sub { $self->_term };
local $SIG{CHLD} = sub {
while ((my $pid = waitpid -1, WNOHANG) > 0) {
$self->emit(reap => $pid)->_stopped($pid);
}
while ((my $pid = waitpid -1, WNOHANG) > 0) { $self->_reap($pid) }
};
local $SIG{QUIT} = sub { $self->_term(1) };
local $SIG{TTIN} = sub { $self->workers($self->workers + 1) };
Expand All @@ -105,7 +103,7 @@ sub _manage {
my $self = shift;

# Spawn more workers if necessary and check PID file
if (!$self->{finished}) {
if (!$self->{stop}) {
$self->_spawn while keys %{$self->{pool}} < $self->workers;
$self->ensure_pid_file;
}
Expand Down Expand Up @@ -140,10 +138,12 @@ sub _manage {
# Normal stop
$log->debug("Stopping worker $pid")
and (kill 'KILL', $pid or $self->_stopped($pid))
if $w->{force} || ($self->{finished} && !$graceful);
if $w->{force} || ($self->{stop} && !$graceful);
}
}

sub _reap { shift->emit(reap => $_[0])->_stopped($_[0]) }

sub _spawn {
my $self = shift;

Expand Down Expand Up @@ -199,17 +199,17 @@ sub _spawn {

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;
$self->{graceful} = 1 if $graceful;
my $log = $self->app->log;
$log->debug("Worker $pid stopped");
$log->error("Worker $pid stopped too early, shutting down") and $self->_term
unless $w->{healthy};
}

sub _term { @{$_[0]->emit(finish => $_[1])}{qw(stop graceful)} = (1, $_[1]) }

sub _wait {
my $self = shift;

Expand Down Expand Up @@ -284,11 +284,11 @@ the following signals.
=head2 INT, TERM
Shutdown server immediately.
Shut down server immediately.
=head2 QUIT
Shutdown server gracefully.
Shut down server gracefully.
=head2 TTIN
Expand Down

0 comments on commit a1d8aea

Please sign in to comment.