connection_pool 1.1.0 → 1.2.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 +7 -0
- data/Changes.md +10 -0
- data/Gemfile +2 -6
- data/README.md +13 -0
- data/connection_pool.gemspec +3 -2
- data/lib/connection_pool.rb +16 -7
- data/lib/connection_pool/timed_stack.rb +1 -4
- data/lib/connection_pool/version.rb +1 -1
- data/test/helper.rb +2 -11
- data/test/test_connection_pool.rb +46 -0
- metadata +25 -13
checksums.yaml
ADDED
@@ -0,0 +1,7 @@
|
|
1
|
+
---
|
2
|
+
SHA1:
|
3
|
+
metadata.gz: eead858733d8dbd69d9ce236f18977ea847b3a83
|
4
|
+
data.tar.gz: a686e2981051d33b6b170d2f7aac5709a78bb0cc
|
5
|
+
SHA512:
|
6
|
+
metadata.gz: 268fe355fb087c14e1820ae8e3f5d903ddf6d2bc9b762091df9e14daa4a20ebf162766f54185c03857ca752f6f15e31a60b4e18c434798950c563a9b17865a73
|
7
|
+
data.tar.gz: 9cc05e0c0b554dd131add7a31b328a85d768141be6e250d34472dc8db7bdd1a46f7fca30cf71fc5edb4b33d1d24403a98bc71a3696dec896918f8af05d8e0653
|
data/Changes.md
CHANGED
data/Gemfile
CHANGED
data/README.md
CHANGED
@@ -42,6 +42,19 @@ If all the objects in the connection pool are in use, `with` will block
|
|
42
42
|
until one becomes available. If no object is available within `:timeout` seconds,
|
43
43
|
`with` will raise a `Timeout::Error`.
|
44
44
|
|
45
|
+
Optionally, you can specify a timeout override using the with-block semantics:
|
46
|
+
|
47
|
+
``` ruby
|
48
|
+
@memcached.with(:timeout => 2.0) do |dalli|
|
49
|
+
dalli.get('some-count')
|
50
|
+
end
|
51
|
+
```
|
52
|
+
|
53
|
+
This will only modify the resource-get timeout for this particular invocation. This
|
54
|
+
is useful if you want to fail-fast on certain non critical sections when a resource
|
55
|
+
is not available, or conversely if you are comfortable blocking longer on a particular
|
56
|
+
resource. This is not implemented in the below `ConnectionPool::Wrapper` class.
|
57
|
+
|
45
58
|
You can use `ConnectionPool::Wrapper` to wrap a single global connection, making
|
46
59
|
it easier to port your connection code over time:
|
47
60
|
|
data/connection_pool.gemspec
CHANGED
@@ -5,8 +5,8 @@ Gem::Specification.new do |s|
|
|
5
5
|
s.name = "connection_pool"
|
6
6
|
s.version = ConnectionPool::VERSION
|
7
7
|
s.platform = Gem::Platform::RUBY
|
8
|
-
s.authors = ["Mike Perham"]
|
9
|
-
s.email = ["mperham@gmail.com"]
|
8
|
+
s.authors = ["Mike Perham", "Damian Janowski"]
|
9
|
+
s.email = ["mperham@gmail.com", "damian@educabilia.com"]
|
10
10
|
s.homepage = "https://github.com/mperham/connection_pool"
|
11
11
|
s.description = s.summary = %q{Generic connection pool for Ruby}
|
12
12
|
|
@@ -16,4 +16,5 @@ Gem::Specification.new do |s|
|
|
16
16
|
s.require_paths = ["lib"]
|
17
17
|
s.license = "MIT"
|
18
18
|
s.add_development_dependency 'minitest', '>= 5.0.0'
|
19
|
+
s.add_development_dependency 'rake'
|
19
20
|
end
|
data/lib/connection_pool.rb
CHANGED
@@ -12,6 +12,12 @@ require 'connection_pool/timed_stack'
|
|
12
12
|
# redis.lpop('my-list') if redis.llen('my-list') > 0
|
13
13
|
# end
|
14
14
|
#
|
15
|
+
# Using optional timeout override (for that single invocation)
|
16
|
+
#
|
17
|
+
# @pool.with(:timeout => 2.0) do |redis|
|
18
|
+
# redis.lpop('my-list') if redis.llen('my-list') > 0
|
19
|
+
# end
|
20
|
+
#
|
15
21
|
# Example usage replacing an existing connection (slower):
|
16
22
|
#
|
17
23
|
# $redis = ConnectionPool.wrap { Redis.new }
|
@@ -43,8 +49,8 @@ class ConnectionPool
|
|
43
49
|
@key = :"current-#{@available.object_id}"
|
44
50
|
end
|
45
51
|
|
46
|
-
def with
|
47
|
-
conn = checkout
|
52
|
+
def with(options = {})
|
53
|
+
conn = checkout(options)
|
48
54
|
begin
|
49
55
|
yield conn
|
50
56
|
ensure
|
@@ -52,11 +58,12 @@ class ConnectionPool
|
|
52
58
|
end
|
53
59
|
end
|
54
60
|
|
55
|
-
def checkout
|
61
|
+
def checkout(options = {})
|
56
62
|
stack = ::Thread.current[@key] ||= []
|
57
63
|
|
58
64
|
if stack.empty?
|
59
|
-
|
65
|
+
timeout = options[:timeout] || @timeout
|
66
|
+
conn = @available.pop(timeout)
|
60
67
|
else
|
61
68
|
conn = stack.last
|
62
69
|
end
|
@@ -79,7 +86,7 @@ class ConnectionPool
|
|
79
86
|
end
|
80
87
|
|
81
88
|
class Wrapper < ::BasicObject
|
82
|
-
METHODS = [:with]
|
89
|
+
METHODS = [:with, :pool_shutdown]
|
83
90
|
|
84
91
|
def initialize(options = {}, &block)
|
85
92
|
@pool = ::ConnectionPool.new(options, &block)
|
@@ -91,6 +98,10 @@ class ConnectionPool
|
|
91
98
|
@pool.checkin
|
92
99
|
end
|
93
100
|
|
101
|
+
def pool_shutdown(&block)
|
102
|
+
@pool.shutdown(&block)
|
103
|
+
end
|
104
|
+
|
94
105
|
def respond_to?(id, *args)
|
95
106
|
METHODS.include?(id) || @pool.with { |c| c.respond_to?(id, *args) }
|
96
107
|
end
|
@@ -102,5 +113,3 @@ class ConnectionPool
|
|
102
113
|
end
|
103
114
|
end
|
104
115
|
end
|
105
|
-
|
106
|
-
require_relative 'connection_pool/timed_stack'
|
@@ -4,6 +4,7 @@ require 'timeout'
|
|
4
4
|
class ConnectionPool::PoolShuttingDownError < RuntimeError; end
|
5
5
|
|
6
6
|
class ConnectionPool::TimedStack
|
7
|
+
|
7
8
|
def initialize(size = 0)
|
8
9
|
@que = Array.new(size) { yield }
|
9
10
|
@mutex = Mutex.new
|
@@ -55,10 +56,6 @@ class ConnectionPool::TimedStack
|
|
55
56
|
@que.empty?
|
56
57
|
end
|
57
58
|
|
58
|
-
def clear
|
59
|
-
@que.clear
|
60
|
-
end
|
61
|
-
|
62
59
|
def length
|
63
60
|
@que.length
|
64
61
|
end
|
data/test/helper.rb
CHANGED
@@ -1,15 +1,6 @@
|
|
1
|
-
require 'rubygems'
|
2
1
|
require 'minitest/pride'
|
3
2
|
require 'minitest/autorun'
|
4
3
|
|
5
|
-
|
4
|
+
$VERBOSE = 1
|
6
5
|
|
7
|
-
|
8
|
-
|
9
|
-
def async_test(time=0.5)
|
10
|
-
q = TimedQueue.new
|
11
|
-
yield Proc.new { q << nil }
|
12
|
-
q.timed_pop(time)
|
13
|
-
end
|
14
|
-
|
15
|
-
end
|
6
|
+
require_relative '../lib/connection_pool'
|
@@ -77,7 +77,39 @@ class TestConnectionPool < Minitest::Test
|
|
77
77
|
refute_nil conn
|
78
78
|
end
|
79
79
|
end
|
80
|
+
|
81
|
+
def test_with_timeout_override
|
82
|
+
pool = ConnectionPool.new(:timeout => 0.05, :size => 1) { NetworkConnection.new }
|
83
|
+
Thread.new do
|
84
|
+
pool.with do |net|
|
85
|
+
net.do_something
|
86
|
+
sleep 0.3
|
87
|
+
end
|
88
|
+
end
|
89
|
+
sleep 0.05
|
90
|
+
assert_raises Timeout::Error do
|
91
|
+
pool.with { |net| net.do_something }
|
92
|
+
end
|
93
|
+
pool.with(:timeout => 0.4) do |conn|
|
94
|
+
refute_nil conn
|
95
|
+
end
|
96
|
+
end
|
80
97
|
|
98
|
+
def test_checkout_timeout_override
|
99
|
+
pool = ConnectionPool.new(:timeout => 0.05, :size => 1) { NetworkConnection.new }
|
100
|
+
Thread.new do
|
101
|
+
pool.with do |net|
|
102
|
+
net.do_something
|
103
|
+
sleep 0.2
|
104
|
+
end
|
105
|
+
end
|
106
|
+
sleep 0.05
|
107
|
+
assert_raises Timeout::Error do
|
108
|
+
pool.checkout
|
109
|
+
end
|
110
|
+
assert pool.checkout :timeout => 0.3
|
111
|
+
end
|
112
|
+
|
81
113
|
def test_passthru
|
82
114
|
pool = ConnectionPool.wrap(:timeout => 0.1, :size => 1) { NetworkConnection.new }
|
83
115
|
assert_equal 1, pool.do_something
|
@@ -199,4 +231,18 @@ class TestConnectionPool < Minitest::Test
|
|
199
231
|
pool.shutdown
|
200
232
|
end
|
201
233
|
end
|
234
|
+
|
235
|
+
def test_shutdown_is_executed_for_all_connections_in_wrapped_pool
|
236
|
+
recorders = []
|
237
|
+
|
238
|
+
wrapper = ConnectionPool::Wrapper.new(:size => 3) do
|
239
|
+
Recorder.new.tap { |r| recorders << r }
|
240
|
+
end
|
241
|
+
|
242
|
+
wrapper.pool_shutdown do |recorder|
|
243
|
+
recorder.do_work("shutdown")
|
244
|
+
end
|
245
|
+
|
246
|
+
assert_equal [["shutdown"]] * 3, recorders.map { |r| r.calls }
|
247
|
+
end
|
202
248
|
end
|
metadata
CHANGED
@@ -1,35 +1,48 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: connection_pool
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.
|
5
|
-
prerelease:
|
4
|
+
version: 1.2.0
|
6
5
|
platform: ruby
|
7
6
|
authors:
|
8
7
|
- Mike Perham
|
8
|
+
- Damian Janowski
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date: 2013-
|
12
|
+
date: 2013-11-26 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: minitest
|
16
16
|
requirement: !ruby/object:Gem::Requirement
|
17
|
-
none: false
|
18
17
|
requirements:
|
19
|
-
- -
|
18
|
+
- - '>='
|
20
19
|
- !ruby/object:Gem::Version
|
21
20
|
version: 5.0.0
|
22
21
|
type: :development
|
23
22
|
prerelease: false
|
24
23
|
version_requirements: !ruby/object:Gem::Requirement
|
25
|
-
none: false
|
26
24
|
requirements:
|
27
|
-
- -
|
25
|
+
- - '>='
|
28
26
|
- !ruby/object:Gem::Version
|
29
27
|
version: 5.0.0
|
28
|
+
- !ruby/object:Gem::Dependency
|
29
|
+
name: rake
|
30
|
+
requirement: !ruby/object:Gem::Requirement
|
31
|
+
requirements:
|
32
|
+
- - '>='
|
33
|
+
- !ruby/object:Gem::Version
|
34
|
+
version: '0'
|
35
|
+
type: :development
|
36
|
+
prerelease: false
|
37
|
+
version_requirements: !ruby/object:Gem::Requirement
|
38
|
+
requirements:
|
39
|
+
- - '>='
|
40
|
+
- !ruby/object:Gem::Version
|
41
|
+
version: '0'
|
30
42
|
description: Generic connection pool for Ruby
|
31
43
|
email:
|
32
44
|
- mperham@gmail.com
|
45
|
+
- damian@educabilia.com
|
33
46
|
executables: []
|
34
47
|
extensions: []
|
35
48
|
extra_rdoc_files: []
|
@@ -49,27 +62,26 @@ files:
|
|
49
62
|
homepage: https://github.com/mperham/connection_pool
|
50
63
|
licenses:
|
51
64
|
- MIT
|
65
|
+
metadata: {}
|
52
66
|
post_install_message:
|
53
67
|
rdoc_options: []
|
54
68
|
require_paths:
|
55
69
|
- lib
|
56
70
|
required_ruby_version: !ruby/object:Gem::Requirement
|
57
|
-
none: false
|
58
71
|
requirements:
|
59
|
-
- -
|
72
|
+
- - '>='
|
60
73
|
- !ruby/object:Gem::Version
|
61
74
|
version: '0'
|
62
75
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
63
|
-
none: false
|
64
76
|
requirements:
|
65
|
-
- -
|
77
|
+
- - '>='
|
66
78
|
- !ruby/object:Gem::Version
|
67
79
|
version: '0'
|
68
80
|
requirements: []
|
69
81
|
rubyforge_project:
|
70
|
-
rubygems_version: 1.
|
82
|
+
rubygems_version: 2.1.9
|
71
83
|
signing_key:
|
72
|
-
specification_version:
|
84
|
+
specification_version: 4
|
73
85
|
summary: Generic connection pool for Ruby
|
74
86
|
test_files:
|
75
87
|
- test/helper.rb
|