serverengine 1.5.0 → 1.5.1

Sign up to get free protection for your applications and to get access to all the features.
data/.gitignore ADDED
@@ -0,0 +1,3 @@
1
+ Gemfile.lock
2
+ tmp/*
3
+ pkg/*
data/Changelog CHANGED
@@ -1,4 +1,9 @@
1
1
 
2
+ 2013-06-04 version 1.5.1:
3
+
4
+ * Changed #close callback to #after_start
5
+
6
+
2
7
  2013-06-01 version 1.5.0:
3
8
 
4
9
  * First release
data/Gemfile CHANGED
@@ -1,3 +1,2 @@
1
1
  source 'https://rubygems.org/'
2
-
3
2
  gemspec
data/README.md CHANGED
@@ -155,17 +155,17 @@ You can restart a server process without waiting for completion of shutdown proc
155
155
  This feature is useful to minimize downtime where workers take long time to complete tasks.
156
156
 
157
157
  ```
158
- # 1. start server
158
+ # 1. starts server
159
159
  +------------+ +----------+ +-----------+
160
160
  | Supervisor |----| Server |----| Worker(s) |
161
161
  +------------+ +----------+ +-----------+
162
162
 
163
- # 2. detach (SIGINT) and waits for completion for several seconds
163
+ # 2. receives SIGINT and waits for shutdown of the server for server_detach_wait
164
164
  +------------+ +----------+ +-----------+
165
165
  | Supervisor | | Server |----| Worker(s) |
166
166
  +------------+ +----------+ +-----------+
167
167
 
168
- # 3. start new server if the server doesn't exit in a short time
168
+ # 3. starts new server if the server doesn't exit in server_detach_wait time
169
169
  +------------+ +----------+ +-----------+
170
170
  | Supervisor |\ | Server |----| Worker(s) |
171
171
  +------------+ | +----------+ +-----------+
@@ -174,7 +174,7 @@ This feature is useful to minimize downtime where workers take long time to comp
174
174
  \--| Server |----| Worker(s) |
175
175
  +----------+ +-----------+
176
176
 
177
- # 4. old server exits
177
+ # 4. old server exits eventually
178
178
  +------------+
179
179
  | Supervisor |\
180
180
  +------------+ |
@@ -230,7 +230,7 @@ Send `USR2` signal to reload configuration file.
230
230
 
231
231
  ### BlockingFlag
232
232
 
233
- `ServerEngine::BlockingFlag` is recommended to stop workers because `stop` methods is called by a different thread from the `run` thread.
233
+ `ServerEngine::BlockingFlag` is recommended to stop workers because `stop` method is called by a different thread from the `run` thread.
234
234
 
235
235
  ```ruby
236
236
  module MyWorker
@@ -259,12 +259,46 @@ se.run
259
259
  ```
260
260
 
261
261
 
262
+ ## Module methods
263
+
264
+ ### Worker module
265
+
266
+ - interface
267
+ - `initialize` is called in the parent process (or thread) in contrast to the other methods
268
+ - `before_fork` is called before fork for each worker process (available only if `worker_type` is "process")
269
+ - `run` is the required method
270
+ - `stop` is called when TERM signal is received
271
+ - `reload` is called when USR2 signal is received
272
+ - `after_start` is called after starting the worker process in the parent process (or thread) (available only if `worker_type` is "process" or "thread")
273
+ - api
274
+ - `server` server instance
275
+ - `config` configuration
276
+ - `logger` logger
277
+ - `worker_id` serial id of workers beginning from 0
278
+
279
+
280
+ ### Server module
281
+
282
+ - interface
283
+ - `initialize` is called in the parent process in contrast to the other methods
284
+ - `before_run` is called before starting workers
285
+ - `after_run` is called before shutting down
286
+ - `after_start` is called after starting the server process in the parent process (available only if `supervisor` parameter is true)
287
+ - hook points (call `super` in these methods)
288
+ - `reload_config`
289
+ - `stop(stop_graceful)`
290
+ - `restart(stop_graceful)`
291
+ - api
292
+ - `config` configuration
293
+ - `logger` logger
294
+
295
+
262
296
  ## Worker types
263
297
 
264
298
  ServerEngine supports 3 worker types:
265
299
 
266
- - **embedded**: uses a thread to run worker module (default). This type doesn't support immediate shutdown and immediate restart.
267
- - **thread**: uses threads to run worker modules. This type doesn't support immediate shutdown and immediate restart.
300
+ - **embedded**: uses a thread to run worker module (default). This type doesn't support immediate shutdown or immediate restart.
301
+ - **thread**: uses threads to run worker modules. This type doesn't support immediate shutdown or immediate restart.
268
302
  - **process**: uses processes to run worker modules. This type doesn't work on Win32 platform.
269
303
 
270
304
 
@@ -278,7 +312,7 @@ ServerEngine supports 3 worker types:
278
312
  - **INT:** detach process for live restarting (available only when `supervisor` and `enable_detach` parameters are true. otherwise graceful shutdown)
279
313
  - **CONT:** dump stacktrace and memory information to /tmp/sigdump-<pid>.log file
280
314
 
281
- Immediate shutdown and restart send SIGQUIT signal to worker processes which killes the processes.
315
+ Immediate shutdown and restart send SIGQUIT signal to worker processes which kills the processes.
282
316
  Graceful shutdown and restart call `Worker#stop` method and wait for completion of `Worker#run` method.
283
317
 
284
318
 
@@ -298,13 +332,14 @@ Graceful shutdown and restart call `Worker#stop` method and wait for completion
298
332
  - **enable_detach** enables INT signal (default: true) (not dynamic reloadable)
299
333
  - **exit_on_detach** exits supervisor after detaching server process instead of restarting it (default: false) (not dynamic reloadable)
300
334
  - **disable_reload** disables USR2 signal (default: false) (not dynamic reloadable)
301
- - **serverrestart_wait** sets wait time before restarting server after last restarting (default: 1.0)
335
+ - **server_restart_wait** sets wait time before restarting server after last restarting (default: 1.0)
302
336
  - **server_detach_wait** sets wait time before starting live restart (default: 10.0)
303
337
  - Multithread server and multiprocess server: available only when `worker_type` is thread or process
304
338
  - **workers** sets number of workers (default: 1)
305
339
  - **start_worker_delay** sets wait time before starting a new worker (default: 0)
306
340
  - **start_worker_delay_rand** randomizes start_worker_delay at this ratio (default: 0.2)
307
341
  - Multiprocess server: available only when `worker_type` is "process"
342
+ - **worker_process_name** changes process name ($0) of workers
308
343
  - **worker_heartbeat_interval**
309
344
  - **worker_heartbeat_timeout**
310
345
  - **worker_graceful_kill_interval**
@@ -28,6 +28,8 @@ module ServerEngine
28
28
  @load_config_proc = load_config_proc
29
29
  end
30
30
  end
31
+
32
+ reload_config
31
33
  end
32
34
 
33
35
  attr_reader :config
@@ -28,8 +28,6 @@ module ServerEngine
28
28
 
29
29
  super(load_config_proc, &block)
30
30
 
31
- reload_config
32
-
33
31
  @daemonize = @config.fetch(:daemonize, false)
34
32
 
35
33
  if @config.fetch(:supervisor, false)
@@ -121,9 +119,9 @@ module ServerEngine
121
119
 
122
120
  s = create_server(create_logger)
123
121
 
124
- STDIN.reopen("/dev/null")
125
- STDOUT.reopen("/dev/null", "wb")
126
- STDERR.reopen("/dev/null", "wb")
122
+ STDIN.reopen(File::NULL)
123
+ STDOUT.reopen(File::NULL, "wb")
124
+ STDERR.reopen(File::NULL, "wb")
127
125
 
128
126
  s.install_signal_handlers
129
127
 
@@ -23,9 +23,9 @@ module ServerEngine
23
23
  auto_tick: false,
24
24
  graceful_kill_signal: Daemon::Signals::GRACEFUL_STOP,
25
25
  auto_heartbeat: true,
26
- abort_on_heartbeat_error: Proc.new do
26
+ on_heartbeat_error: Proc.new do
27
27
  @logger.fatal "parent process unexpectedly terminated"
28
- exit! 1
28
+ exit 1
29
29
  end
30
30
  )
31
31
 
@@ -78,7 +78,7 @@ module ServerEngine
78
78
  end
79
79
 
80
80
  ensure
81
- w.close
81
+ w.after_start
82
82
  end
83
83
 
84
84
  return WorkerMonitor.new(w, wid, pmon)
@@ -23,11 +23,10 @@ module ServerEngine
23
23
  def start_worker(wid)
24
24
  w = create_worker(wid)
25
25
 
26
- w.before_fork
27
26
  begin
28
27
  thread = Thread.new(&w.method(:main))
29
28
  ensure
30
- w.close
29
+ w.after_start
31
30
  end
32
31
 
33
32
  return WorkerMonitor.new(w, thread)
@@ -35,15 +35,15 @@ module ServerEngine
35
35
 
36
36
  @auto_heartbeat = config.fetch(:auto_heartbeat, true)
37
37
 
38
- case op = config.fetch(:abort_on_heartbeat_error, true)
38
+ case op = config[:on_heartbeat_error]
39
+ when nil
40
+ @heartbeat_error_proc = lambda {|t| }
39
41
  when Proc
40
42
  @heartbeat_error_proc = op
41
- when true
43
+ when :abort
42
44
  @heartbeat_error_proc = lambda {|t| exit 1 }
43
- when false
44
- @heartbeat_error_proc = lambda {|t| }
45
45
  else
46
- raise ArgumentError, "unexpected :abort_on_heartbeat_error option (expected Proc, true or false but got #{op.class})"
46
+ raise ArgumentError, "unexpected :on_heartbeat_error option (expected Proc, true or false but got #{op.class})"
47
47
  end
48
48
 
49
49
  configure(config)
@@ -26,8 +26,6 @@ module ServerEngine
26
26
  @stop = false
27
27
 
28
28
  super(load_config_proc, &block)
29
-
30
- reload_config
31
29
  end
32
30
 
33
31
  def before_run
@@ -41,7 +39,7 @@ module ServerEngine
41
39
  nil
42
40
  end
43
41
 
44
- def close
42
+ def after_start
45
43
  end
46
44
 
47
45
  def restart(stop_graceful)
@@ -79,9 +77,6 @@ module ServerEngine
79
77
  ensure
80
78
  after_run
81
79
  end
82
-
83
- ensure
84
- close
85
80
  end
86
81
 
87
82
  module WorkerInitializer
@@ -32,13 +32,10 @@ module ServerEngine
32
32
  graceful_kill_signal: Daemon::Signals::GRACEFUL_STOP,
33
33
  immediate_kill_signal: Daemon::Signals::IMMEDIATE_STOP,
34
34
  auto_heartbeat: true,
35
- abort_on_heartbeat_error: false,
36
35
  )
37
36
 
38
37
  super(load_config_proc, &block)
39
38
 
40
- reload_config
41
-
42
39
  @create_server_proc = Supervisor.create_server_proc(server_module, worker_module, @config)
43
40
  @server_process_name = @config[:server_process_name]
44
41
 
@@ -204,7 +201,7 @@ module ServerEngine
204
201
 
205
202
  return m
206
203
  ensure
207
- s.close
204
+ s.after_start
208
205
  end
209
206
  end
210
207
 
@@ -1,3 +1,3 @@
1
1
  module ServerEngine
2
- VERSION = "1.5.0"
2
+ VERSION = "1.5.1"
3
3
  end
@@ -41,7 +41,7 @@ module ServerEngine
41
41
  def reload
42
42
  end
43
43
 
44
- def close
44
+ def after_start
45
45
  end
46
46
 
47
47
  def install_signal_handlers
@@ -65,8 +65,6 @@ module ServerEngine
65
65
 
66
66
  def main
67
67
  run
68
- ensure
69
- close
70
68
  end
71
69
  end
72
70
 
data/lib/serverengine.rb CHANGED
@@ -46,7 +46,7 @@ module ServerEngine
46
46
  require File.join(here, v)
47
47
  }
48
48
 
49
- def self.create(server_module, worker_module, &config_load_proc)
50
- Daemon.new(server_module, worker_module, &config_load_proc)
49
+ def self.create(server_module, worker_module, load_config_proc={}, &block)
50
+ Daemon.new(server_module, worker_module, load_config_proc={}, &block)
51
51
  end
52
52
  end
data/serverengine.gemspec CHANGED
@@ -18,8 +18,8 @@ Gem::Specification.new do |gem|
18
18
 
19
19
  gem.required_ruby_version = ">= 1.9.3"
20
20
 
21
- gem.add_dependency("sigdump", ["~> 0.2.2"])
21
+ gem.add_dependency "sigdump", ["~> 0.2.2"]
22
22
 
23
- gem.add_development_dependency("rake", [">= 0.9.2"])
24
- gem.add_development_dependency("rspec", ["~> 2.13.0"])
23
+ gem.add_development_dependency "rake", [">= 0.9.2"]
24
+ gem.add_development_dependency "rspec", ["~> 2.13.0"]
25
25
  end
@@ -50,8 +50,8 @@ shared_context 'test server and worker' do
50
50
  incr_test_state :server_after_run
51
51
  end
52
52
 
53
- def close
54
- incr_test_state :server_close
53
+ def after_start
54
+ incr_test_state :server_after_start
55
55
  end
56
56
 
57
57
  def stop(stop_graceful)
@@ -110,8 +110,8 @@ shared_context 'test server and worker' do
110
110
  incr_test_state :worker_reload
111
111
  end
112
112
 
113
- def close
114
- incr_test_state :worker_close
113
+ def after_start
114
+ incr_test_state :worker_after_start
115
115
  end
116
116
  end
117
117
 
@@ -16,7 +16,7 @@ describe ServerEngine::Supervisor do
16
16
  wait_for_fork
17
17
 
18
18
  test_state(:server_before_run).should == 1
19
- test_state(:server_close).should == 1 # parent
19
+ test_state(:server_after_start).should == 1 # parent
20
20
  ensure
21
21
  sv.stop(true)
22
22
  t.join
@@ -27,7 +27,7 @@ describe ServerEngine::Supervisor do
27
27
  test_state(:server_restart).should == 0
28
28
 
29
29
  test_state(:server_after_run).should == 1
30
- test_state(:server_close).should == 2 # parent and child
30
+ test_state(:server_after_start).should == 1
31
31
  end
32
32
 
33
33
  it 'immediate stop' do
@@ -43,7 +43,7 @@ describe ServerEngine::Supervisor do
43
43
  test_state(:server_stop).should == 1
44
44
  test_state(:server_stop_immediate).should == 1
45
45
  test_state(:server_after_run).should == 1
46
- test_state(:server_close).should == 2
46
+ test_state(:server_after_start).should == 1
47
47
  end
48
48
 
49
49
  it 'graceful restart' do
@@ -64,7 +64,7 @@ describe ServerEngine::Supervisor do
64
64
 
65
65
  test_state(:server_before_run).should == 1
66
66
  test_state(:server_after_run).should == 1
67
- test_state(:server_close).should == 2
67
+ test_state(:server_after_start).should == 1
68
68
  end
69
69
 
70
70
  it 'immediate restart' do
@@ -85,7 +85,7 @@ describe ServerEngine::Supervisor do
85
85
 
86
86
  test_state(:server_before_run).should == 1
87
87
  test_state(:server_after_run).should == 1
88
- test_state(:server_close).should == 2
88
+ test_state(:server_after_start).should == 1
89
89
  end
90
90
 
91
91
  it 'reload' do
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: serverengine
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.5.0
4
+ version: 1.5.1
5
5
  prerelease:
6
6
  platform: ruby
7
7
  authors:
@@ -9,7 +9,7 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2013-06-02 00:00:00.000000000 Z
12
+ date: 2013-06-05 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: sigdump
@@ -66,6 +66,7 @@ executables: []
66
66
  extensions: []
67
67
  extra_rdoc_files: []
68
68
  files:
69
+ - .gitignore
69
70
  - COPYING
70
71
  - Changelog
71
72
  - Gemfile
@@ -116,7 +117,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
116
117
  version: '0'
117
118
  segments:
118
119
  - 0
119
- hash: -438822575013834971
120
+ hash: 2571011204453974309
120
121
  requirements: []
121
122
  rubyforge_project:
122
123
  rubygems_version: 1.8.23