gene_pool 1.3.2 → 1.4.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.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 4185e45cfcd0aaf6dd261f72d1d794df72952a59
4
- data.tar.gz: a755af2d8bd162c60ed34219739206af138e69e5
3
+ metadata.gz: bc1bdaf7ba625db87160e8afdf2ed0dc1769c036
4
+ data.tar.gz: af8f23899faaea5e5c681807ffaab6ea29651a3b
5
5
  SHA512:
6
- metadata.gz: b9107ae8d748c69c188ac978bf1cdba31e57af797555e76d1ddcf70a0bdf5d4f641dffcb9364f23f1b4be449b3db09575260a0b1b47737c930d584edf5176a67
7
- data.tar.gz: 2ca1941b0689ccd6bba3be10f1410e30e23e26cdcb58c53d65182674604069572426fef646c5b55b4765e6067564073d111d265fbb9fd0fd9e013806696fa3df
6
+ metadata.gz: 4a861f3844f435b77944cb4699335066278facec8c71bfa581c16bd480ffcd9d34192bbbce6fe6095de474779a66bc59838a5f2a10d62aae54cd1b53418f8220
7
+ data.tar.gz: 012a79fb29dc53ebf5ae09a94913e45df5ee1fd810c797671f9a090bb7cd50928b38c06e620d3eb56c61cf4b2481f9d18576ebe88e7f5d683c593ffb3e0c8fca
data/Gemfile CHANGED
@@ -11,5 +11,6 @@ group :development do
11
11
  end
12
12
 
13
13
  group :test do
14
+ gem 'minitest', "~> 4.0"
14
15
  gem 'shoulda'
15
16
  end
data/History.md CHANGED
@@ -1,6 +1,12 @@
1
1
  GenePool Changelog
2
2
  =====================
3
3
 
4
+ 1.4.0 / 2014-04-18
5
+
6
+ - Use Monitor instead of Mutex for locking to prevent recursive lock issues.
7
+ - Fix tests where Timeout.timeout without passing exception in raises unrescueable Timeout::Error in ruby 2.1 so cleanup does not occur.
8
+ - Allow option timeout_class which will get raised instead of Timeout::Error
9
+
4
10
  1.3.2 / 2014-01-06
5
11
 
6
12
  - Fix bug where connections that failed renew and were nil were attempting to be released. (Which would generally swallow the originating exception).
@@ -1,32 +1,35 @@
1
1
  require 'logger'
2
2
  require 'thread'
3
+ require 'monitor'
3
4
 
4
5
  # Generic connection pool class
5
6
  class GenePool
6
7
 
7
- attr_accessor :name, :pool_size, :warn_timeout, :logger
8
+ attr_accessor :name, :pool_size, :warn_timeout, :logger, :timeout_class
8
9
 
9
10
  # Creates a gene_pool. The passed block will be used to initialize a single instance of
10
11
  # the item being pooled (i.e., socket connection or whatever)
11
12
  # options -
12
- # name - The name used in logging messages.
13
- # pool_size - The maximum number of instances that will be created (Defaults to 1).
14
- # timeout - Will raise a Timeout exception if waiting on a connection for this many seconds.
15
- # warn_timeout - Displays an error message if a checkout takes longer that the given time (used to give hints to increase the pool size).
16
- # idle_timeout - If set, the connection will be renewed if it hasn't been used in this amount of time (seconds).
17
- # logger - The logger used for log messages, defaults to STDERR.
18
- # close_proc - The process or method used to close a pooled instance when it is removed.
13
+ # name - The name used in logging messages.
14
+ # pool_size - The maximum number of instances that will be created (Defaults to 1).
15
+ # timeout - Will raise a Timeout exception if waiting on a connection for this many seconds.
16
+ # timeout_class - Exception class to raise if timeout error, defaults to Timeout::Error
17
+ # warn_timeout - Displays an error message if a checkout takes longer that the given time (used to give hints to increase the pool size).
18
+ # idle_timeout - If set, the connection will be renewed if it hasn't been used in this amount of time (seconds).
19
+ # logger - The logger used for log messages, defaults to STDERR.
20
+ # close_proc - The process or method used to close a pooled instance when it is removed.
19
21
  # Defaults to :close. Set to nil for no-op or a symbol for a method or a proc that takes an argument for the instance.
20
22
  def initialize(options={}, &connect_block)
21
23
  @connect_block = connect_block
22
24
 
