hot_tub 0.0.3 → 0.0.4

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.
@@ -13,14 +13,6 @@ module HotTub
13
13
  @client.send(method,*args,&blk)
14
14
  end
15
15
 
16
- def temporary?
17
- @temporary == true
18
- end
19
-
20
- def mark_temporary
21
- @temporary = true
22
- end
23
-
24
16
  # Override this method to perform the necessary action for ensure a client
25
17
  # is clean for use.
26
18
  def clean
@@ -2,14 +2,14 @@ module HotTub
2
2
  class Session
3
3
 
4
4
  # OPTIONS
5
- # * :size - number of connections for each pool
5
+ # * :size - number of clients/connections for each pool
6
6
  # * :inactivity_timeout - number of seconds to wait before disconnecting, setting to 0 means the connection will not be closed
7
- # * :pool_timeout - the amount of seconds to block waiting for an availble connection,
7
+ # * :pool_timeout - the amount of seconds to block waiting for an available client,
8
8
  # because this is blocking it should be an extremely short amount of
9
9
  # time default to 0.5 seconds, if you need more consider enlarging your pool
10
10
  # instead of raising this number
11
- # :never_block - if set to true, a connection will always be returned, but
12
- # these extra connections are not added to the pool when the request is completed
11
+ # :never_block - if set to true, a client will always be returned,
12
+ # but the pool size will never grow past that :size option, extra clients are closed
13
13
  def initialize(client,options={})
