diff options
author | Eric Wong <normalperson@yhbt.net> | 2013-11-02 19:40:46 +0000 |
---|---|---|
committer | Eric Wong <normalperson@yhbt.net> | 2013-11-02 21:21:27 +0000 |
commit | 1b31f96631af819efc6c779d9e14b53bb7313730 (patch) | |
tree | 96d992289d20fa68cf620fb6e81b858181f845f7 | |
parent | 38d6b9e49eed43256f610afcf4389ba7d85054e0 (diff) | |
download | yahns-1b31f96631af819efc6c779d9e14b53bb7313730.tar.gz |
We must not reap processes we did not spawn if we're not using a master/worker configuration. This may break applications which depend on waitpid themselves. However we still trap SIGCHLD currently. In the future, we could switch our notification model mode to be compatible with apps which depend on SIGCHLD or might indiscriminately on children (which might prevent us from knowing about SIGCHLD).
-rw-r--r-- | lib/yahns/server.rb | 32 | ||||
-rw-r--r-- | lib/yahns/server_mp.rb | 21 |
2 files changed, 31 insertions, 22 deletions
diff --git a/lib/yahns/server.rb b/lib/yahns/server.rb index 898be2c..9eb5378 100644 --- a/lib/yahns/server.rb +++ b/lib/yahns/server.rb @@ -412,6 +412,15 @@ class Yahns::Server # :nodoc: end end + def reap_reexec + @reexec_pid > 0 or return + wpid, status = Process.waitpid2(@reexec_pid, Process::WNOHANG) + wpid or return + @logger.error "reaped #{status.inspect} exec()-ed" + @reexec_pid = 0 + self.pid = @pid.chomp('.oldbin') if @pid + end + def sp_sig_handle(alive) @sev.kgio_wait_readable(alive ? nil : 0.01) @sev.yahns_step @@ -419,7 +428,7 @@ class Yahns::Server # :nodoc: when :QUIT, :TERM, :INT return quit_enter(alive) when :CHLD - reap_all + reap_reexec when :USR1 usr1_reopen('') when :USR2 @@ -456,25 +465,4 @@ class Yahns::Server # :nodoc: ensure quit_finish end - - # reaps all unreaped workers/reexec processes - def reap_all - begin - wpid, status = Process.waitpid2(-1, Process::WNOHANG) - wpid or return - if @reexec_pid == wpid - @logger.error "reaped #{status.inspect} exec()-ed" - @reexec_pid = 0 - self.pid = @pid.chomp('.oldbin') if @pid - proc_name('master') if @worker_processes - else - worker = @workers.delete(wpid) - desc = worker ? "worker=#{worker.nr}" : "(unknown)" - m = "reaped #{status.inspect} #{desc}" - status.success? ? @logger.info(m) : @logger.error(m) - end - rescue Errno::ECHILD - return - end while true - end end diff --git a/lib/yahns/server_mp.rb b/lib/yahns/server_mp.rb index 1e2f1c8..115f94a 100644 --- a/lib/yahns/server_mp.rb +++ b/lib/yahns/server_mp.rb @@ -164,4 +164,25 @@ module Yahns::ServerMP # :nodoc: end alive end + + # reaps all unreaped workers/reexec processes + def reap_all + begin + wpid, status = Process.waitpid2(-1, Process::WNOHANG) + wpid or return + if @reexec_pid == wpid + @logger.error "reaped #{status.inspect} exec()-ed" + @reexec_pid = 0 + self.pid = @pid.chomp('.oldbin') if @pid + proc_name('master') + else + worker = @workers.delete(wpid) + desc = worker ? "worker=#{worker.nr}" : "(unknown)" + m = "reaped #{status.inspect} #{desc}" + status.success? ? @logger.info(m) : @logger.error(m) + end + rescue Errno::ECHILD + return + end while true + end end |