prefork_engine 0.0.2 → 0.0.3
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/Changes +5 -1
- data/example/starlet.rb +40 -28
- data/lib/prefork_engine.rb +14 -15
- data/lib/prefork_engine/version.rb +1 -1
- data/spec/05_before_after_fork_spec.rb +23 -22
- metadata +2 -2
checksums.yaml
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
SHA1:
|
|
3
|
-
metadata.gz:
|
|
4
|
-
data.tar.gz:
|
|
3
|
+
metadata.gz: 751dd9a7be4cb03e610d40d41690387f9f99d209
|
|
4
|
+
data.tar.gz: 6b84aaf21286708313a0908374b51eac0ed0664c
|
|
5
5
|
SHA512:
|
|
6
|
-
metadata.gz:
|
|
7
|
-
data.tar.gz:
|
|
6
|
+
metadata.gz: ec62efd7c0c4302652489608b83a9f7f4d703e679f6517bc020ce7f3a92d6153fb53e552aa7923a578991fff0252a2bb05c9e2c9736e290337d43385d95b529a
|
|
7
|
+
data.tar.gz: 0bf1d99655ec5a9e183cc2d59f23a51e5ee01d67b680efba23166bf2794bd8b62999c16e737989239076ef592a28087991c45e3a9cdc5829ce4519657452c87f
|
data/Changes
CHANGED
data/example/starlet.rb
CHANGED
|
@@ -69,7 +69,6 @@ module Rack
|
|
|
69
69
|
@server = nil
|
|
70
70
|
@_is_tcp = false
|
|
71
71
|
@_using_defer_accept = false
|
|
72
|
-
|
|
73
72
|
end
|
|
74
73
|
|
|
75
74
|
def setup_listener()
|
|
@@ -146,43 +145,41 @@ module Rack
|
|
|
146
145
|
exit!(true)
|
|
147
146
|
end
|
|
148
147
|
}
|
|
149
|
-
Signal.trap('PIPE',
|
|
148
|
+
Signal.trap('PIPE', proc { })
|
|
150
149
|
max_reqs = self._calc_reqs_per_child()
|
|
151
150
|
while proc_req_count < max_reqs
|
|
152
151
|
@can_exit = true
|
|
153
152
|
connection = @server.accept
|
|
154
153
|
begin
|
|
155
|
-
connection.nonblock
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
}
|
|
178
|
-
self.handle_connection(env, connection, app)
|
|
154
|
+
connection.nonblock = true
|
|
155
|
+
peeraddr = nil
|
|
156
|
+
peerport = 0
|
|
157
|
+
if @_is_tcp then
|
|
158
|
+
connection.setsockopt(Socket::IPPROTO_TCP, Socket::TCP_NODELAY, 1)
|
|
159
|
+
peer = connection.peeraddr
|
|
160
|
+
peeraddr = peer[2]
|
|
161
|
+
peerport = peer[1].to_s
|
|
162
|
+
end
|
|
163
|
+
proc_req_count += 1
|
|
164
|
+
@_is_deferred_accept = @_using_defer_accept
|
|
165
|
+
env = {
|
|
166
|
+
'SERVER_NAME' => @options[:Host],
|
|
167
|
+
'SERVER_PORT' => @options[:Port].to_s,
|
|
168
|
+
'REMOTE_ADDR' => peeraddr,
|
|
169
|
+
'REMOTE_PORT' => peerport,
|
|
170
|
+
'rack.version' => [0,1],
|
|
171
|
+
'rack.errors' => STDERR,
|
|
172
|
+
'rack.multithread' => false,
|
|
173
|
+
'rack.multiprocess' => false,
|
|
174
|
+
'rack.run_once' => false,
|
|
175
|
+
'rack.url_scheme' => 'http'
|
|
179
176
|
}
|
|
177
|
+
self.handle_connection(env, connection, app)
|
|
180
178
|
ensure
|
|
181
179
|
connection.close
|
|
182
180
|
end
|
|
183
181
|
end
|
|
184
182
|
end
|
|
185
|
-
|
|
186
183
|
def handle_connection(env, connection, app)
|
|
187
184
|
buf = ""
|
|
188
185
|
while true
|
|
@@ -222,12 +219,27 @@ module Rack
|
|
|
222
219
|
end
|
|
223
220
|
status, header, body = app.call(env)
|
|
224
221
|
res_header = "HTTP/1.0 "+status.to_s+" "+Rack::Utils::HTTP_STATUS_CODES[status]+"\r\nConnection: close\r\n"
|
|
222
|
+
sent_date = false
|
|
223
|
+
sent_server = false
|
|
225
224
|
header.each do |k,vs|
|
|
226
|
-
|
|
225
|
+
dk = k.downcase
|
|
226
|
+
if dk == "connection" then
|
|
227
227
|
next
|
|
228
228
|
end
|
|
229
|
+
if dk == "date" then
|
|
230
|
+
sent_date = true
|
|
231
|
+
end
|
|
232
|
+
if dk == "server" then
|
|
233
|
+
sent_server = true
|
|
234
|
+
end
|
|
229
235
|
res_header += k + ": " + vs + "\r\n"
|
|
230
236
|
end
|
|
237
|
+
if !sent_date then
|
|
238
|
+
res_header += "Date: " + Time.now.httpdate + "\r\n"
|
|
239
|
+
end
|
|
240
|
+
if !sent_server then
|
|
241
|
+
res_header += "Server: RubyStarlet\r\n"
|
|
242
|
+
end
|
|
231
243
|
res_header += "\r\n"
|
|
232
244
|
if body.length == 1 && body[0].bytesize < 40960 then
|
|
233
245
|
ret = self.write_all(connection,res_header+body[0])
|
data/lib/prefork_engine.rb
CHANGED
|
@@ -24,13 +24,13 @@ class PreforkEngine
|
|
|
24
24
|
@_no_adjust_until = 0.0
|
|
25
25
|
@in_child = false
|
|
26
26
|
@worker_pids = {}
|
|
27
|
-
@
|
|
27
|
+
@delayed_task = nil
|
|
28
28
|
@options["trap_signals"].each do |k,kv|
|
|
29
|
-
|
|
29
|
+
Signal.trap(k) { |signo|
|
|
30
30
|
@signal_received = Signal.signame(signo)
|
|
31
31
|
}
|
|
32
32
|
end
|
|
33
|
-
|
|
33
|
+
Signal.trap("CHLD") {
|
|
34
34
|
#do nothing
|
|
35
35
|
}
|
|
36
36
|
end
|
|
@@ -42,7 +42,7 @@ class PreforkEngine
|
|
|
42
42
|
raise "cannot start another process while you are in child process" if @in_child
|
|
43
43
|
|
|
44
44
|
# main loop
|
|
45
|
-
while @signal_received.
|
|
45
|
+
while @signal_received.length == 0
|
|
46
46
|
action = self._decide_action() if @_no_adjust_until <= Time.now.to_f
|
|
47
47
|
if action > 0 then
|
|
48
48
|
# start a new worker
|
|
@@ -61,10 +61,11 @@ class PreforkEngine
|
|
|
61
61
|
if pid == nil then
|
|
62
62
|
@in_child = true
|
|
63
63
|
@options["trap_signals"].each do |k,kv|
|
|
64
|
-
Signal.trap(k, 0) #XXX
|
|
64
|
+
## Signal.trap(k, 0) #XXX in rspec only?
|
|
65
|
+
Signal.trap(k, "DEFAULT")
|
|
65
66
|
end
|
|
66
|
-
Signal.trap("CHLD", 0) #XXX
|
|
67
|
-
|
|
67
|
+
## Signal.trap("CHLD", 0) #XXX in rspec only?
|
|
68
|
+
Signal.trap("CHLD", "DEFAULT")
|
|
68
69
|
block.call
|
|
69
70
|
exit!(true)
|
|
70
71
|
end
|
|
@@ -75,11 +76,9 @@ class PreforkEngine
|
|
|
75
76
|
@worker_pids[pid] = @generation
|
|
76
77
|
self._update_spawn_delay(@options["spawn_interval"])
|
|
77
78
|
end
|
|
78
|
-
if
|
|
79
|
-
|
|
80
|
-
status
|
|
81
|
-
self._on_child_reap(exit_pid, status)
|
|
82
|
-
if @worker_pids.delete(exit_pid) == @generation && status != 0 then
|
|
79
|
+
if r = self._wait() then
|
|
80
|
+
self._on_child_reap(r.pid, r.status)
|
|
81
|
+
if @worker_pids.delete(r.pid) == @generation && r.status != 0 then
|
|
83
82
|
self._update_spawn_delay(@options["err_respawn_interval"])
|
|
84
83
|
end
|
|
85
84
|
end
|
|
@@ -150,9 +149,9 @@ class PreforkEngine
|
|
|
150
149
|
def wait_all_children
|
|
151
150
|
#XXX todo timeout
|
|
152
151
|
while !@worker_pids.keys.empty?
|
|
153
|
-
if
|
|
154
|
-
if @worker_pids.delete(
|
|
155
|
-
self._on_child_reap(
|
|
152
|
+
if r = self._wait() then
|
|
153
|
+
if @worker_pids.delete(r.pid) then
|
|
154
|
+
self._on_child_reap(r.pid, r.status)
|
|
156
155
|
end
|
|
157
156
|
end
|
|
158
157
|
end
|
|
@@ -1,29 +1,30 @@
|
|
|
1
1
|
require 'spec_helper'
|
|
2
2
|
|
|
3
|
+
i = 0
|
|
4
|
+
j = 0
|
|
5
|
+
pm = PreforkEngine.new(
|
|
6
|
+
"max_workers" => 3,
|
|
7
|
+
"trap_signals" => {
|
|
8
|
+
"TERM" => "TERM",
|
|
9
|
+
},
|
|
10
|
+
"before_fork" => proc { |pm2|
|
|
11
|
+
i += 1
|
|
12
|
+
},
|
|
13
|
+
"after_fork" => proc { |pm3|
|
|
14
|
+
j += 1
|
|
15
|
+
}
|
|
16
|
+
)
|
|
17
|
+
while pm.signal_received != "TERM"
|
|
18
|
+
pm.start {
|
|
19
|
+
if i == 10 then
|
|
20
|
+
Process.kill("TERM", pm.manager_pid)
|
|
21
|
+
end
|
|
22
|
+
}
|
|
23
|
+
end
|
|
24
|
+
pm.wait_all_children()
|
|
25
|
+
|
|
3
26
|
describe PreforkEngine do
|
|
4
27
|
it 'before_after_fork' do
|
|
5
|
-
i = 0
|
|
6
|
-
j = 0
|
|
7
|
-
pm = PreforkEngine.new(
|
|
8
|
-
"max_workers" => 3,
|
|
9
|
-
"trap_signals" => {
|
|
10
|
-
"TERM" => "TERM",
|
|
11
|
-
},
|
|
12
|
-
"before_fork" => proc { |pm2|
|
|
13
|
-
i += 1
|
|
14
|
-
},
|
|
15
|
-
"after_fork" => proc { |pm3|
|
|
16
|
-
j += 1
|
|
17
|
-
}
|
|
18
|
-
)
|
|
19
|
-
while pm.signal_received != "TERM"
|
|
20
|
-
pm.start {
|
|
21
|
-
if i == 10 then
|
|
22
|
-
Process.kill("TERM", pm.manager_pid)
|
|
23
|
-
end
|
|
24
|
-
}
|
|
25
|
-
end
|
|
26
|
-
pm.wait_all_children()
|
|
27
28
|
expect(i).to be >= 10
|
|
28
29
|
expect(j).to be >= 10
|
|
29
30
|
end
|
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.3
|
|
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-
|
|
11
|
+
date: 2014-12-16 00:00:00.000000000 Z
|
|
12
12
|
dependencies:
|
|
13
13
|
- !ruby/object:Gem::Dependency
|
|
14
14
|
name: bundler
|