Class: Redis::ReconnectWithReadonly

Inherits:
Object
  • Object
show all
Defined in:
lib/redis/reconnect_with_readonly.rb,
lib/redis/reconnect_with_readonly/version.rb

Constant Summary collapse

VERSION =
"0.9.3"

Class Attribute Summary collapse

Class Method Summary collapse

Class Attribute Details

.initial_retry_waitObject

Returns the value of attribute initial_retry_wait.



14
15
16
# File 'lib/redis/reconnect_with_readonly.rb', line 14

def initial_retry_wait
  @initial_retry_wait
end

.loggerObject

Returns the value of attribute logger.



14
15
16
# File 'lib/redis/reconnect_with_readonly.rb', line 14

def logger
  @logger
end

.max_retry_waitObject

Returns the value of attribute max_retry_wait.



14
15
16
# File 'lib/redis/reconnect_with_readonly.rb', line 14

def max_retry_wait
  @max_retry_wait
end

.reconnect_attemptsObject

Returns the value of attribute reconnect_attempts.



14
15
16
# File 'lib/redis/reconnect_with_readonly.rb', line 14

def reconnect_attempts
  @reconnect_attempts
end

Class Method Details

.reconnect_with_readonly(redis, &block) ⇒ Object



17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
# File 'lib/redis/reconnect_with_readonly.rb', line 17

def self.reconnect_with_readonly(redis, &block)
  retries = 0
  begin
    yield block
  rescue CommandError => e
    if e.message =~ /READONLY/
      if retries < reconnect_attempts
        wait = initial_retry_wait * retries
        wait = [wait, max_retry_wait].min if max_retry_wait
        logger.info {
          "Reconnect with readonly: #{e.message} " \
          "(retries: #{retries}/#{reconnect_attempts}) (wait: #{wait}sec)"
        } if logger
        sleep wait
        retries += 1
        redis.disconnect
        logger.debug { "Reconnect with readonly: disconnected and retry" } if logger
        retry
      else
        logger.info {
          "Reconnect with readonly: Give up " \
          "(retries: #{retries}/#{reconnect_attempts})"
        } if logger
        raise e
      end
    else
      raise e
    end
  end
end