class RailsFailover::Redis::Connector

Public Class Methods

connect(options) click to toggle source
Calls superclass method
# File lib/rails_failover/redis/connector.rb, line 14
def self.connect(options)
  is_primary = (options[:host] == options[:primary_host]) &&
               (options[:port] == options[:primary_port])
  super(options).tap do |conn|
    conn.rails_failover_role = is_primary ? PRIMARY : REPLICA
  end
rescue ::Redis::TimeoutError,
       SocketError,
       Errno::EADDRNOTAVAIL,
       Errno::ECONNREFUSED,
       Errno::EHOSTDOWN,
       Errno::EHOSTUNREACH,
       Errno::ENETUNREACH,
       Errno::ENOENT,
       Errno::ETIMEDOUT,
       Errno::EINVAL => e

  Handler.instance.verify_primary(options) if is_primary
  raise e
end
new(options) click to toggle source
# File lib/rails_failover/redis/connector.rb, line 8
def initialize(options)
  orignal_driver = options[:driver]
  options[:primary_host] = options[:host]
  options[:primary_port] = options[:port]

  options[:driver] = Class.new(options[:driver]) do
    def self.connect(options)
      is_primary = (options[:host] == options[:primary_host]) &&
                   (options[:port] == options[:primary_port])
      super(options).tap do |conn|
        conn.rails_failover_role = is_primary ? PRIMARY : REPLICA
      end
    rescue ::Redis::TimeoutError,
           SocketError,
           Errno::EADDRNOTAVAIL,
           Errno::ECONNREFUSED,
           Errno::EHOSTDOWN,
           Errno::EHOSTUNREACH,
           Errno::ENETUNREACH,
           Errno::ENOENT,
           Errno::ETIMEDOUT,
           Errno::EINVAL => e

      Handler.instance.verify_primary(options) if is_primary
      raise e
    end

    attr_accessor :rails_failover_role

    def shutdown_socket
      @sock&.shutdown
    rescue Errno::ENOTCONN
    end
  end

  options[:original_driver] = orignal_driver
  options.delete(:connector)
  options[:id] ||= "#{options[:host]}:#{options[:port]}"
  @replica_options = replica_options(options)
  @options = options.dup
end

Public Instance Methods

check(client) click to toggle source
# File lib/rails_failover/redis/connector.rb, line 58
def check(client)
  Handler.instance.register_client(client)
  expected_role = Handler.instance.primary_down?(@options) ? REPLICA : PRIMARY
  if client.connection.rails_failover_role != expected_role
    raise ::Redis::CannotConnectError, "Opened with unexpected failover role"
  end
end
on_disconnect(client) click to toggle source
# File lib/rails_failover/redis/connector.rb, line 66
def on_disconnect(client)
  Handler.instance.deregister_client(client)
end
resolve() click to toggle source
# File lib/rails_failover/redis/connector.rb, line 50
def resolve
  if Handler.instance.primary_down?(@options)
    @replica_options
  else
    @options
  end
end
shutdown_socket() click to toggle source
# File lib/rails_failover/redis/connector.rb, line 37
def shutdown_socket
  @sock&.shutdown
rescue Errno::ENOTCONN
end

Private Instance Methods

replica_options(options) click to toggle source
# File lib/rails_failover/redis/connector.rb, line 72
def replica_options(options)
  opts = options.dup
  opts[:host] = opts[:replica_host]
  opts[:port] = opts[:replica_port]
  opts
end