Skip to content

Commit

Permalink
Browse files Browse the repository at this point in the history
improved Hypnotoad logging a little
  • Loading branch information
kraih committed Feb 24, 2012
1 parent 864bb29 commit 3d3a746
Showing 1 changed file with 22 additions and 27 deletions.
49 changes: 22 additions & 27 deletions lib/Mojo/Server/Hypnotoad.pm
Expand Up @@ -67,7 +67,8 @@ sub run {
# Preload application and configure server
my $daemon = $self->{daemon} = Mojo::Server::Daemon->new;
$self->_config(my $app = $daemon->load_app($ENV{HYPNOTOAD_APP}));
(my $log = $app->log)->info(qq/Loading application "$ENV{HYPNOTOAD_APP}"./);
$self->{log} = $app->log;
$self->{log}->info(qq/Loaded application "$ENV{HYPNOTOAD_APP}"./);

# Testing
_exit('Everything looks good!') if $ENV{HYPNOTOAD_TEST};
Expand Down Expand Up @@ -105,7 +106,7 @@ sub run {
my $c = $self->{config};
$SIG{INT} = $SIG{TERM} = sub { $self->{finished} = 1 };
$SIG{CHLD} = sub {
while ((my $pid = waitpid -1, WNOHANG) > 0) { $self->_reap($log, $pid) }
while ((my $pid = waitpid -1, WNOHANG) > 0) { $self->_reap($pid) }
};
$SIG{QUIT} = sub { $self->{finished} = $self->{graceful} = 1 };
$SIG{USR2} = sub { $self->{upgrade} ||= time };
Expand All @@ -117,8 +118,8 @@ sub run {
};

# Mainloop
$log->info("Manager $$ started.");
$self->_manage($log) while 1;
$self->{log}->info("Manager $$ started.");
$self->_manage while 1;
}

sub _config {
Expand Down Expand Up @@ -201,25 +202,25 @@ sub _hot_deploy {
}

sub _manage {
my ($self, $log) = @_;
my $self = shift;

# Housekeeping
my $c = $self->{config};
if (!$self->{finished}) {

# Spawn more workers
$self->_spawn($log) while keys %{$self->{workers}} < $c->{workers};
$self->_spawn while keys %{$self->{workers}} < $c->{workers};

# Check PID file
$self->_pid_file($log);
$self->_pid_file;
}

# Shutdown
elsif (!keys %{$self->{workers}}) { exit 0 }

# Upgraded
if ($ENV{HYPNOTOAD_PID} && $ENV{HYPNOTOAD_PID} ne $$) {
$log->info("Stopping manager $ENV{HYPNOTOAD_PID}.");
$self->{log}->info("Stopping manager $ENV{HYPNOTOAD_PID}.");
kill 'QUIT', $ENV{HYPNOTOAD_PID};
}
$ENV{HYPNOTOAD_PID} = $$;
Expand All @@ -232,7 +233,7 @@ sub _manage {

# Fresh start
unless ($self->{new}) {
$log->info('Starting zero downtime software upgrade.');
$self->{log}->info('Starting zero downtime software upgrade.');
croak "Can't fork: $!" unless defined(my $pid = fork);
$self->{new} = $pid if $pid;
exec $ENV{HYPNOTOAD_EXE} unless $pid;
Expand All @@ -250,25 +251,21 @@ sub _manage {
my $interval = $c->{heartbeat_interval};
my $timeout = $c->{heartbeat_timeout};
if ($w->{time} + $interval + $timeout <= time) {
$log->info("Worker $pid has no heartbeat.");
$self->{log}->info("Worker $pid has no heartbeat.");
$w->{graceful} ||= time;
}

# Graceful stop
# Graceful stop with timeout
$w->{graceful} ||= time if $self->{graceful};
if ($w->{graceful}) {
$log->info("Trying to stop worker $pid gracefully.");
$self->{log}->info("Trying to stop worker $pid gracefully.");
kill 'QUIT', $pid;

# Timeout
$w->{force} = 1 if $w->{graceful} + $c->{graceful_timeout} <= time;
}

# Normal stop
if (($self->{finished} && !$self->{graceful}) || $w->{force}) {

# Kill
$log->info("Stopping worker $pid.");
$self->{log}->info("Stopping worker $pid.");
kill 'KILL', $pid;
}
}
Expand All @@ -283,7 +280,7 @@ sub _pid {
}

sub _pid_file {
my ($self, $log) = @_;
my $self = shift;

# Don't need a PID file anymore
return if $self->{finished};
Expand All @@ -292,7 +289,7 @@ sub _pid_file {
return if -e (my $file = $self->{config}->{pid_file});

# Create PID file
$log->info(qq/Creating PID file "$file" for manager $$./);
$self->{log}->info(qq/Creating PID file "$file" for manager $$./);
croak qq/Can't create PID file "$file": $!/
unless my $pid = IO::File->new($file, '>', 0644);
print $pid $$;
Expand All @@ -302,30 +299,28 @@ sub _pid_file {
# Please eliminate three.
# P.S. I am not a crackpot."
sub _reap {
my ($self, $log, $pid) = @_;
my ($self, $pid) = @_;

# Clean up failed upgrade
if (($self->{new} || '') eq $pid) {
$log->info('Zero downtime software upgrade failed.');
$self->{log}->info('Zero downtime software upgrade failed.');
delete $self->{upgrade};
delete $self->{new};
}

# Clean up worker
else {
$log->info("Worker $pid stopped.");
$self->{log}->info("Worker $pid stopped.");
delete $self->{workers}->{$pid};
}
}

# "I hope this has taught you kids a lesson: kids never learn."
sub _spawn {
my ($self, $log) = @_;

# Fork
croak "Can't fork: $!" unless defined(my $pid = fork);
my $self = shift;

# Manager
croak "Can't fork: $!" unless defined(my $pid = fork);
return $self->{workers}->{$pid} = {time => time} if $pid;

# Worker
Expand Down Expand Up @@ -383,7 +378,7 @@ sub _spawn {
$daemon->setuidgid;

# Start
$log->info("Worker $$ started.");
$self->{log}->info("Worker $$ started.");
$loop->start;
exit 0;
}
Expand Down

0 comments on commit 3d3a746

Please sign in to comment.