multithink 0.1.3 → 0.1.4

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,15 +1,7 @@
1
1
  ---
2
- !binary "U0hBMQ==":
3
- metadata.gz: !binary |-
4
- MTVkZmE4MTA0MTQxMTUzYzQ1YmQ0ZDFjMWYxZTZkYjU2OWM5Njc5MQ==
5
- data.tar.gz: !binary |-
6
- ZDFjY2U1NzlhMTdiYjZiMjQxYmU1ZDI3YjM4ZGQzMTE2MDMzZGJmMA==
2
+ SHA1:
3
+ metadata.gz: 0c2def018fb68647faadf57e4fcc8cbb4924fcfc
4
+ data.tar.gz: 22e026d85d74eded90bf1f1b6c2539dd4643efed
7
5
  SHA512:
8
- metadata.gz: !binary |-
9
- OTAyNGRiZGVjNDA5YWNiY2U3NTZhN2ExYTg1Mzg0N2EyNWNlNjYxYTIzNmE2
10
- Yzk4ZDIwZTQ4MThhMWFhOTFkZGNhYjIwNjA0ZTJlOWY0MDA3YmQ2MzI0NGNl
11
- NGNjYWM3MmUxOGIyOGJjMjEyYjIwNzRhNTM2NTY3NWY2M2QwMjQ=
12
- data.tar.gz: !binary |-
13
- OWJkNmY0NTA2NDYxNmU4MDMyNGM0MDEwNTRhOGUyZDUyMzg2NTdlMGQ4Nzll
14
- MmNjMjE2NTcyNWFkOTRkMWVjZDk4N2JhOTg4OWUzNmQ4NWQ1MGQ1MTMwZGQ3
15
- NTNlMTRmMjE4MWUyYWFiOTk5ZTBlMzVhMzVjYTM4NDE2ZDk3MTQ=
6
+ metadata.gz: 7821b26d404b269f2865266e0c0bf4f778c88b35e0d0772754c1bb0e4dce2bff5fb9dc9c8cfa51519ecb5b94482887bf44f91e3a8b27ac1f1a0ee4892eb89b4e
7
+ data.tar.gz: d1e89d6bb6e1a9561fae053f0bbed317269311ce0df1c549b4060e91db51945ed09573ee1c446aa47bae7968b5926987a59524d975104f5434fa24ae603362a1
data/lib/multithink.rb CHANGED
@@ -2,16 +2,28 @@ require 'multithink/version'
2
2
  require 'multithink/timed_stack'
3
3
 
4
4
  class MultiThink
5
- DEFAULTS = {size: 5, timeout: 5, servers: [{host: '127.0.0.1', port: 28015}]}
5
+ DEFAULTS = {
6
+ size: 5,
7
+ timeout: 5,
8
+ servers: [
9
+ {
10
+ host: '127.0.0.1',
11
+ port: 28015
12
+ }
13
+ ],
14
+ conn_options: {}
15
+ }
6
16
 
7
17
  def initialize(options = {})
8
18
  options = DEFAULTS.merge(options)
9
19
 
10
20
  @size = options.fetch(:size)
11
21
  @timeout = options.fetch(:timeout)
12
- @servers = options.fetch(:servers)
22
+ servers = options.fetch(:servers)
23
+ conn_options = options.fetch(:conn_options)
24
+ conn_options[:servers] = servers
13
25
 
14
- @available = TimedStack.new(@size, @servers)
26
+ @available = TimedStack.new(@size, conn_options)
15
27
  @key = :"current-#{@available.object_id}"
16
28
  end
17
29
 
@@ -6,12 +6,18 @@ include RethinkDB::Shortcuts
6
6
 
7
7
  class MultiThink::Connection
8
8
 
9
- DEFAULTS = {retries: 10}
9
+ DEFAULTS = {
10
+ retries: 10,
11
+ retry_interval: 1,
12
+ conn_timeout: 1
13
+ }
10
14
 
11
- def initialize(servers, options = {})
12
- @servers = servers
15
+ def initialize(options = {})
13
16
  options = DEFAULTS.merge(options)
17
+ @servers = options.fetch(:servers)
14
18
  @retries = options.fetch(:retries)
19
+ @retry_interval = options.fetch(:retry_interval)
20
+ @conn_timeout = options.fetch(:conn_timeout)
15
21
  connect
16
22
  end
17
23
 
@@ -21,12 +27,12 @@ class MultiThink::Connection
21
27
  @servers.each do |server|
22
28
  begin
23
29
  #TODO(jpg) make timeout configurable
24
- Timeout::timeout(1) do
30
+ Timeout::timeout(@conn_timeout) do
25
31
  @conn = r.connect(server)
26
32
  end
27
33
  return true
28
34
  rescue
29
- sleep 1
35
+ sleep @retry_interval
30
36
  end
31
37
  @tried += 1
32
38
  end
@@ -6,8 +6,11 @@ class MultiThink::PoolShuttingDownError < RuntimeError; end
6
6
 
7
7
  class MultiThink::TimedStack
8
8
 
9
- def initialize(size = 0, servers)
10
- @que = Array.new(size) {|s| MultiThink::Connection.new(servers)}
9
+ def initialize(size = 0, options)
10
+ @size = size
11
+ @options = options
12
+ @que = []
13
+ @checked_out = []
11
14
  @mutex = Mutex.new
