hot_tub 0.0.2 → 0.0.3
Sign up to get free protection for your applications and to get access to all the features.
- data/README.md +1 -1
- data/lib/hot_tub/clients/client.rb +6 -2
- data/lib/hot_tub/clients/em_synchrony_client.rb +2 -6
- data/lib/hot_tub/clients/excon_client.rb +3 -6
- data/lib/hot_tub/clients/http_client_client.rb +3 -3
- data/lib/hot_tub/session.rb +14 -20
- data/lib/hot_tub/version.rb +1 -1
- data/spec/session_spec.rb +2 -7
- data/spec/test_helper_methods.rb +1 -2
- metadata +4 -4
data/README.md
CHANGED
@@ -10,7 +10,7 @@ HotTub is available through [Rubygems](https://rubygems.org/gems/hot_tub) and ca
|
|
10
10
|
|
11
11
|
## Setup
|
12
12
|
class MyClass
|
13
|
-
@@pool = HotTub::Session.new(
|
13
|
+
@@pool = HotTub::Session.new(HotTub::ExconClient.new('https://google.com'),{:size => 2, :never_block => true})
|
14
14
|
|
15
15
|
def self.fetch_results(query)
|
16
16
|
@@pool.get(:query => query) # keepalive has be defaulted to true in the client
|
@@ -23,14 +23,18 @@ module HotTub
|
|
23
23
|
|
24
24
|
# Override this method to perform the necessary action for ensure a client
|
25
25
|
# is clean for use.
|
26
|
-
def
|
26
|
+
def clean
|
27
27
|
@client
|
28
28
|
end
|
29
29
|
|
30
|
-
def
|
30
|
+
def close
|
31
31
|
@client
|
32
32
|
end
|
33
33
|
|
34
|
+
def dup
|
35
|
+
self.class.new(@url,@options)
|
36
|
+
end
|
37
|
+
|
34
38
|
class << self
|
35
39
|
def mutex
|
36
40
|
Mutex.new
|
@@ -9,7 +9,7 @@ module HotTub
|
|
9
9
|
@client = EM::HttpRequest.new(url,options)
|
10
10
|
end
|
11
11
|
|
12
|
-
def
|
12
|
+
def clean
|
13
13
|
if @client.conn && @client.conn.error?
|
14
14
|
HotTub.logger.info "Sanitizing connection : #{EventMachine::report_connection_error_status(@client.conn.instance_variable_get(:@signature))}"
|
15
15
|
@client.conn.close_connection
|
@@ -18,7 +18,7 @@ module HotTub
|
|
18
18
|
@client
|
19
19
|
end
|
20
20
|
|
21
|
-
def
|
21
|
+
def close
|
22
22
|
@client.conn.close_connection if @client.conn
|
23
23
|
end
|
24
24
|
|
@@ -31,10 +31,6 @@ module HotTub
|
|
31
31
|
end
|
32
32
|
end
|
33
33
|
|
34
|
-
def dup
|
35
|
-
self.class.new(@url,@options)
|
36
|
-
end
|
37
|
-
|
38
34
|
class << self
|
39
35
|
# Use a fiber safe mutex
|
40
36
|
def mutex
|
@@ -12,16 +12,13 @@ module HotTub
|
|
12
12
|
end
|
13
13
|
|
14
14
|
# pretty sure Excon handles this internally
|
15
|
-
def
|
15
|
+
def clean
|
16
16
|
@client
|
17
17
|
end
|
18
18
|
|
19
|
-
def
|
19
|
+
def close
|
20
20
|
@client.socket.close
|
21
21
|
end
|
22
|
-
|
23
|
-
def dup
|
24
|
-
self.class.new(@url,@options)
|
25
|
-
end
|
22
|
+
|
26
23
|
end
|
27
24
|
end
|
@@ -13,14 +13,14 @@ module HotTub
|
|
13
13
|
end
|
14
14
|
|
15
15
|
# pretty sure HttpClient handles this internally
|
16
|
-
def
|
16
|
+
def clean
|
17
17
|
@client
|
18
18
|
end
|
19
19
|
|
20
|
-
def
|
20
|
+
def close
|
21
21
|
@client.shutdown
|
22
22
|
end
|
23
|
-
|
23
|
+
# HttpClient has different initialization attributes so we need a custom dup
|
24
24
|
def dup
|
25
25
|
self.class.new(@options)
|
26
26
|
end
|
data/lib/hot_tub/session.rb
CHANGED
@@ -3,28 +3,23 @@ module HotTub
|
|
3
3
|
|
4
4
|
# OPTIONS
|
5
5
|
# * :size - number of connections for each pool
|
6
|
-
# * :inactivity_timeout - number of seconds to wait before disconnecting,
|
7
|
-
# setting to 0 means the connection will not be closed
|
6
|
+
# * :inactivity_timeout - number of seconds to wait before disconnecting, setting to 0 means the connection will not be closed
|
8
7
|
# * :pool_timeout - the amount of seconds to block waiting for an availble connection,
|
9
8
|
# because this is blocking it should be an extremely short amount of
|
10
9
|
# time default to 0.5 seconds, if you need more consider enlarging your pool
|
11
10
|
# instead of raising this number
|
12
11
|
# :never_block - if set to true, a connection will always be returned, but
|
13
12
|
# these extra connections are not added to the pool when the request is completed
|
14
|
-
def initialize(options={})
|
13
|
+
def initialize(client,options={})
|
15
14
|
@options = {
|
16
15
|
:size => 5,
|
17
16
|
:never_block => false,
|
18
17
|
:blocking_timeout => 0.5
|
19
18
|
}.merge(options || {})
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
@mutex = (@client.respond_to?(:mutex) ? @client.mutex : Mutex.new)
|
25
|
-
else
|
26
|
-
raise ArgumentError, "The option :client is required for HotTub::Session.new"
|
27
|
-
end
|
19
|
+
@pool = []
|
20
|
+
@pool_data = {:current_size => 0}
|
21
|
+
@client = client
|
22
|
+
@mutex = (@client.respond_to?(:mutex) ? @client.mutex : Mutex.new)
|
28
23
|
end
|
29
24
|
|
30
25
|
def pool
|
@@ -44,7 +39,6 @@ module HotTub
|
|
44
39
|
# block until we get an available connection or Timeout::Error
|
45
40
|
while client.nil?
|
46
41
|
raise_alarm if alarm <= Time.now
|
47
|
-
|
48
42
|
client = pool.shift
|
49
43
|
if client.nil? && (@options[:never_block])
|
50
44
|
HotTub.logger.info "Adding never_block client for #{@client.class.name}, will not be returned to pool."
|
@@ -52,14 +46,14 @@ module HotTub
|
|
52
46
|
client.mark_temporary
|
53
47
|
end
|
54
48
|
end
|
55
|
-
client.
|
49
|
+
client.clean
|
56
50
|
client
|
57
51
|
end
|
58
52
|
|
59
53
|
# return a client to the pool
|
60
54
|
def return_client(client)
|
61
55
|
if client.temporary?
|
62
|
-
client.
|
56
|
+
client.close # Too hot in the hot tub...
|
63
57
|
else
|
64
58
|
@pool << client
|
65
59
|
end
|
@@ -70,11 +64,11 @@ module HotTub
|
|
70
64
|
# is used for mulitple requests. For HTTP requests make sure you request has
|
71
65
|
# keep-alive properly set for your client
|
72
66
|
# EX:
|
73
|
-
# @pool = HotTub.new("https://some_web_site.com")
|
67
|
+
# @pool = HotTub.new(HotTub::ExconClient.new("https://some_web_site.com"))
|
74
68
|
# results = []
|
75
69
|
# @pool.run do |client|
|
76
|
-
# results.push (client.get(:query => {:foo => "bar"}
|
77
|
-
# results.push (client.get(:query => {:bar => "foo"}
|
70
|
+
# results.push (client.get(:query => {:foo => "bar"}))
|
71
|
+
# results.push (client.get(:query => {:bar => "foo"})) # reuse client
|
78
72
|
# end
|
79
73
|
#
|
80
74
|
def run(&block)
|
@@ -92,9 +86,9 @@ module HotTub
|
|
92
86
|
# Let pool instance respond to client methods. For HTTP request make sure you
|
93
87
|
# requests has keep-alive properly set for your client
|
94
88
|
# EX:
|
95
|
-
# @pool = HotTub.new("https://some_web_site.com")
|
96
|
-
# r1 = @pool.get(:query => {:foo => "bar"}
|
97
|
-
# r2 = @pool.get(:query => {:bar => "foo"}
|
89
|
+
# @pool = HotTub.new(HotTub::ExconClient.new("https://some_web_site.com"))
|
90
|
+
# r1 = @pool.get(:query => {:foo => "bar"})
|
91
|
+
# r2 = @pool.get(:query => {:bar => "foo"}) # uses a different client
|
98
92
|
#
|
99
93
|
def method_missing(method, *args, &blk)
|
100
94
|
client = fetch
|
data/lib/hot_tub/version.rb
CHANGED
data/spec/session_spec.rb
CHANGED
@@ -9,15 +9,10 @@ require 'spec_helper'
|
|
9
9
|
end
|
10
10
|
|
11
11
|
describe HotTub::Session do
|
12
|
-
|
13
|
-
describe '#initialize' do
|
14
|
-
it "should raise ArgumentError if :client option is nil" do
|
15
|
-
lambda { HotTub::Session.new}.should raise_error(ArgumentError)
|
16
|
-
end
|
17
|
-
end
|
12
|
+
|
18
13
|
before(:each) do
|
19
14
|
@url = "http://www.testurl123.com/"
|
20
|
-
@tub = HotTub::Session.new(
|
15
|
+
@tub = HotTub::Session.new(MocClient.new(@url))
|
21
16
|
end
|
22
17
|
|
23
18
|
context 'default configuration' do
|
data/spec/test_helper_methods.rb
CHANGED
@@ -11,8 +11,7 @@ module TestHelperMethods
|
|
11
11
|
normal = Time.now - start
|
12
12
|
|
13
13
|
# we want a whole new pool to make sure we don't cheat
|
14
|
-
connection_pool = HotTub::Session.new(
|
15
|
-
:client => client)
|
14
|
+
connection_pool = HotTub::Session.new(client)
|
16
15
|
|
17
16
|
start = Time.now
|
18
17
|
50.times.each do
|
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.
|
4
|
+
version: 0.0.3
|
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-
|
12
|
+
date: 2012-07-02 00:00:00.000000000Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: rspec
|
16
|
-
requirement: &
|
16
|
+
requirement: &70179585887100 !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: *
|
24
|
+
version_requirements: *70179585887100
|
25
25
|
description: A very simple ruby pool gem
|
26
26
|
email:
|
27
27
|
- joshmckin@gmail.com
|