binary42-remix-stash 0.9.3 → 0.9.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.
- data/VERSION +1 -1
- data/lib/remix/stash/cluster.rb +13 -9
- data/lib/remix/stash.rb +38 -31
- data/remix-stash.gemspec +2 -2
- data/spec/stash_spec.rb +6 -0
- metadata +2 -2
data/VERSION
CHANGED
@@ -1 +1 @@
|
|
1
|
-
0.9.
|
1
|
+
0.9.4
|
data/lib/remix/stash/cluster.rb
CHANGED
@@ -23,7 +23,7 @@ class Remix::Stash::Cluster
|
|
23
23
|
rescue Errno::EPIPE, Errno::ECONNRESET
|
24
24
|
io.close
|
25
25
|
retry
|
26
|
-
rescue Stash::ProtocolError, Errno::EAGAIN
|
26
|
+
rescue Remix::Stash::ProtocolError, Errno::EAGAIN
|
27
27
|
next
|
28
28
|
end
|
29
29
|
end
|
@@ -47,10 +47,10 @@ class Remix::Stash::Cluster
|
|
47
47
|
rescue Errno::EPIPE, Errno::ECONNRESET
|
48
48
|
io.close
|
49
49
|
retry
|
50
|
-
rescue Stash::ProtocolError, Errno::EAGAIN
|
50
|
+
rescue Remix::Stash::ProtocolError, Errno::EAGAIN
|
51
51
|
next
|
52
52
|
end
|
53
|
-
raise Stash::ClusterError,
|
53
|
+
raise Remix::Stash::ClusterError,
|
54
54
|
"Unable to find suitable host to communicate with for #{key.inspect} (MD5-32=#{hash})"
|
55
55
|
end
|
56
56
|
end
|
@@ -60,9 +60,9 @@ private
|
|
60
60
|
if RUBY_PLATFORM =~ /java/
|
61
61
|
|
62
62
|
def connect(host, port)
|
63
|
-
|
64
|
-
|
65
|
-
|
63
|
+
socket = TCPSocket.new(host, port)
|
64
|
+
set_timeout(socket)
|
65
|
+
socket
|
66
66
|
end
|
67
67
|
|
68
68
|
else
|
@@ -70,9 +70,7 @@ private
|
|
70
70
|
def connect(host, port)
|
71
71
|
address = Socket.getaddrinfo(host, nil).first
|
72
72
|
socket = Socket.new(Socket.const_get(address[0]), SOCK_STREAM, 0)
|
73
|
-
|
74
|
-
socket.setsockopt(SOL_SOCKET, SO_SNDTIMEO, timeout)
|
75
|
-
socket.setsockopt(SOL_SOCKET, SO_RCVTIMEO, timeout)
|
73
|
+
set_timeout(socket)
|
76
74
|
socket.connect(Socket.pack_sockaddr_in(port, address[3]))
|
77
75
|
socket
|
78
76
|
end
|
@@ -86,4 +84,10 @@ private
|
|
86
84
|
host_to_io(key, host, port)
|
87
85
|
end
|
88
86
|
|
87
|
+
def set_timeout(socket)
|
88
|
+
timeout = [2,0].pack('l_2') # 2 seconds
|
89
|
+
socket.setsockopt(SOL_SOCKET, SO_SNDTIMEO, timeout)
|
90
|
+
socket.setsockopt(SOL_SOCKET, SO_RCVTIMEO, timeout)
|
91
|
+
end
|
92
|
+
|
89
93
|
end
|
data/lib/remix/stash.rb
CHANGED
@@ -21,7 +21,7 @@ class Remix::Stash
|
|
21
21
|
|
22
22
|
def self.define_cluster(clusters)
|
23
23
|
clusters.each do |k,v|
|
24
|
-
@@clusters[k] = Cluster.new(v)
|
24
|
+
@@clusters[k] = Cluster === v ? v : Cluster.new(v)
|
25
25
|
end
|
26
26
|
end
|
27
27
|
|
@@ -38,17 +38,18 @@ class Remix::Stash
|
|
38
38
|
def add(*keys)
|
39
39
|
opts = default_opts(keys)
|
40
40
|
value = keys.pop
|
41
|
-
key = canonical_key(keys)
|
42
|
-
cluster.select(key) {|io| Protocol.add(io, key, value, opts[:ttl])}
|
41
|
+
key = canonical_key(keys, opts)
|
42
|
+
cluster(opts).select(key) {|io| Protocol.add(io, key, value, opts[:ttl])}
|
43
43
|
end
|
44
44
|
|
45
45
|
def clear(*keys)
|
46
|
+
opts = default_opts(keys)
|
46
47
|
if keys.empty?
|
47
48
|
if @name == :root
|
48
|
-
cluster.each {|io| Protocol.flush(io)}
|
49
|
+
cluster(opts).each {|io| Protocol.flush(io)}
|
49
50
|
else
|
50
51
|
vk = vector_key
|
51
|
-
cluster.select(vk) {|io|
|
52
|
+
cluster(opts).select(vk) {|io|
|
52
53
|
unless Protocol.incr(io, vk, 1)
|
53
54
|
Protocol.add(io, vk, '0')
|
54
55
|
Protocol.incr(io, vk, 1)
|
@@ -58,8 +59,8 @@ class Remix::Stash
|
|
58
59
|
cycle
|
59
60
|
else
|
60
61
|
# remove a specific key
|
61
|
-
key = canonical_key(keys)
|
62
|
-
cluster.select(key) {|io| Protocol.delete(io, key)}
|
62
|
+
key = canonical_key(keys, opts)
|
63
|
+
cluster(opts).select(key) {|io| Protocol.delete(io, key)}
|
63
64
|
end
|
64
65
|
end
|
65
66
|
|
@@ -72,9 +73,10 @@ class Remix::Stash
|
|
72
73
|
end
|
73
74
|
|
74
75
|
def decr(*keys)
|
76
|
+
opts = default_opts(keys)
|
75
77
|
step = keys.pop
|
76
|
-
key = canonical_key(keys)
|
77
|
-
cluster.select(key) {|io| Protocol.decr(io, key, step)}
|
78
|
+
key = canonical_key(keys, opts)
|
79
|
+
cluster(opts).select(key) {|io| Protocol.decr(io, key, step)}
|
78
80
|
end
|
79
81
|
|
80
82
|
def default(opts = {})
|
@@ -90,14 +92,15 @@ class Remix::Stash
|
|
90
92
|
end
|
91
93
|
|
92
94
|
def delete(*keys)
|
93
|
-
|
94
|
-
|
95
|
+
opts = default_opts(keys)
|
96
|
+
key = canonical_key(keys, opts)
|
97
|
+
cluster(opts).select(key) {|io| Protocol.delete(io, key)}
|
95
98
|
end
|
96
99
|
|
97
100
|
def eval(*keys)
|
98
101
|
opts = default_opts(keys)
|
99
|
-
key = canonical_key(keys)
|
100
|
-
cluster.select(key) {|io|
|
102
|
+
key = canonical_key(keys, opts)
|
103
|
+
cluster(opts).select(key) {|io|
|
101
104
|
value = Protocol.get(io, key)
|
102
105
|
if value
|
103
106
|
Marshal.load(value)
|
@@ -110,8 +113,9 @@ class Remix::Stash
|
|
110
113
|
end
|
111
114
|
|
112
115
|
def gate(*keys)
|
113
|
-
|
114
|
-
|
116
|
+
opts = default_opts(keys)
|
117
|
+
key = canonical_key(keys, opts)
|
118
|
+
cluster(opts).select(key) {|io|
|
115
119
|
if Protocol.get(io, key)
|
116
120
|
yield(*keys)
|
117
121
|
true
|
@@ -122,20 +126,23 @@ class Remix::Stash
|
|
122
126
|
end
|
123
127
|
|
124
128
|
def get(*keys)
|
125
|
-
|
126
|
-
|
129
|
+
opts = default_opts(keys)
|
130
|
+
key = canonical_key(keys, opts)
|
131
|
+
cluster(opts).select(key) {|io| load_value(Protocol.get(io, key))}
|
127
132
|
end
|
128
133
|
alias [] get
|
129
134
|
|
130
135
|
def incr(*keys)
|
136
|
+
opts = default_opts(keys)
|
131
137
|
step = keys.pop
|
132
|
-
key = canonical_key(keys)
|
133
|
-
cluster.select(key) {|io| Protocol.incr(io, key, step)}
|
138
|
+
key = canonical_key(keys, opts)
|
139
|
+
cluster(opts).select(key) {|io| Protocol.incr(io, key, step)}
|
134
140
|
end
|
135
141
|
|
136
142
|
def read(*keys)
|
137
|
-
|
138
|
-
|
143
|
+
opts = default_opts(keys)
|
144
|
+
key = canonical_key(keys, opts)
|
145
|
+
cluster(opts).select(key) {|io| Protocol.get(io, key)}
|
139
146
|
end
|
140
147
|
|
141
148
|
def release
|
@@ -150,8 +157,8 @@ class Remix::Stash
|
|
150
157
|
def set(*keys)
|
151
158
|
opts = default_opts(keys)
|
152
159
|
value = keys.pop
|
153
|
-
key = canonical_key(keys)
|
154
|
-
cluster.select(key) {|io| Protocol.set(io, key, dump_value(value), opts[:ttl])}
|
160
|
+
key = canonical_key(keys, opts)
|
161
|
+
cluster(opts).select(key) {|io| Protocol.set(io, key, dump_value(value), opts[:ttl])}
|
155
162
|
end
|
156
163
|
alias []= set
|
157
164
|
|
@@ -164,19 +171,19 @@ class Remix::Stash
|
|
164
171
|
def write(*keys)
|
165
172
|
opts = default_opts(keys)
|
166
173
|
value = keys.pop
|
167
|
-
key = canonical_key(keys)
|
168
|
-
cluster.select(key) {|io| Protocol.set(io, key, value, opts[:ttl])}
|
174
|
+
key = canonical_key(keys, opts)
|
175
|
+
cluster(opts).select(key) {|io| Protocol.set(io, key, value, opts[:ttl])}
|
169
176
|
end
|
170
177
|
|
171
178
|
private
|
172
179
|
|
173
180
|
KEY_SEPARATOR = '/'
|
174
|
-
def canonical_key(keys)
|
175
|
-
"#{implicit_scope}#{keys.join(KEY_SEPARATOR)}#{vector}"
|
181
|
+
def canonical_key(keys, opts = default_opts)
|
182
|
+
"#{implicit_scope}#{keys.join(KEY_SEPARATOR)}#{vector(opts)}"
|
176
183
|
end
|
177
184
|
|
178
|
-
def cluster
|
179
|
-
@@clusters[:default]
|
185
|
+
def cluster(opts = {})
|
186
|
+
@@clusters[opts[:cluster] || :default]
|
180
187
|
end
|
181
188
|
|
182
189
|
def coherency
|
@@ -209,11 +216,11 @@ private
|
|
209
216
|
nil
|
210
217
|
end
|
211
218
|
|
212
|
-
def vector
|
219
|
+
def vector(opts)
|
213
220
|
return if @name == :root
|
214
221
|
return @vector if @vector && coherency != :dynamic
|
215
222
|
vk = vector_key
|
216
|
-
cluster.select(vk) do |io|
|
223
|
+
cluster(opts).select(vk) do |io|
|
217
224
|
@vector = Protocol.get(io, vk)
|
218
225
|
unless @vector
|
219
226
|
Protocol.add(io, vk, '0')
|
data/remix-stash.gemspec
CHANGED
@@ -5,11 +5,11 @@
|
|
5
5
|
|
6
6
|
Gem::Specification.new do |s|
|
7
7
|
s.name = %q{remix-stash}
|
8
|
-
s.version = "0.9.
|
8
|
+
s.version = "0.9.4"
|
9
9
|
|
10
10
|
s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
|
11
11
|
s.authors = ["Brian Mitchell"]
|
12
|
-
s.date = %q{2009-09-
|
12
|
+
s.date = %q{2009-09-17}
|
13
13
|
s.email = %q{binary42@gmail.com}
|
14
14
|
s.extra_rdoc_files = [
|
15
15
|
"LICENSE",
|
data/spec/stash_spec.rb
CHANGED
@@ -103,6 +103,12 @@ class StashSpec < Spec
|
|
103
103
|
assert_equal [['default', 'default', 11211]], Stash.cluster(:default_port).hosts
|
104
104
|
end
|
105
105
|
|
106
|
+
should 'allow Cluster object to be passed in' do
|
107
|
+
cluster = Stash::Cluster.new(%w[localhost:11211])
|
108
|
+
Stash.define_cluster(:object => cluster)
|
109
|
+
assert_equal cluster, Stash.cluster(:object)
|
110
|
+
end
|
111
|
+
|
106
112
|
end
|
107
113
|
|
108
114
|
context '#add' do
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: binary42-remix-stash
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.9.
|
4
|
+
version: 0.9.4
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Brian Mitchell
|
@@ -9,7 +9,7 @@ autorequire:
|
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
11
|
|
12
|
-
date: 2009-09-
|
12
|
+
date: 2009-09-17 00:00:00 -07:00
|
13
13
|
default_executable:
|
14
14
|
dependencies: []
|
15
15
|
|