gene_pool 1.0.1 → 1.1.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/.gitignore +1 -0
- data/README.rdoc +7 -0
- data/VERSION +1 -1
- data/gene_pool.gemspec +2 -2
- data/lib/gene_pool.rb +27 -0
- data/test/gene_pool_test.rb +61 -0
- metadata +3 -3
data/.gitignore
CHANGED
data/README.rdoc
CHANGED
|
@@ -30,6 +30,13 @@ Generic pooling library for connection pools.
|
|
|
30
30
|
# use socket here
|
|
31
31
|
end
|
|
32
32
|
end
|
|
33
|
+
|
|
34
|
+
def send_message_auto_retry
|
|
35
|
+
# On exception, close and reopen socket and perform retry
|
|
36
|
+
@@gene_pool.with_connection_auto_retry do |socket|
|
|
37
|
+
# use socket here,
|
|
38
|
+
end
|
|
39
|
+
end
|
|
33
40
|
end
|
|
34
41
|
|
|
35
42
|
== Copyright
|
data/VERSION
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
1.0
|
|
1
|
+
1.1.0
|
data/gene_pool.gemspec
CHANGED
|
@@ -5,11 +5,11 @@
|
|
|
5
5
|
|
|
6
6
|
Gem::Specification.new do |s|
|
|
7
7
|
s.name = %q{gene_pool}
|
|
8
|
-
s.version = "1.0
|
|
8
|
+
s.version = "1.1.0"
|
|
9
9
|
|
|
10
10
|
s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
|
|
11
11
|
s.authors = ["Brad Pardee"]
|
|
12
|
-
s.date = %q{2010-
|
|
12
|
+
s.date = %q{2010-11-11}
|
|
13
13
|
s.description = %q{Generic pooling library for creating a connection pool}
|
|
14
14
|
s.email = %q{bradpardee@gmail.com}
|
|
15
15
|
s.extra_rdoc_files = [
|
data/lib/gene_pool.rb
CHANGED
|
@@ -88,6 +88,33 @@ class GenePool
|
|
|
88
88
|
end
|
|
89
89
|
end
|
|
90
90
|
|
|
91
|
+
# Create a scope for checking out a connection while automatically retrying on exception
|
|
92
|
+
def with_connection_auto_retry(close_on_error = true)
|
|
93
|
+
with_connection do |connection|
|
|
94
|
+
begin
|
|
95
|
+
yield connection
|
|
96
|
+
rescue Exception => e
|
|
97
|
+
if close_on_error
|
|
98
|
+
connection.close rescue nil
|
|
99
|
+
end
|
|
100
|
+
if (e.kind_of?(Timeout::Error))
|
|
101
|
+
remove(connection)
|
|
102
|
+
raise
|
|
103
|
+
end
|
|
104
|
+
connection = renew(connection)
|
|
105
|
+
begin
|
|
106
|
+
yield connection
|
|
107
|
+
rescue Exception => e
|
|
108
|
+
if close_on_error
|
|
109
|
+
connection.close rescue nil
|
|
110
|
+
end
|
|
111
|
+
remove(connection)
|
|
112
|
+
raise
|
|
113
|
+
end
|
|
114
|
+
end
|
|
115
|
+
end
|
|
116
|
+
end
|
|
117
|
+
|
|
91
118
|
# Remove an existing connection from the pool
|
|
92
119
|
def remove(connection)
|
|
93
120
|
@mutex.synchronize do
|
data/test/gene_pool_test.rb
CHANGED
|
@@ -15,6 +15,7 @@ class DummyConnection
|
|
|
15
15
|
def initialize(count, sleep_time=nil)
|
|
16
16
|
sleep sleep_time if sleep_time
|
|
17
17
|
@count = count
|
|
18
|
+
@closed = false
|
|
18
19
|
end
|
|
19
20
|
|
|
20
21
|
def to_i
|
|
@@ -24,6 +25,18 @@ class DummyConnection
|
|
|
24
25
|
def to_s
|
|
25
26
|
@count.to_s
|
|
26
27
|
end
|
|
28
|
+
|
|
29
|
+
def fail_on(*counts)
|
|
30
|
+
raise Exception.new("Dummy exception on count #{@count}") if counts.include?(@count)
|
|
31
|
+
end
|
|
32
|
+
|
|
33
|
+
def close
|
|
34
|
+
@closed = true
|
|
35
|
+
end
|
|
36
|
+
|
|
37
|
+
def closed?
|
|
38
|
+
@closed
|
|
39
|
+
end
|
|
27
40
|
end
|
|
28
41
|
|
|
29
42
|
|
|
@@ -228,5 +241,53 @@ class GenePoolTest < Test::Unit::TestCase
|
|
|
228
241
|
ival_conns.sort!
|
|
229
242
|
assert_equal (1..pool_size).to_a, ival_conns
|
|
230
243
|
end
|
|
244
|
+
|
|
245
|
+
should 'be able to auto-retry connection' do
|
|
246
|
+
i = 1
|
|
247
|
+
[false, true].each do |stat|
|
|
248
|
+
conns = []
|
|
249
|
+
@gene_pool.with_connection_auto_retry(stat) do |conn|
|
|
250
|
+
conns << conn
|
|
251
|
+
conn.fail_on(i)
|
|
252
|
+
assert_equal 1, @gene_pool.connections.size
|
|
253
|
+
assert_equal 1, @gene_pool.checked_out.size
|
|
254
|
+
assert_equal i+1, conn.to_i
|
|
255
|
+
end
|
|
256
|
+
assert_equal stat, conns[0].closed?
|
|
257
|
+
assert !conns[1].closed?
|
|
258
|
+
i += 1
|
|
259
|
+
end
|
|
260
|
+
assert_equal 1, @gene_pool.connections.size
|
|
261
|
+
assert_equal 0, @gene_pool.checked_out.size
|
|
262
|
+
end
|
|
263
|
+
|
|
264
|
+
should 'fail with auto-retry on double failure' do
|
|
265
|
+
e = assert_raises Exception do
|
|
266
|
+
@gene_pool.with_connection_auto_retry(false) do |conn|
|
|
267
|
+
conn.fail_on(1,2)
|
|
268
|
+
end
|
|
269
|
+
end
|
|
270
|
+
assert_match %r%Dummy exception%, e.message
|
|
271
|
+
assert_equal 0, @gene_pool.connections.size
|
|
272
|
+
assert_equal 0, @gene_pool.checked_out.size
|
|
273
|
+
end
|
|
274
|
+
|
|
275
|
+
should 'not auto-retry on timeout' do
|
|
276
|
+
@sleep = 2
|
|
277
|
+
@timeout = 1
|
|
278
|
+
e = assert_raises Timeout::Error do
|
|
279
|
+
@gene_pool.with_connection_auto_retry do |conn|
|
|
280
|
+
end
|
|
281
|
+
end
|
|
282
|
+
assert_equal 0, @gene_pool.connections.size
|
|
283
|
+
assert_equal 0, @gene_pool.checked_out.size
|
|
284
|
+
@sleep = 0
|
|
285
|
+
@gene_pool.with_connection_auto_retry do |conn|
|
|
286
|
+
assert_equal 2, conn.to_i
|
|
287
|
+
assert_equal 1, @gene_pool.checked_out.size
|
|
288
|
+
end
|
|
289
|
+
assert_equal 1, @gene_pool.connections.size
|
|
290
|
+
assert_equal 0, @gene_pool.checked_out.size
|
|
291
|
+
end
|
|
231
292
|
end
|
|
232
293
|
end
|
metadata
CHANGED
|
@@ -4,9 +4,9 @@ version: !ruby/object:Gem::Version
|
|
|
4
4
|
prerelease: false
|
|
5
5
|
segments:
|
|
6
6
|
- 1
|
|
7
|
-
- 0
|
|
8
7
|
- 1
|
|
9
|
-
|
|
8
|
+
- 0
|
|
9
|
+
version: 1.1.0
|
|
10
10
|
platform: ruby
|
|
11
11
|
authors:
|
|
12
12
|
- Brad Pardee
|
|
@@ -14,7 +14,7 @@ autorequire:
|
|
|
14
14
|
bindir: bin
|
|
15
15
|
cert_chain: []
|
|
16
16
|
|
|
17
|
-
date: 2010-
|
|
17
|
+
date: 2010-11-11 00:00:00 -05:00
|
|
18
18
|
default_executable:
|
|
19
19
|
dependencies: []
|
|
20
20
|
|