23
- @name = options[:name] || 'GenePool'
24
- @pool_size = options[:pool_size] || 1
25
- @timeout = options[:timeout]
26
- @warn_timeout = options[:warn_timeout] || 5.0
27
- @idle_timeout = options[:idle_timeout]
28
- @logger = options[:logger]
29
- @close_proc = options[:close_proc] || (!options.has_key?(:close_proc) && :close)
25
+ @name = options[:name] || 'GenePool'
26
+ @pool_size = options[:pool_size] || 1
27
+ @timeout = options[:timeout]
28
+ @timeout_class = options[:timeout_class] || Timeout::Error
29
+ @warn_timeout = options[:warn_timeout] || 5.0
30
+ @idle_timeout = options[:idle_timeout]
31
+ @logger = options[:logger]
32
+ @close_proc = options[:close_proc] || (!options.has_key?(:close_proc) && :close)
30
33
 
31
34
  unless @logger
32
35
  @logger = Logger.new(STDERR)
@@ -160,7 +163,7 @@ class GenePool
160
163
  begin
161
164
  yield connection
162
165
  rescue Exception => e
163
- if e.kind_of?(Timeout::Error) || e.message =~ /expired/
166
+ if e.kind_of?(Timeout::Error) || e.kind_of?(@timeout_class) || e.message =~ /expired/
164
167
  remove(connection)
165
168
  raise
166
169
  end
@@ -286,40 +289,20 @@ class GenePool
286
289
  close_connection(connection)
287
290
  end
288
291
 
289
- if RUBY_VERSION < '1.9'
290
- require 'monitor'
291
- def setup_mutex
292
- @connections.extend(MonitorMixin)
293
- # Mutex for synchronizing pool access
294
- @mutex = @connections
295
- # Condition variable for waiting for an available connection
296
- @condition = @mutex.new_cond
297
- end
298
-
299
- def wait_mutex(start_time)
300
- return @condition.wait unless @timeout
301
- delta = @timeout - (Time.now - start_time)
302
- raise Timeout::Error if delta <= 0.0
303
- @condition.wait(delta)
304
- delta = @timeout - (Time.now - start_time)
305
- raise Timeout::Error if delta <= 0.0
306
- end
307
-
308
- else # RUBY_VERSION >= '1.9'
309
- def setup_mutex
310
- # Mutex for synchronizing pool access
311
- @mutex = Mutex.new
312
- # Condition variable for waiting for an available connection
313
- @condition = ConditionVariable.new
314
- end
292
+ def setup_mutex
293
+ @connections.extend(MonitorMixin)
294
+ # Mutex for synchronizing pool access
295
+ @mutex = @connections
296
+ # Condition variable for waiting for an available connection
297
+ @condition = @mutex.new_cond
298
+ end
315
299
 
316
- def wait_mutex(start_time)
317
- return @condition.wait(@mutex) unless @timeout
318
- delta = @timeout - (Time.now - start_time)
319
- raise Timeout::Error if delta <= 0.0
320
- @condition.wait(@mutex, delta)
321
- delta = @timeout - (Time.now - start_time)
322
- raise Timeout::Error if delta <= 0.0
323
- end
300
+ def wait_mutex(start_time)
301
+ return @condition.wait unless @timeout
302
+ delta = @timeout - (Time.now - start_time)
303
+ raise @timeout_class if delta <= 0.0
304
+ @condition.wait(delta)
305
+ delta = @timeout - (Time.now - start_time)
306
+ raise @timeout_class if delta <= 0.0
324
307
  end
325
308
  end
@@ -11,6 +11,8 @@ class GenePool
11
11
  attr_reader :connections, :checked_out, :with_map
12
12
  end
13
13
 
14
+ class MyTimeoutError < RuntimeError; end
15
+
14
16
  class DummyConnection
15
17
  attr_reader :count
16
18
  def initialize(count, sleep_time=nil)
@@ -173,8 +175,8 @@ class GenePoolTest < Test::Unit::TestCase
173
175
  should 'handle aborted connection' do
174
176
  @gene_pool.with_connection do |conn1|
175
177
  @sleep = 2
176
- assert_raises Timeout::Error do
177
- Timeout.timeout(1) do
178
+ assert_raises RuntimeError do
179
+ Timeout.timeout(1, RuntimeError) do
178
180
  @gene_pool.with_connection { |conn2| }
179
181
  end
180
182
  end
@@ -204,8 +206,8 @@ class GenePoolTest < Test::Unit::TestCase
204
206
  assert_equal i, @gene_pool.checked_out.size
205
207
  assert_equal conns, @gene_pool.connections
206
208
  end
207
- assert_raises Timeout::Error do
208
- Timeout.timeout(1) do
209
+ assert_raises RuntimeError do
210
+ Timeout.timeout(1, RuntimeError) do
209
211
  @gene_pool.checkout
210
212
  end
211
213
  end
