perfectqueue 0.8.28 → 0.8.29
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- data/ChangeLog +16 -0
- data/lib/perfectqueue/multiprocess/child_process_monitor.rb +46 -9
- data/lib/perfectqueue/version.rb +1 -1
- metadata +2 -2
data/ChangeLog
CHANGED
@@ -1,4 +1,20 @@
|
|
1
1
|
|
2
|
+
== 2014-04-02 version 0.8.29
|
3
|
+
|
4
|
+
* Updated ChildProcessMonitor to kill grandchildren to not depend on
|
5
|
+
sys-proctable gem
|
6
|
+
|
7
|
+
|
8
|
+
== 2014-03-31 version 0.8.28
|
9
|
+
|
10
|
+
* Fixed ChildProcessMonitor when heartbeat pipe is closed
|
11
|
+
|
12
|
+
|
13
|
+
== 2014-03-31 version 0.8.27
|
14
|
+
|
15
|
+
* ChildProcessMonitor kills grandchildren as well when it force kills children.
|
16
|
+
|
17
|
+
|
2
18
|
== 2014-03-27 version 0.8.26
|
3
19
|
|
4
20
|
* Added delay before sending KILL signal to worker process when
|
@@ -52,7 +52,7 @@ module PerfectQueue
|
|
52
52
|
|
53
53
|
now = Time.now.to_i
|
54
54
|
if delay == 0
|
55
|
-
|
55
|
+
kill_children(now, nil)
|
56
56
|
@kill_start_time = now
|
57
57
|
else
|
58
58
|
@kill_start_time = now + delay
|
@@ -88,7 +88,7 @@ module PerfectQueue
|
|
88
88
|
# resend signal
|
89
89
|
now = Time.now.to_i
|
90
90
|
if @last_kill_time + kill_interval <= now
|
91
|
-
|
91
|
+
kill_children(now, graceful_kill_limit)
|
92
92
|
end
|
93
93
|
|
94
94
|
return false
|
@@ -107,19 +107,56 @@ module PerfectQueue
|
|
107
107
|
end
|
108
108
|
|
109
109
|
private
|
110
|
-
def
|
110
|
+
def kill_children(now, graceful_kill_limit)
|
111
|
+
immediate = @kill_immediate || (graceful_kill_limit && @kill_start_time + graceful_kill_limit < now)
|
112
|
+
|
113
|
+
if immediate
|
114
|
+
pids = collect_child_pids(get_ppid_pids_map, [@pid], @pid)
|
115
|
+
pids.reverse_each {|pid|
|
116
|
+
kill_process(child, true)
|
117
|
+
}
|
118
|
+
else
|
119
|
+
kill_process(@pid, false)
|
120
|
+
end
|
121
|
+
|
122
|
+
@last_kill_time = now
|
123
|
+
end
|
124
|
+
|
125
|
+
def get_ppid_pids_map
|
126
|
+
ppid_pids = {} # {ppid => [pid]}
|
127
|
+
`ps -ao pid,ppid`.each_line do |line|
|
128
|
+
if m = /^\s*(\d+)\s+(\d+)\s*$/.match(line)
|
129
|
+
(ppid_pids[m[2].to_i] ||= []) << m[1].to_i
|
130
|
+
end
|
131
|
+
end
|
132
|
+
return ppid_pids
|
133
|
+
# We can ignore errors but not necessary
|
134
|
+
#rescue
|
135
|
+
# return {}
|
136
|
+
end
|
137
|
+
|
138
|
+
def collect_child_pids(ppid_pids, results, parent_pid)
|
139
|
+
if pids = ppid_pids[parent_pid]
|
140
|
+
pids.each {|pid|
|
141
|
+
results << pid
|
142
|
+
collect_child_pids(ppid_pids, results, pid)
|
143
|
+
}
|
144
|
+
end
|
145
|
+
results
|
146
|
+
end
|
147
|
+
|
148
|
+
def kill_process(pid, immediate)
|
111
149
|
begin
|
112
|
-
if
|
113
|
-
@log.debug "sending SIGKILL to pid=#{
|
114
|
-
Process.kill(:KILL,
|
150
|
+
if immediate
|
151
|
+
@log.debug "sending SIGKILL to pid=#{pid} for immediate stop"
|
152
|
+
Process.kill(:KILL, pid)
|
115
153
|
else
|
116
|
-
@log.debug "sending SIGTERM to pid=#{
|
117
|
-
Process.kill(:TERM,
|
154
|
+
@log.debug "sending SIGTERM to pid=#{pid} for graceful stop"
|
155
|
+
Process.kill(:TERM, pid)
|
118
156
|
end
|
119
157
|
rescue Errno::ESRCH, Errno::EPERM
|
120
158
|
# TODO log?
|
121
159
|
end
|
122
|
-
@last_kill_time = now
|
123
160
|
end
|
124
161
|
end
|
125
162
|
|
data/lib/perfectqueue/version.rb
CHANGED
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: perfectqueue
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.8.
|
4
|
+
version: 0.8.29
|
5
5
|
prerelease:
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
@@ -9,7 +9,7 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date: 2014-
|
12
|
+
date: 2014-04-02 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: sequel
|