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 +4 -4
- data/.travis.yml +1 -0
- data/Changes +4 -0
- data/lib/prefork_engine.rb +44 -27
- data/lib/prefork_engine/version.rb +1 -1
- data/spec/06_wait_timeout_spec.rb +38 -0
- metadata +5 -3
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 913fd5c478bf07925ad2f434c57c260b65377ee6
|
4
|
+
data.tar.gz: 2760508f97238333c076016edddb5fc97a693ac9
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: ddfb88f037f3404eb74b3d518acc0bacaea5bdd0eb58540b329c2b7d6830a8c5fcadde8d83b4dcead4a1a1b83e61387c5d13373be1df428fc98b8ac2ef759ac1
|
7
|
+
data.tar.gz: 63ed40cfb577c17e28e127310816ae66a6886870468616805a346a93028d2606565c1c141d9a69760a9d33f2ce799624fd6feeff51f6ebd35f71d8d15f08fb6a
|
data/.travis.yml
CHANGED
data/Changes
CHANGED
data/lib/prefork_engine.rb
CHANGED
@@ -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
|
-
|
151
|
-
|
152
|
-
|
153
|
-
|
154
|
-
|
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
|
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
|
-
|
167
|
-
|
168
|
-
|
169
|
-
|
170
|
-
|
171
|
-
|
172
|
-
|
173
|
-
|
174
|
-
|
175
|
-
|
176
|
-
|
177
|
-
|
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
|
-
|
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
|
@@ -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.
|
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:
|
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.
|
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
|