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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 28b3d832f86df0ffd4cc4f50995409fdf6e5fa03
4
- data.tar.gz: 7cccd2f8bf896a14e5695616cf745b86c0905c10
3
+ metadata.gz: 751dd9a7be4cb03e610d40d41690387f9f99d209
4
+ data.tar.gz: 6b84aaf21286708313a0908374b51eac0ed0664c
5
5
  SHA512:
6
- metadata.gz: 0ca812d9907a61cfe97d6199d3c3f72c56b4e92ef82a34b1748933cb10affecac50081d1cf0e1235e9a173323f3bebae218e6c7150661bfd9cd1b08bfa2ca1a9
7
- data.tar.gz: 772d6caa397e481338a53018fe948f83172cffbf52bcc057190e4d963acf427a9a3498d040e54daff91c9b7a8b1cb4858bca24cedae3c3e40027f58586e89b4a
6
+ metadata.gz: ec62efd7c0c4302652489608b83a9f7f4d703e679f6517bc020ce7f3a92d6153fb53e552aa7923a578991fff0252a2bb05c9e2c9736e290337d43385d95b529a
7
+ data.tar.gz: 0bf1d99655ec5a9e183cc2d59f23a51e5ee01d67b680efba23166bf2794bd8b62999c16e737989239076ef592a28087991c45e3a9cdc5829ce4519657452c87f
data/Changes CHANGED
@@ -1,4 +1,8 @@
1
+ 0.0.3 2014-12-16T12:15:11Z
2
+
3
+ - fix signal trap test
4
+
1
5
  0.0.2 2014-12-11T13:22:49Z
2
6
 
3
7
  - remove unnecessary gems from requires
4
- - add example rack handler
8
+ - add example rack handler
@@ -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', 'IGNORE')
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(true) {
156
- peeraddr = nil
157
- peerport = 0
158
- if @_is_tcp then
159
- connection.setsockopt(Socket::IPPROTO_TCP, Socket::TCP_NODELAY, 1)
160
- peer = connection.peeraddr
161
- peeraddr = peer[2],
162
- peerport = peer[1].to_s
163
- end
164
- proc_req_count += 1
165
- @_is_deferred_accept = @_using_defer_accept
166
- env = {
167
- 'SERVER_NAME' => @options[:Host],
168
- 'SERVER_PORT' => @options[:Port].to_s,
169
- 'REMOTE_ADDR' => peeraddr,
170
- 'REMOTE_PORT' => peerport,
171
- 'rack.version' => [0,1],
172
- 'rack.errors' => STDERR,
173
- 'rack.multithread' => false,
174
- 'rack.multiprocess' => false,
175
- 'rack.run_once' => false,
176
- 'rack.url_scheme' => 'http'
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
- if k.downcase == "connection" then
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])
@@ -24,13 +24,13 @@ class PreforkEngine
24
24
  @_no_adjust_until = 0.0
25
25
  @in_child = false
26
26
  @worker_pids = {}
27
- @trap_action = {}
27
+ @delayed_task = nil
28
28
  @options["trap_signals"].each do |k,kv|
29
- @trap_action[k] = Signal.trap(k) { |signo|
29
+ Signal.trap(k) { |signo|
30
30
  @signal_received = Signal.signame(signo)
31
31
  }
32
32
  end
33
- @trap_action["CHLD"] = Signal.trap("CHLD") {
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.size == 0
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
- exit!(true) if @signal_received.size > 0
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 res = self._wait() then
79
- exit_pid = res[0]
80
- status = res[1]
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 res = self._wait() then
154
- if @worker_pids.delete(res[0]) then
155
- self._on_child_reap(res[0],$?.exitstatus)
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,3 +1,3 @@
1
1
  class PreforkEngine
2
- VERSION = "0.0.2"
2
+ VERSION = "0.0.3"
3
3
  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.2
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 00:00:00.000000000 Z
11
+ date: 2014-12-16 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bundler