prefork_engine 0.0.5 → 0.0.6

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: d61cdcde16f3e999e4fb7335f9f799bec53dd4ec
4
- data.tar.gz: aca8bdb8dde327a138f9d3291f998c3aecbdc004
3
+ metadata.gz: 913fd5c478bf07925ad2f434c57c260b65377ee6
4
+ data.tar.gz: 2760508f97238333c076016edddb5fc97a693ac9
5
5
  SHA512:
6
- metadata.gz: 7d9b252d0eee1b472bc81c01fd76b367ad354637466018dd6367f55780d17289056bbd3d13b45d726d07b3003d4fe2089c322ef94fafa7e8c604d80ae3c4e8c9
7
- data.tar.gz: 099b01f4de3e829ef010bc34519ac2fcd7665ff8a77bb8f67a054d55756a80588cff5a5b3e4f8a52bddc886743736c490341e0198910f537b3557f8f5075a4f7
6
+ metadata.gz: ddfb88f037f3404eb74b3d518acc0bacaea5bdd0eb58540b329c2b7d6830a8c5fcadde8d83b4dcead4a1a1b83e61387c5d13373be1df428fc98b8ac2ef759ac1
7
+ data.tar.gz: 63ed40cfb577c17e28e127310816ae66a6886870468616805a346a93028d2606565c1c141d9a69760a9d33f2ce799624fd6feeff51f6ebd35f71d8d15f08fb6a
@@ -2,3 +2,4 @@ language: ruby
2
2
  rvm:
3
3
  - 2.0.0
4
4
  - 2.1.5
5
+ - 2.2.3
data/Changes CHANGED
@@ -1,3 +1,7 @@
1
+ 0.0.6
2
+
3
+ - implement wait_all_children(timeout)
4
+
1
5
  0.0.5 2014-12-19T16:39:31Z
2
6
 
3
7
  - clean up code
@@ -1,5 +1,6 @@
1
1
  require "prefork_engine/version"
2
2
  require 'proc/wait3'
3
+ require 'timeout'
3
4
 
4
5
  class PreforkEngine
5
6
  attr_reader :signal_received
@@ -76,7 +77,7 @@ class PreforkEngine
76
77
  @worker_pids[pid] = @generation
77
78
  self._update_spawn_delay(@options["spawn_interval"])
78
79
  end
79
- if r = self._wait()
80
+ if r = self._wait(action <= 0 ? 1 : 0)
80
81
  self._on_child_reap(r.pid, r.status)
81
82
  if @worker_pids.delete(r.pid) == @generation && r.status != 0
82
83
  self._update_spawn_delay(@options["err_respawn_interval"])
@@ -146,43 +147,59 @@ class PreforkEngine
146
147
  return t
147
148
  end
148
149
 
149
- def wait_all_children
150
- #XXX todo timeout
151
- while !@worker_pids.keys.empty?
152
- if r = self._wait()
153
- if @worker_pids.delete(r.pid)
154
- self._on_child_reap(r.pid, r.status)
150
+ def wait_all_children(timeout = 0)
151
+ wait_loop = proc {
152
+ while !@worker_pids.keys.empty?
153
+ if r = self._wait(1)
154
+ if @worker_pids.delete(r.pid)
155
+ self._on_child_reap(r.pid, r.status)
156
+ end
155
157
  end
156
158
  end
159
+ }
160
+ if timeout > 0
161
+ begin
162
+ timeout(timeout){
163
+ wait_loop.call
164
+ }
165
+ rescue Timeout::Error
166
+ # ignore
167
+ end
168
+ else
169
+ wait_loop.call()
157
170
  end
158
- return 0
171
+ return self.num_workers();
159
172
  end # wait_all_children
160
173
 
161
174
  def _update_spawn_delay(secs)
162
175
  @_no_adjust_until = secs ? Time.now.to_f + secs : 0.0
163
176
  end
164
177
 
