You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
gentoo-overlay/www-servers/puma/files/puma-3.12.1-ruby26-waitpid....

48 lines
1.7 KiB

From b94c3e34faff024a5b1930af36e4d64bd6dde57f Mon Sep 17 00:00:00 2001
From: MSP-Greg <MSP-Greg@users.noreply.github.com>
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 <greg.mpls@gmail.com>
Co-authored-by: guilleiguaran <guilleiguaran@gmail.com>
---
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