summaryrefslogtreecommitdiff
path: root/www-servers/puma/files/puma-3.12.1-ruby26-waitpid.patch
blob: b28c69fa4d4b80c41e096c3e4802c56495f58dc9 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
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