connection_pool 0.0.3 → 0.1.0

Sign up to get free protection for your applications and to get access to all the features.
data/Changes.md ADDED
@@ -0,0 +1,5 @@
1
+ 0.1.0
2
+ --------
3
+
4
+ - More precise timeouts and better error message
5
+ - ConnectionPool now subclasses BasicObject so `method_missing` is more effective.
data/README.md CHANGED
@@ -5,6 +5,12 @@ Generic connection pooling for Ruby.
5
5
 
6
6
  MongoDB has its own connection pool. ActiveRecord has its own connection pool. This is a generic connection pool that can be used with anything, e.g. Redis, Dalli and other Ruby network clients.
7
7
 
8
+ Requirements
9
+ --------------
10
+
11
+ connection_pool requires Ruby 1.9 because it uses BasicObject.
12
+
13
+
8
14
  Install
9
15
  ------------
10
16
 
@@ -27,4 +33,4 @@ Then use the pool in your application:
27
33
  Author
28
34
  --------------
29
35
 
30
- Mike Perham, [@mperham](https://twitter.com/mperham), <http://mikeperham.com>
36
+ Mike Perham, [@mperham](https://twitter.com/mperham), <http://mikeperham.com>
@@ -1,4 +1,4 @@
1
- require 'connection_pool/timed_queue'
1
+ require 'timed_queue'
2
2
 
3
3
  # Generic connection pool class for e.g. sharing a limited number of network connections
4
4
  # among many threads. Note: Connections are eager created.
@@ -23,18 +23,18 @@ require 'connection_pool/timed_queue'
23
23
  # - :size - number of connections to pool, defaults to 5
24
24
  # - :timeout - amount of time to wait for a connection if none currently available, defaults to 5 seconds
25
25
  #
26
- class ConnectionPool
26
+ class ConnectionPool < BasicObject
27
27
  DEFAULTS = { :size => 5, :timeout => 5 }
28
28
 
29
- def initialize(options={})
30
- raise ArgumentError, 'Connection pool requires a block' unless block_given?
29
+ def initialize(options={}, &block)
30
+ ::Kernel.raise ::ArgumentError, 'Connection pool requires a block' unless block
31
31
 
32
- @available = TimedQueue.new
32
+ @available = ::TimedQueue.new
33
+ @oid = @available.object_id
33
34
  @options = DEFAULTS.merge(options)
34
35
  @options[:size].times do
35
- @available << yield
36
+ @available << block.call
36
37
  end
37
- @busy = []
38
38
  end
39
39
 
40
40
  def with(&block)
@@ -53,18 +53,15 @@ class ConnectionPool
53
53
  private
54
54
 
55
55
  def checkout
56
- Thread.current[:"current-#{self.object_id}"] ||= begin
57
- conn = @available.timed_pop(@options[:timeout])
58
- @busy << conn
59
- conn
56
+ ::Thread.current[:"current-#{@oid}"] ||= begin
57
+ @available.timed_pop(@options[:timeout])
60
58
  end
61
59
  end
62
60
 
63
61
  def checkin
64
- conn = Thread.current[:"current-#{self.object_id}"]
65
- Thread.current[:"current-#{self.object_id}"] = nil
62
+ conn = ::Thread.current[:"current-#{@oid}"]
63
+ ::Thread.current[:"current-#{@oid}"] = nil
66
64
  return unless conn
67
- @busy.delete(conn)
68
65
  @available << conn
69
66
  nil
70
67
  end
@@ -1,3 +1,3 @@
1
- module ConnectionPool
2
- VERSION = "0.0.3"
1
+ class ConnectionPool
2
+ VERSION = "0.1.0"
3
3
  end
@@ -21,8 +21,9 @@ class TimedQueue
21
21
  @mutex.synchronize do
22
22
  loop do
23
23
  return @que.shift unless @que.empty?
24
- raise Timeout::Error if Time.now > deadline
25
- @resource.wait(@mutex, timeout)
24
+ to_wait = deadline - Time.now
25
+ raise Timeout::Error, "Waited #{timeout} sec" if to_wait <= 0
26
+ @resource.wait(@mutex, to_wait)
26
27
  end
27
28
  end
28
29
  end
metadata CHANGED
@@ -2,7 +2,7 @@
2
2
  name: connection_pool
3
3
  version: !ruby/object:Gem::Version
4
4
  prerelease:
5
- version: 0.0.3
5
+ version: 0.1.0
6
6
  platform: ruby
7
7
  authors:
8
8
  - Mike Perham
@@ -10,8 +10,7 @@ autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
12
 
13
- date: 2011-09-12 00:00:00 -07:00
14
- default_executable:
13
+ date: 2011-09-19 00:00:00 Z
15
14
  dependencies: []
16
15
 
17
16
  description: Generic connection pool for Ruby
@@ -25,17 +24,17 @@ extra_rdoc_files: []
25
24
 
26
25
  files:
27
26
  - .gitignore
27
+ - Changes.md
28
28
  - Gemfile
29
29
  - LICENSE
30
30
  - README.md
31
31
  - Rakefile
32
32
  - connection_pool.gemspec
33
33
  - lib/connection_pool.rb
34
- - lib/connection_pool/timed_queue.rb
35
34
  - lib/connection_pool/version.rb
35
+ - lib/timed_queue.rb
36
36
  - test/helper.rb
37
37
  - test/test_connection_pool.rb
38
- has_rdoc: true
39
38
  homepage: ""
40
39
  licenses: []
41
40
 
@@ -59,7 +58,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
59
58
  requirements: []
60
59
 
61
60
  rubyforge_project:
62
- rubygems_version: 1.5.2
61
+ rubygems_version: 1.8.10
63
62
  signing_key:
64
63
  specification_version: 3
65
64
  summary: Generic connection pool for Ruby