prefork_engine 0.0.2 → 0.0.3
Sign up to get free protection for your applications and to get access to all the features.
- 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
|