@@ -282,8 +284,8 @@ class GenePoolTest < Test::Unit::TestCase
282
284
  end
283
285
 
284
286
  should 'not auto-retry on timeout' do
285
- assert_raises Timeout::Error do
286
- Timeout.timeout(1) do
287
+ assert_raises RuntimeError do
288
+ Timeout.timeout(1, RuntimeError) do
287
289
  @gene_pool.with_connection_auto_retry do |conn|
288
290
  sleep 2
289
291
  assert false, true
@@ -405,39 +407,46 @@ class GenePoolTest < Test::Unit::TestCase
405
407
 
406
408
  context 'timeout' do
407
409
  setup do
408
- @gene_pool = GenePool.new(:name => 'TestGenePool',
409
- :pool_size => 2,
410
- :close_proc => nil,
411
- :timeout => 1.0) do
412
- Object.new
410
+ @timeout_classes = [nil, MyTimeoutError]
411
+ @gene_pools = @timeout_classes.map do |timeout_class|
412
+ GenePool.new(:name => 'TestGenePool',
413
+ :pool_size => 2,
414
+ :close_proc => nil,
415
+ :timeout => 1.0,
416
+ :timeout_class => timeout_class) do
417
+ Object.new
418
+ end
413
419
  end
414
420
  end
415
421
 
416
422
  should 'timeout when the timeout period has expired' do
417
- pool_size = @gene_pool.pool_size
418
- # Do it with new connections and old connections
419
- (1..2).each do |n|
420
- (1..pool_size).each do |i|
421
- Thread.new do
422
- @gene_pool.with_connection do |c|
423
- sleep(2)
423
+ @gene_pools.each_with_index do |gene_pool, class_index|
424
+ pool_size = gene_pool.pool_size
425
+ # Do it with new connections and old connections
426
+ (1..2).each do |n|
427
+ (1..pool_size).each do |i|
428
+ Thread.new do
429
+ gene_pool.with_connection do |c|
430
+ sleep(2)
431
+ end
424
432
  end
425
433
  end
434
+ # Let the threads get the connections
435
+ sleep(0.1)
436
+ start_time = Time.now
437
+ timeout_class = @timeout_classes[class_index] || Timeout::Error
438
+ assert_raises timeout_class do
439
+ gene_pool.with_connection { |c| }
440
+ puts "No timeout after #{Time.now - start_time} seconds"
441
+ end
442
+ puts "#{Time.now-start_time} should be around 1.0"
443
+ assert_equal pool_size, gene_pool.connections.size
444
+ assert_equal pool_size, gene_pool.checked_out.size
445
+ # Let the threads complete so we can do it again
446
+ sleep 2
447
+ assert_equal pool_size, gene_pool.connections.size
448
+ assert_equal 0, gene_pool.checked_out.size
426
449
  end
427
- # Let the threads get the connections
428
- sleep(0.1)
429
- start_time = Time.now
430
- assert_raises Timeout::Error do
431
- @gene_pool.with_connection { |c| }
432
- puts "No timeout after #{Time.now - start_time} seconds"
433
- end
434
- puts "#{Time.now-start_time} should be around 1.0"
435
- assert_equal pool_size, @gene_pool.connections.size
436
- assert_equal pool_size, @gene_pool.checked_out.size
437
- # Let the threads complete so we can do it again
438
- sleep 2
439
- assert_equal pool_size, @gene_pool.connections.size
440
- assert_equal 0, @gene_pool.checked_out.size
441
450
  end
442
451
  end
443
452
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: gene_pool
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.3.2
4
+ version: 1.4.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Brad Pardee
8
- autorequire:
8
+ autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2014-01-06 00:00:00.000000000 Z
11
+ date: 2014-04-18 00:00:00.000000000 Z
12
12
  dependencies: []
13
13
  description: Generic pooling library for creating a connection pool
14
14
  email:
@@ -27,7 +27,7 @@ files:
27
27
  homepage: http://github.com/bpardee/gene_pool
28
28
  licenses: []
29
29
  metadata: {}
30
- post_install_message:
30
+ post_install_message:
31
31
  rdoc_options: []
32
32
  require_paths:
33
33
  - lib
@@ -42,9 +42,9 @@ required_rubygems_version: !ruby/object:Gem::Requirement
42
42
  - !ruby/object:Gem::Version
43
43
  version: '0'
44
44
  requirements: []
45
- rubyforge_project:
46
- rubygems_version: 2.0.3
47
- signing_key:
45
+ rubyforge_project:
46
+ rubygems_version: 2.1.9
47
+ signing_key:
48
48
  specification_version: 4
49
49
  summary: Generic pooling library for creating a connection pool
50
50
  test_files: