resource_pool 0.1.3 → 0.2.0

Sign up to get free protection for your applications and to get access to all the features.
data/VERSION CHANGED
@@ -1 +1 @@
1
- 0.1.3
1
+ 0.2.0
data/lib/resource_pool.rb CHANGED
@@ -1,7 +1,6 @@
1
1
  class ResourcePool
2
2
  class ResourcePoolError < RuntimeError; end
3
3
  class ResourceNotAvailable < ResourcePoolError; end
4
- class BadResource < ResourcePoolError; end
5
4
  class InvalidCreateProc < ResourcePoolError; end
6
5
 
7
6
  attr_reader :max_size, :pool, :allocated
@@ -33,8 +32,8 @@ class ResourcePool
33
32
  t = Thread.current
34
33
  if res = owned_resource(t)
35
34
  return yield(res)
36
-
37
35
  end
36
+
38
37
  begin
39
38
  unless res = acquire(t)
40
39
  raise ResourceNotAvailable if @timeout == 0
@@ -48,17 +47,22 @@ class ResourcePool
48
47
  end
49
48
  end
50
49
  yield res
51
- rescue BadResource
52
- old_res = res
53
- res = nil
54
- @delete_proc.call(old_res) if @delete_proc && old_res
55
- @allocated.delete(t)
56
- raise
57
50
  ensure
58
- sync{release(t)} if res
51
+ sync{release(t)} if owned_resource(t)
59
52
  end
60
53
  end
61
54
 
55
+ # please only call this inside hold block
56
+ def trash_current!
57
+ t = Thread.current
58
+ conn = owned_resource(t)
59
+ return unless conn
60
+
61
+ @delete_proc.call conn if @delete_proc
62
+ sync { @allocated.delete(t) }
63
+ nil
64
+ end
65
+
62
66
  private
63
67
 
64
68
  def owned_resource(thread)
@@ -5,7 +5,7 @@
5
5
 
6
6
  Gem::Specification.new do |s|
7
7
  s.name = %q{resource_pool}
8
- s.version = "0.1.3"
8
+ s.version = "0.2.0"
9
9
 
10
10
  s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
11
11
  s.authors = [%q{Aaron Qian}]
@@ -244,9 +244,14 @@ describe "ResourcePool" do
244
244
  end
245
245
 
246
246
  it "should aquire and release resource" do
247
+ @pool.should_receive(:owned_resource).
248
+ with(Thread.current).
249
+ and_return(nil, @res)
250
+
247
251
  @pool.should_receive(:acquire).
248
252
  with(Thread.current).
249
253
  and_return(@res)
254
+
250
255
  @pool.should_receive(:release).
251
256
  with(Thread.current)
252
257
 
@@ -286,19 +291,26 @@ describe "ResourcePool" do
286
291
  end
287
292
 
288
293
  it "should delete bad resource" do
294
+ @pool.should_receive(:owned_resource).
295
+ with(Thread.current).
296
+ and_return(nil, @res, nil)
297
+
289
298
  @pool.should_receive(:acquire).
290
299
  and_return(@res)
291
300
  @pool.should_not_receive(:release)
292
301
  @pool.allocated.should_receive(:delete).
293
302
  with(Thread.current)
294
303
 
295
- lambda {
296
- @pool.hold{ |res| raise ResourcePool::BadResource }
297
- }.should raise_error(ResourcePool::BadResource)
304
+ @pool.hold{ |res| @pool.trash_current! }
298
305
  end
299
306
 
300
307
  it "should call delete_proc if avaiable" do
301
308
  delete_proc_called = false
309
+
310
+ @pool.should_receive(:owned_resource).
311
+ with(Thread.current).
312
+ and_return(nil, @res, nil)
313
+
302
314
  @pool.should_receive(:acquire).
303
315
  and_return(@res)
304
316
  @pool.should_not_receive(:release)
@@ -310,9 +322,7 @@ describe "ResourcePool" do
310
322
  delete_proc_called = true
311
323
  })
312
324
 
313
- lambda {
314
- @pool.hold{ |res| raise ResourcePool::BadResource }
315
- }.should raise_error(ResourcePool::BadResource)
325
+ @pool.hold{ |res| @pool.trash_current! }
316
326
 
317
327
  delete_proc_called.should be_true
318
328
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: resource_pool
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.3
4
+ version: 0.2.0
5
5
  prerelease:
6
6
  platform: ruby
7
7
  authors:
@@ -13,7 +13,7 @@ date: 2012-01-11 00:00:00.000000000Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: rspec
16
- requirement: &16231600 !ruby/object:Gem::Requirement
16
+ requirement: &12906080 !ruby/object:Gem::Requirement
17
17
  none: false
18
18
  requirements:
19
19
  - - ~>
@@ -21,10 +21,10 @@ dependencies:
21
21
  version: 2.3.0
22
22
  type: :development
23
23
  prerelease: false
24
- version_requirements: *16231600
24
+ version_requirements: *12906080
25
25
  - !ruby/object:Gem::Dependency
26
26
  name: bundler
27
- requirement: &16230980 !ruby/object:Gem::Requirement
27
+ requirement: &12897540 !ruby/object:Gem::Requirement
28
28
  none: false
29
29
  requirements:
30
30
  - - ~>
@@ -32,10 +32,10 @@ dependencies:
32
32
  version: 1.0.0
33
33
  type: :development
34
34
  prerelease: false
35
- version_requirements: *16230980
35
+ version_requirements: *12897540
36
36
  - !ruby/object:Gem::Dependency
37
37
  name: jeweler
38
- requirement: &16230420 !ruby/object:Gem::Requirement
38
+ requirement: &12896880 !ruby/object:Gem::Requirement
39
39
  none: false
40
40
  requirements:
41
41
  - - ~>
@@ -43,10 +43,10 @@ dependencies:
43
43
  version: 1.6.4
44
44
  type: :development
45
45
  prerelease: false
46
- version_requirements: *16230420
46
+ version_requirements: *12896880
47
47
  - !ruby/object:Gem::Dependency
48
48
  name: rcov
49
- requirement: &16229640 !ruby/object:Gem::Requirement
49
+ requirement: &12895920 !ruby/object:Gem::Requirement
50
50
  none: false
51
51
  requirements:
52
52
  - - ! '>='
@@ -54,7 +54,7 @@ dependencies:
54
54
  version: '0'
55
55
  type: :development
56
56
  prerelease: false
57
- version_requirements: *16229640
57
+ version_requirements: *12895920
58
58
  description: A gem for generic connection pooling / resource pooling. The code is
59
59
  mostly taken from Sequel gem's ThreadedConnectionPool class, and adapted for more
60
60
  general use.
@@ -91,7 +91,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
91
91
  version: '0'
92
92
  segments:
93
93
  - 0
94
- hash: -3354856420191467092
94
+ hash: -3324076291152974813
95
95
  required_rubygems_version: !ruby/object:Gem::Requirement
96
96
  none: false
97
97
  requirements: