diff options
author | Eric Wong <normalperson@yhbt.net> | 2010-07-13 08:57:37 +0000 |
---|---|---|
committer | Eric Wong <normalperson@yhbt.net> | 2010-07-13 18:31:58 +0000 |
commit | 2a8c4bea2c39d0a551feb79cb471171cf96a55db (patch) | |
tree | d57f73c26be221415c78ce12d7bb894730a8123c /lib | |
parent | ae1f5e2d331d1714dd1b71d4905b296abf7780d0 (diff) | |
download | unicorn-2a8c4bea2c39d0a551feb79cb471171cf96a55db.tar.gz |
As described in our SIGNALS documentation, sending SIGHUP to the old master (to respawn SIGWINCH-ed children) while the new master (spawned from SIGUSR2) is active is useful for backing out of an upgrade before sending SIGQUIT to the new master. Unfortunately, the SIGHUP signal to the old master will cause the ".oldbin" pid file to be reset to the non-".oldbin" version and thus attempt to clobber the pid file in use by the to-be-terminated new master process. Thanks to the previous commit to prevent redaemonization in the new master, the old master can reliably detect if the new master is active while it is reloading the config file. Thanks to Lawrence Pit for discovering this bug. ref: http://mid.gmane.org/4C3BEACF.7040301@gmail.com (cherry picked from commit c13bec3449396b21795966101367838161612d61)
Diffstat (limited to 'lib')
-rw-r--r-- | lib/unicorn.rb | 5 |
1 files changed, 5 insertions, 0 deletions
diff --git a/lib/unicorn.rb b/lib/unicorn.rb index a7b0646..cbb5520 100644 --- a/lib/unicorn.rb +++ b/lib/unicorn.rb @@ -312,6 +312,11 @@ module Unicorn if path if x = valid_pid?(path) return path if pid && path == pid && x == $$ + if x == reexec_pid && pid =~ /\.oldbin\z/ + logger.warn("will not set pid=#{path} while reexec-ed "\ + "child is running PID:#{x}") + return + end raise ArgumentError, "Already running on PID:#{x} " \ "(or pid=#{path} is stale)" end |