1
0
Fork 0
mirror of https://github.com/puma/puma.git synced 2022-11-09 13:48:40 -05:00

Puma::Cluster#stop_workers - use WNOHANG with nil return tests

Ruby 2.6 introduced a bug that affects worker shutdown (waitpid).

Added code using Process::WNOHANG along with needed logic. Adds worker status (via $?) and total shutdown time to log.

Co-authored-by: MSP-Greg <greg.mpls@gmail.com>
Co-authored-by: guilleiguaran <guilleiguaran@gmail.com>
This commit is contained in:
MSP-Greg 2019-03-15 17:26:20 -05:00
parent ca03c52075
commit b94c3e34fa

View file

@ -37,7 +37,25 @@ module Puma
@workers.each { |x| x.term }
begin
@workers.each { |w| Process.waitpid(w.pid) }
if RUBY_VERSION < '2.6'
@workers.each { |w| Process.waitpid(w.pid) }
else
# below code is for a bug in Ruby 2.6+, above waitpid call hangs
t_st = Process.clock_gettime(Process::CLOCK_MONOTONIC)
pids = @workers.map(&:pid)
loop do
pids.reject! do |w_pid|
if Process.waitpid(w_pid, Process::WNOHANG)
log " worker status: #{$?}"
true
end
end
break if pids.empty?
sleep 0.5
end
t_end = Process.clock_gettime(Process::CLOCK_MONOTONIC)
log format(" worker shutdown time: %6.2f", t_end - t_st)
end
rescue Interrupt
log "! Cancelled waiting for workers"
end