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