14
14
  @options = {
15
15
  :size => 5,
@@ -21,47 +21,22 @@ module HotTub
21
21
  @client = client
22
22
  @mutex = (@client.respond_to?(:mutex) ? @client.mutex : Mutex.new)
23
23
  end
24
-
25
- def pool
24
+
25
+ # The synchronized pool for all our clients.
26
+ #
27
+ def pool(client=nil)
26
28
  @mutex.synchronize do
27
- add_client if add_client?
29
+ if client
30
+ return_client(client)
31
+ else
32
+ add_client if add_client?
33
+ end
28
34
  @pool
29
35
  end
30
36
  end
31
-
32
- # Fetches an avaible client from the pool.
33
- # Hot tubs are not always clean... Make sure we have a good connection. The client
34
- # should respond to sanitize_hot_tub_connection, which checks to make sure
35
- # the connection is still viable, and resets if not
36
- def fetch
37
- client = nil
38
- alarm = (Time.now + @options[:blocking_timeout])
39
- # block until we get an available connection or Timeout::Error
40
- while client.nil?
41
- raise_alarm if alarm <= Time.now
42
- client = pool.shift
43
- if client.nil? && (@options[:never_block])
44
- HotTub.logger.info "Adding never_block client for #{@client.class.name}, will not be returned to pool."
45
- client = new_client
46
- client.mark_temporary
47
- end
48
- end
49
- client.clean
50
- client
51
- end
52
-
53
- # return a client to the pool
54
- def return_client(client)
55
- if client.temporary?
56
- client.close # Too hot in the hot tub...
57
- else
58
- @pool << client
59
- end
60
- @pool
61
- end
62
37
 
63
- # Run the block on the retrieved connection. Good for ensure the same client
64
- # is used for mulitple requests. For HTTP requests make sure you request has
38
+ # Run the block on the retrieved client. Good for ensure the same client
39
+ # is used for multiple requests. For HTTP requests make sure you request has
65
40
  # keep-alive properly set for your client
66
41
  # EX:
67
42
  # @pool = HotTub.new(HotTub::ExconClient.new("https://some_web_site.com"))
@@ -79,7 +54,7 @@ module HotTub
79
54
  raise ArgumentError, 'Run requires a block.'
80
55
  end
81
56
  ensure
82
- return_client(client) if client
57
+ pool(client) if client
83
58
  end
84
59
 
85
60
 
@@ -94,7 +69,7 @@ module HotTub
94
69
  client = fetch
95
70
  client.send(method,*args,&blk)
96
71
  ensure
97
- return_client(client) if client
72
+ pool(client) if client
98
73
  end
99
74
 
100
75
  private
@@ -102,6 +77,10 @@ module HotTub
102
77
  def add_client?
103
78
  (@pool.empty? && (@pool_data[:current_size] < @options[:size]))
104
79
  end
80
+
81
+ def new_client
82
+ @client.dup
83
+ end
105
84
 
106
85
  def add_client
107
86
  HotTub.logger.info "Adding HotTub client: #{@client.class.name} to pool"
@@ -109,11 +88,38 @@ module HotTub
109
88
  @pool << new_client
110
89
  @pool
111
90
  end
112
-
113
- def new_client
114
- @client.dup
115
- end
116
-
91
+
92
+ # return a client to the pool
93
+ def return_client(client)
94
+ if @pool.length < @options[:size]
95
+ @pool << client
96
+ else
97
+ HotTub.logger.info "Closed extra client for #{@client.class.name}."
98
+ client.close # Too hot in the hot tub...
99
+ end
100
+ end
101
+
102
+ # Fetches an available client from the pool.
103
+ # Hot tubs are not always clean... Make sure we have a good client. The client
104
+ # should respond to clean, which checks to make sure the client is still
105
+ # viable, and reset if necessary.
106
+ def fetch
107
+ client = nil
108
+ alarm = (Time.now + @options[:blocking_timeout])
109
+ # block until we get an available client or raise Timeout::Error
110
+ while client.nil?
111
+ raise_alarm if alarm <= Time.now
112
+ client = pool.shift
113
+ if client.nil? && (@options[:never_block])
114
+ HotTub.logger.info "Adding never_block client for #{@client.class.name}."
115
+ client = new_client
116
+ client.mark_temporary
117
+ end
118
+ end
119
+ client.clean
120
+ client
121
+ end
122
+
117
123
  def raise_alarm
118
124
  message = "Could not fetch a free client in time. Consider increasing your pool size for #{@client.class.name}."
119
125
  HotTub.logger.error message
@@ -1,3 +1,3 @@
1
1
  module HotTub
2
- VERSION = "0.0.3"
2
+ VERSION = "0.0.4"
3
3
  end
data/spec/session_spec.rb CHANGED
@@ -48,20 +48,20 @@ describe HotTub::Session do
48
48
  end
49
49
  end
50
50
 
51
- describe '#fetch_connection' do
51
+ describe '#fetch' do
52
52
  it "should raise Timeout::Error if an available is not found in time"do
53
53
  @tub.stub(:pool).and_return([])
54
- lambda { @tub.fetch}.should raise_error(Timeout::Error)
54
+ lambda { @tub.send(:fetch)}.should raise_error(Timeout::Error)
55
55
  end
56
56
 
57
57
  it "should not raise Timeout::Error if an available is not found in time"do
58
58
  @tub.instance_variable_get(:@options)[:never_block] = true
59
59
  @tub.stub(:pool).and_return([])
60
- lambda { @tub.fetch}.should_not raise_error(Timeout::Error)
60
+ lambda { @tub.send(:fetch)}.should_not raise_error(Timeout::Error)
61
61
  end
62
62
 
63
63
  it "should return an instance of the driver" do
64
- @tub.fetch.should be_instance_of(MocClient)
64
+ @tub.send(:fetch).should be_instance_of(MocClient)
65
65
  end
66
66
  end
67
67
 
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: hot_tub
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.3
4
+ version: 0.0.4
5
5
  prerelease:
6
6
  platform: ruby
7
7
  authors:
@@ -9,11 +9,11 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2012-07-02 00:00:00.000000000Z
12
+ date: 2012-07-09 00:00:00.000000000Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: rspec
16
- requirement: &70179585887100 !ruby/object:Gem::Requirement
16
+ requirement: &70279127174460 !ruby/object:Gem::Requirement
17
17
  none: false
18
18
  requirements:
19
19
  - - ! '>='
@@ -21,7 +21,7 @@ dependencies:
21
21
  version: '0'
22
22
  type: :development
23
23
  prerelease: false
24
- version_requirements: *70179585887100
24
+ version_requirements: *70279127174460
25
25
  description: A very simple ruby pool gem
26
26
  email:
27
27
  - joshmckin@gmail.com