prefork_engine 0.0.5 → 0.0.6

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.
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