From b94c3e34faff024a5b1930af36e4d64bd6dde57f Mon Sep 17 00:00:00 2001 From: MSP-Greg Date: Fri, 15 Mar 2019 17:26:20 -0500 Subject: [PATCH] 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 Co-authored-by: guilleiguaran --- lib/puma/cluster.rb | 20 +++++++++++++++++++- 1 file changed, 19 insertions(+), 1 deletion(-) diff --git a/lib/puma/cluster.rb b/lib/puma/cluster.rb index 93d65131..0879c96c 100644 --- a/lib/puma/cluster.rb +++ b/lib/puma/cluster.rb @@ -37,7 +37,25 @@ def stop_workers @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