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 CHANGED
@@ -1 +1 @@
1
- 0.9.3
1
+ 0.9.4
@@ -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
- # We currently don't support timeouts in JRuby since the socket API is
64
- # incomplete.
65
- TCPSocket.new(host, port)
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
- timeout = [2,0].pack('l_2') # 2 seconds
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
- key = canonical_key(keys)
94
- cluster.select(key) {|io| Protocol.delete(io, key)}
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
- key = canonical_key(keys)
114
- cluster.select(key) {|io|
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
- key = canonical_key(keys)
126
- cluster.select(key) {|io| load_value(Protocol.get(io, key))}
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
- key = canonical_key(keys)
138
- cluster.select(key) {|io| Protocol.get(io, key)}
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.3"
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-16}
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.3
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-16 00:00:00 -07:00
12
+ date: 2009-09-17 00:00:00 -07:00
13
13
  default_executable:
14
14
  dependencies: []
15
15