multithink 0.1.3 → 0.1.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.
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: