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 +5 -13
- data/lib/multithink.rb +15 -3
- data/lib/multithink/connection.rb +11 -5
- data/lib/multithink/timed_stack.rb +16 -3
- data/lib/multithink/version.rb +1 -1
- data/multithink.gemspec +1 -0
- metadata +25 -12
checksums.yaml
CHANGED
@@ -1,15 +1,7 @@
|
|
1
1
|
---
|
2
|
-
|
3
|
-
metadata.gz:
|
4
|
-
|
5
|
-
data.tar.gz: !binary |-
|
6
|
-
ZDFjY2U1NzlhMTdiYjZiMjQxYmU1ZDI3YjM4ZGQzMTE2MDMzZGJmMA==
|
2
|
+
SHA1:
|
3
|
+
metadata.gz: 0c2def018fb68647faadf57e4fcc8cbb4924fcfc
|
4
|
+
data.tar.gz: 22e026d85d74eded90bf1f1b6c2539dd4643efed
|
7
5
|
SHA512:
|
8
|
-
metadata.gz:
|
9
|
-
|
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 = {
|
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
|
-
|
22
|
+
servers = options.fetch(:servers)
|
23
|
+
conn_options = options.fetch(:conn_options)
|
24
|
+
conn_options[:servers] = servers
|
13
25
|
|
14
|
-
@available = TimedStack.new(@size,
|
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 = {
|
9
|
+
DEFAULTS = {
|
10
|
+
retries: 10,
|
11
|
+
retry_interval: 1,
|
12
|
+
conn_timeout: 1
|
13
|
+
}
|
10
14
|
|
11
|
-
def initialize(
|
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(
|
30
|
+
Timeout::timeout(@conn_timeout) do
|
25
31
|
@conn = r.connect(server)
|
26
32
|
end
|
27
33
|
return true
|
28
34
|
rescue
|
29
|
-
sleep
|
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,
|
10
|
-
@
|
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
|
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)
|
data/lib/multithink/version.rb
CHANGED
data/multithink.gemspec
CHANGED
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.
|
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-
|
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.
|
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:
|