165
- def _wait()
166
- #XXX always blocking
167
- delayed_task_sleep = self._handle_delayed_task()
168
- delayed_fork_sleep = self._decide_action > 0 ? [@_no_adjust_until - Time.now.to_f,0].max : nil
169
- sleep_secs = [delayed_task_sleep,delayed_fork_sleep,self._max_wait].select {|v| v != nil}
170
- begin
171
- if sleep_secs.min != nil
172
- sleep(sleep_secs.min)
173
- # nonblock
174
- return Process.wait3(1)
175
- else
176
- #block
177
- return Process.wait3(0)
178
+ def _wait(block)
179
+ if !block
180
+ self._handle_delayed_task()
181
+ return Process.wait3(Process::WNOHANG)
182
+ else
183
+ delayed_task_sleep = self._handle_delayed_task()
184
+ delayed_fork_sleep = self._decide_action > 0 ? [@_no_adjust_until - Time.now.to_f,0].max : nil
185
+ sleep_secs = [delayed_task_sleep,delayed_fork_sleep,self._max_wait].select {|v| v != nil}
186
+ begin
187
+ if sleep_secs.min != nil
188
+ sleep(sleep_secs.min)
189
+ # nonblock
190
+ return Process.wait3(Process::WNOHANG)
191
+ else
192
+ #block
193
+ return Process.wait3(0)
194
+ end
195
+ rescue Errno::EINTR
196
+ # wait for timer thread?
197
+ sleep 0.02
198
+ rescue Errno::ECHILD
199
+ # nothing
178
200
  end
179
- rescue Errno::EINTR
180
- # wait for timer thread?
181
- sleep 0.02
182
- rescue Errno::ECHILD
183
- # nothing
201
+ return nil
184
202
  end
185
- return nil
186
203
  end #_wait
187
204
 
188
205
  def _max_wait
@@ -1,3 +1,3 @@
1
1
  class PreforkEngine
2
- VERSION = "0.0.5"
2
+ VERSION = "0.0.6"
3
3
  end
@@ -0,0 +1,38 @@
1
+ require 'spec_helper'
2
+
3
+ pm = PreforkEngine.new(
4
+ "max_workers" => 3,
5
+ "spawn_interval" => 1,
6
+ "trap_signals" => {
7
+ "TERM" => ["TERM",2],
8
+ "HUP" => "TERM"
9
+ }
10
+ )
11
+ while pm.signal_received != "TERM"
12
+ pm.start {
13
+ term_req = 0
14
+ Signal.trap("TERM",
15
+ proc {
16
+ term_req += 1
17
+ exit!(0) if term_req > 3
18
+ })
19
+ sleep 1
20
+ Process.kill("TERM", pm.manager_pid)
21
+ while true
22
+ sleep 1
23
+ end
24
+ }
25
+ end
26
+
27
+ send_term = 0
28
+ while pm.wait_all_children(1) > 0
29
+ pm.signal_all_children("TERM")
30
+ send_term += 1
31
+ end
32
+
33
+ describe PreforkEngine do
34
+ it 'wait_timeout' do
35
+ expect(send_term).to be >= 3
36
+ end
37
+ end
38
+
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: prefork_engine
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.5
4
+ version: 0.0.6
5
5
  platform: ruby
6
6
  authors:
7
7
  - Masahiro Nagano
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2014-12-19 00:00:00.000000000 Z
11
+ date: 2015-11-12 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bundler
@@ -90,6 +90,7 @@ files:
90
90
  - spec/02_reconfigure_spec.rb
91
91
  - spec/04_interval_spec.rb
92
92
  - spec/05_before_after_fork_spec.rb
93
+ - spec/06_wait_timeout_spec.rb
93
94
  - spec/spec_helper.rb
94
95
  homepage: https://github.com/kazeburo/prefork_engine/
95
96
  licenses:
@@ -111,7 +112,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
111
112
  version: '0'
112
113
  requirements: []
113
114
  rubyforge_project:
114
- rubygems_version: 2.2.2
115
+ rubygems_version: 2.4.5.1
115
116
  signing_key:
116
117
  specification_version: 4
117
118
  summary: a simple prefork server framework
@@ -120,4 +121,5 @@ test_files:
120
121
  - spec/02_reconfigure_spec.rb
121
122
  - spec/04_interval_spec.rb
122
123
  - spec/05_before_after_fork_spec.rb
124
+ - spec/06_wait_timeout_spec.rb
123
125
  - spec/spec_helper.rb