redis_failover 0.8.7 → 0.8.8

Sign up to get free protection for your applications and to get access to all the features.
data/Changes.md CHANGED
@@ -1,3 +1,8 @@
1
+ 0.8.8
2
+ -----------
3
+ - Use a stack for handling nested blocks in RedisFailover::Client (inspired by connection_pool gem)
4
+ - Fix an issue with #multi and Redis 3.x.
5
+
1
6
  0.8.7
2
7
  -----------
3
8
  - Support TTL operation (#24)
@@ -105,7 +105,9 @@ module RedisFailover
105
105
  @max_retries = @retry ? options.fetch(:max_retries, 3) : 0
106
106
  @master = nil
107
107
  @slaves = []
108
+ @node_addresses = {}
108
109
  @lock = Monitor.new
110
+ @current_client_key = "current-client-#{self.object_id}"
109
111
  setup_zk
110
112
  build_clients
111
113
  end
@@ -228,11 +230,7 @@ module RedisFailover
228
230
  end
229
231
  raise
230
232
  ensure
231
- if info = Thread.current[:last_operation_info]
232
- if info[:method] == method
233
- Thread.current[:last_operation_info] = nil
234
- end
235
- end
233
+ free_client
236
234
  end
237
235
  end
238
236
 
@@ -312,6 +310,7 @@ module RedisFailover
312
310
  if @namespace
313
311
  client = Redis::Namespace.new(@namespace, :redis => client)
314
312
  end
313
+ @node_addresses[client] = node
315
314
  client
316
315
  end
317
316
  end
@@ -364,7 +363,7 @@ module RedisFailover
364
363
  # @return [String] the address for the node
365
364
  def address_for(node)
366
365
  return unless node
367
- "#{node.client.host}:#{node.client.port}"
366
+ @node_addresses[node]
368
367
  end
369
368
 
370
369
  # Determines if the currently known redis servers is different
@@ -400,6 +399,7 @@ module RedisFailover
400
399
  disconnect(@master, *@slaves)
401
400
  @master = nil
402
401
  @slaves = []
402
+ @node_addresses = {}
403
403
  end
404
404
  end
405
405
 
@@ -414,32 +414,27 @@ module RedisFailover
414
414
  Time.now - @last_znode_timestamp <= ZNODE_UPDATE_TIMEOUT
415
415
  end
416
416
 
417
- # Returns the client to use for the specified operation.
417
+ # Acquires a client to use for the specified operation.
418
418
  #
419
419
  # @param [Symbol] method the method for which to retrieve a client
420
420
  # @return [Redis] a redis client to use
421
421
  # @note
422
- # This method stores the last client/method used to handle the case
423
- # where the same RedisFailover::Client instance is referenced by a
424
- # block passed to multi.
422
+ # This method stores a stack of clients used to handle the case
423
+ # where the same RedisFailover::Client instance is referenced by
424
+ # nested blocks (e.g., block passed to multi).
425
425
  def client_for(method)
426
- if info = Thread.current[:last_operation_info]
427
- return info[:client]
428
- elsif REDIS_READ_OPS.include?(method)
429
- # send read operations to a slave
430
- Thread.current[:last_operation_info] = {
431
- :client => slave,
432
- :method => method
433
- }
434
- else
435
- # direct everything else to master
436
- Thread.current[:last_operation_info] = {
437
- :client => master,
438
- :method => method
439
- }
440
- end
426
+ stack = Thread.current[@current_client_key] ||= []
427
+ client = stack.last || (REDIS_READ_OPS.include?(method) ? slave : master)
428
+ stack << client
429
+ client
430
+ end
441
431
 
442
- Thread.current[:last_operation_info][:client]
432
+ # Pops a client from the thread-local client stack.
433
+ def free_client
434
+ if stack = Thread.current[@current_client_key]
435
+ stack.pop
436
+ end
437
+ nil
443
438
  end
444
439
  end
445
440
  end
@@ -1,3 +1,3 @@
1
1
  module RedisFailover
2
- VERSION = '0.8.7'
2
+ VERSION = '0.8.8'
3
3
  end
@@ -67,7 +67,7 @@ module RedisFailover
67
67
  thread = Thread.new { node.wait }
68
68
  thread.should be_alive
69
69
  node.wakeup
70
- sleep 0.2
70
+ sleep 2
71
71
  thread.should_not be_alive
72
72
  thread.value.should be_nil
73
73
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: redis_failover
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.8.7
4
+ version: 0.8.8
5
5
  prerelease:
6
6
  platform: ruby
7
7
  authors:
@@ -9,7 +9,7 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2012-07-05 00:00:00.000000000 Z
12
+ date: 2012-07-11 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: redis
@@ -181,12 +181,18 @@ required_ruby_version: !ruby/object:Gem::Requirement
181
181
  - - ! '>='
182
182
  - !ruby/object:Gem::Version
183
183
  version: '0'
184
+ segments:
185
+ - 0
186
+ hash: 1682617654026329056
184
187
  required_rubygems_version: !ruby/object:Gem::Requirement
185
188
  none: false
186
189
  requirements:
187
190
  - - ! '>='
188
191
  - !ruby/object:Gem::Version
189
192
  version: '0'
193
+ segments:
194
+ - 0
195
+ hash: 1682617654026329056
190
196
  requirements: []
191
197
  rubyforge_project:
192
198
  rubygems_version: 1.8.23