dat-tcp 0.2.0 → 0.3.0

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.
data/dat-tcp.gemspec CHANGED
@@ -18,6 +18,8 @@ Gem::Specification.new do |gem|
18
18
  gem.test_files = gem.files.grep(%r{^(test|spec|features)/})
19
19
  gem.require_paths = ["lib"]
20
20
 
21
+ gem.add_dependency("SystemTimer", ["~> 1.2"])
22
+
21
23
  gem.add_development_dependency('assert', ['~> 1.0'])
22
24
  gem.add_development_dependency('assert-mocha', ['~> 1.0'])
23
25
  end
data/lib/dat-tcp.rb CHANGED
@@ -16,14 +16,17 @@ module DatTCP
16
16
 
17
17
  def initialize(config = nil)
18
18
  config = OpenStruct.new(config || {})
19
- @backlog_size = config.backlog_size || 1024
20
- @debug = config.debug || false
21
- @min_workers = config.min_workers || 2
22
- @max_workers = config.max_workers || 4
23
- @ready_timeout = config.ready_timeout || 1
19
+ @backlog_size = config.backlog_size || 1024
20
+ @debug = config.debug || false
21
+ @min_workers = config.min_workers || 2
22
+ @max_workers = config.max_workers || 4
23
+ @ready_timeout = config.ready_timeout || 1
24
+ @shutdown_timeout = config.shutdown_timeout || 15
24
25
 
25
26
  @logger = DatTCP::Logger.new(@debug)
26
27
 
28
+ check_configuration
29
+
27
30
  @tcp_server = nil
28
31
  @work_loop_thread = nil
29
32
  @worker_pool = nil
@@ -193,7 +196,7 @@ module DatTCP
193
196
 
194
197
  def shutdown_worker_pool
195
198
  self.logger.info "Shutting down worker pool, letting it finish..."
196
- @worker_pool.shutdown
199
+ @worker_pool.shutdown(@shutdown_timeout)
197
200
  end
198
201
 
199
202
  def close_connection
@@ -209,6 +212,14 @@ module DatTCP
209
212
  @work_loop_thread.join if @work_loop_thread
210
213
  end
211
214
 
215
+ def check_configuration
216
+ if @min_workers > @max_workers
217
+ self.logger.warn "The minimum number of workers (#{@min_workers}) " \
218
+ "is greater than " \
219
+ "the maximum number of workers (#{@max_workers})."
220
+ end
221
+ end
222
+
212
223
  def run_hook(method, *args)
213
224
  self.send(method, *args)
214
225
  end
@@ -1,3 +1,3 @@
1
1
  module DatTCP
2
- VERSION = "0.2.0"
2
+ VERSION = "0.3.0"
3
3
  end
@@ -1,16 +1,20 @@
1
+ require 'system_timer'
1
2
  require 'thread'
2
3
 
3
4
  require 'dat-tcp/logger'
4
5
 
5
6
  module DatTCP
6
7
 
8
+ TimeoutError = Class.new(RuntimeError)
9
+
7
10
  class WorkerPool
8
11
  attr_reader :logger, :spawned
9
12
 
10
13
  def initialize(min = 0, max = 1, debug = false, &serve_proc)
11
14
  @min_workers = min
12
15
  @max_workers = max
13
- @logger = DatTCP::Logger.new(debug)
16
+ @debug = debug
17
+ @logger = DatTCP::Logger.new(@debug)
14
18
  @serve_proc = serve_proc
15
19
 
16
20
  @queue = DatTCP::Queue.new
@@ -48,16 +52,23 @@ module DatTCP
48
52
  # down. If a worker is processing a connection, then it will be joined and
49
53
  # allowed to finish.
50
54
  # **NOTE** Any connections that are on the queue are not served.
51
- def shutdown
52
- @workers.each(&:shutdown)
53
- @queue.shutdown
54
-
55
- # use this pattern instead of `each` -- we don't want to call `join` on
56
- # every worker (especially if they are shutting down on their own), we
57
- # just want to make sure that any who haven't had a chance to finish
58
- # get to (this is safe, otherwise you might get a dead thread in the
59
- # `each`).
60
- @workers.first.join until @workers.empty?
55
+ def shutdown(timeout)
56
+ begin
57
+ SystemTimer.timeout(timeout, DatTCP::TimeoutError) do
58
+ @workers.each(&:shutdown)
59
+ @queue.shutdown
60
+
61
+ # use this pattern instead of `each` -- we don't want to call `join` on
62
+ # every worker (especially if they are shutting down on their own), we
63
+ # just want to make sure that any who haven't had a chance to finish
64
+ # get to (this is safe, otherwise you might get a dead thread in the
65
+ # `each`).
66
+ @workers.first.join until @workers.empty?
67
+ end
68
+ rescue DatTCP::TimeoutError => exception
69
+ exception.message.replace "Timed out shutting down the server"
70
+ @debug ? raise(exception) : self.logger.error(exception.message)
71
+ end
61
72
  end
62
73
 
63
74
  # public, because workers need to call it for themselves
metadata CHANGED
@@ -1,13 +1,13 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: dat-tcp
3
3
  version: !ruby/object:Gem::Version
4
- hash: 23
4
+ hash: 19
5
5
  prerelease:
6
6
  segments:
7
7
  - 0
8
- - 2
8
+ - 3
9
9
  - 0
10
- version: 0.2.0
10
+ version: 0.3.0
11
11
  platform: ruby
12
12
  authors:
13
13
  - Collin Redding
@@ -16,11 +16,26 @@ autorequire:
16
16
  bindir: bin
17
17
  cert_chain: []
18
18
 
19
- date: 2013-02-16 00:00:00 Z
19
+ date: 2013-02-19 00:00:00 Z
20
20
  dependencies:
21
21
  - !ruby/object:Gem::Dependency
22
22
  prerelease: false
23
23
  version_requirements: &id001 !ruby/object:Gem::Requirement
24
+ none: false
25
+ requirements:
26
+ - - ~>
27
+ - !ruby/object:Gem::Version
28
+ hash: 11
29
+ segments:
30
+ - 1
31
+ - 2
32
+ version: "1.2"
33
+ requirement: *id001
34
+ name: SystemTimer
35
+ type: :runtime
36
+ - !ruby/object:Gem::Dependency
37
+ prerelease: false
38
+ version_requirements: &id002 !ruby/object:Gem::Requirement
24
39
  none: false
25
40
  requirements:
26
41
  - - ~>
@@ -30,12 +45,12 @@ dependencies:
30
45
  - 1
31
46
  - 0
32
47
  version: "1.0"
33
- requirement: *id001
48
+ requirement: *id002
34
49
  name: assert
35
50
  type: :development
36
51
  - !ruby/object:Gem::Dependency
37
52
  prerelease: false
38
- version_requirements: &id002 !ruby/object:Gem::Requirement
53
+ version_requirements: &id003 !ruby/object:Gem::Requirement
39
54
  none: false
40
55
  requirements:
41
56
  - - ~>
@@ -45,7 +60,7 @@ dependencies:
45
60
  - 1
46
61
  - 0
47
62
  version: "1.0"
48
- requirement: *id002
63
+ requirement: *id003
49
64
  name: assert-mocha
50
65
  type: :development
51
66
  description: A generic threaded TCP server API. It is designed for use as a base for application servers.