perfectqueue 0.8.28 → 0.8.29

Sign up to get free protection for your applications and to get access to all the features.
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
- kill_child(now, nil)
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
- kill_child(now, graceful_kill_limit)
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 kill_child(now, graceful_kill_limit)
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 @kill_immediate || (graceful_kill_limit && @kill_start_time + graceful_kill_limit < now)
113
- @log.debug "sending SIGKILL to pid=#{@pid} for immediate stop"
114
- Process.kill(:KILL, @pid)
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=#{@pid} for graceful stop"
117
- Process.kill(:TERM, @pid)
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
 
@@ -1,3 +1,3 @@
1
1
  module PerfectQueue
2
- VERSION = "0.8.28"
2
+ VERSION = "0.8.29"
3
3
  end
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.28
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-03-31 00:00:00.000000000 Z
12
+ date: 2014-04-02 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: sequel