12
15
  @resource = ConditionVariable.new
13
16
  @shutdown_block = nil
@@ -19,6 +22,7 @@ class MultiThink::TimedStack
19
22
  @shutdown_block.call(obj)
20
23
  else
21
24
  @que.push obj
25
+ @checked_out.delete obj
22
26
  end
23
27
 
24
28
  @resource.broadcast
@@ -26,12 +30,21 @@ class MultiThink::TimedStack
26
30
  end
27
31
  alias_method :<<, :push
28
32
 
33
+ def available?
34
+ @que.count + @checked_out.count < @size
35
+ end
36
+
29
37
  def pop(timeout=0.5)
30
38
  deadline = Time.now + timeout
31
39
  @mutex.synchronize do
32
40
  loop do
33
- raise MultiThink::PoolShuttingDownError if @shutdown_block
41
+ raise PoolShuttingDownError if @shutdown_block
34
42
  return @que.pop unless @que.empty?
43
+ if available?
44
+ new_conn = MultiThink::Connection.new(@options)
45
+ @checked_out << new_conn
46
+ return new_conn
47
+ end
35
48
  to_wait = deadline - Time.now
36
49
  raise Timeout::Error, "Waited #{timeout} sec" if to_wait <= 0
37
50
  @resource.wait(@mutex, to_wait)
@@ -1,3 +1,3 @@
1
1
  class MultiThink
2
- VERSION = "0.1.3"
2
+ VERSION = "0.1.4"
3
3
  end
data/multithink.gemspec CHANGED
@@ -17,5 +17,6 @@ Gem::Specification.new do |s|
17
17
  s.license = "MIT"
18
18
  s.add_runtime_dependency 'rethinkdb', '>= 1.10.0'
19
19
  s.add_development_dependency 'minitest', '>= 5.0.0'
20
+ s.add_development_dependency 'pry'
20
21
  s.add_development_dependency 'rake'
21
22
  end
metadata CHANGED
@@ -1,55 +1,69 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: multithink
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.3
4
+ version: 0.1.4
5
5
  platform: ruby
6
6
  authors:
7
7
  - Joseph Glanville
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2014-03-22 00:00:00.000000000 Z
11
+ date: 2014-05-12 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: rethinkdb
15
15
  requirement: !ruby/object:Gem::Requirement
16
16
  requirements:
17
- - - ! '>='
17
+ - - '>='
18
18
  - !ruby/object:Gem::Version
19
19
  version: 1.10.0
20
20
  type: :runtime
21
21
  prerelease: false
22
22
  version_requirements: !ruby/object:Gem::Requirement
23
23
  requirements:
24
- - - ! '>='
24
+ - - '>='
25
25
  - !ruby/object:Gem::Version
26
26
  version: 1.10.0
27
27
  - !ruby/object:Gem::Dependency
28
28
  name: minitest
29
29
  requirement: !ruby/object:Gem::Requirement
30
30
  requirements:
31
- - - ! '>='
31
+ - - '>='
32
32
  - !ruby/object:Gem::Version
33
33
  version: 5.0.0
34
34
  type: :development
35
35
  prerelease: false
36
36
  version_requirements: !ruby/object:Gem::Requirement
37
37
  requirements:
38
- - - ! '>='
38
+ - - '>='
39
39
  - !ruby/object:Gem::Version
40
40
  version: 5.0.0
41
+ - !ruby/object:Gem::Dependency
42
+ name: pry
43
+ requirement: !ruby/object:Gem::Requirement
44
+ requirements:
45
+ - - '>='
46
+ - !ruby/object:Gem::Version
47
+ version: '0'
48
+ type: :development
49
+ prerelease: false
50
+ version_requirements: !ruby/object:Gem::Requirement
51
+ requirements:
52
+ - - '>='
53
+ - !ruby/object:Gem::Version
54
+ version: '0'
41
55
  - !ruby/object:Gem::Dependency
42
56
  name: rake
43
57
  requirement: !ruby/object:Gem::Requirement
44
58
  requirements:
45
- - - ! '>='
59
+ - - '>='
46
60
  - !ruby/object:Gem::Version
47
61
  version: '0'
48
62
  type: :development
49
63
  prerelease: false
50
64
  version_requirements: !ruby/object:Gem::Requirement
51
65
  requirements:
52
- - - ! '>='
66
+ - - '>='
53
67
  - !ruby/object:Gem::Version
54
68
  version: '0'
55
69
  description: Simple RethinkDB connection pool.
@@ -79,19 +93,18 @@ require_paths:
79
93
  - lib
80
94
  required_ruby_version: !ruby/object:Gem::Requirement
81
95
  requirements:
82
- - - ! '>='
96
+ - - '>='
83
97
  - !ruby/object:Gem::Version
84
98
  version: '0'
85
99
  required_rubygems_version: !ruby/object:Gem::Requirement
86
100
  requirements:
87
- - - ! '>='
101
+ - - '>='
88
102
  - !ruby/object:Gem::Version
89
103
  version: '0'
90
104
  requirements: []
91
105
  rubyforge_project:
92
- rubygems_version: 2.1.5
106
+ rubygems_version: 2.0.3
93
107
  signing_key:
94
108
  specification_version: 4
95
109
  summary: Simple RethinkDB connection pool.
96
110
  test_files: []
97
- has_rdoc: