class Redis::ReconnectWithReadonly

Constants

VERSION

Attributes

initial_retry_wait[RW]
logger[RW]
max_retry_wait[RW]
reconnect_attempts[RW]

Public Class Methods

reconnect_with_readonly(redis) { |block| ... } click to toggle source
# 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