class RedisHA::Router::Connection

Public Class Methods

new(debug_on=false) click to toggle source
# File lib/redis_ha/router/connection.rb, line 11
def initialize(debug_on=false)
  @debug = debug_on
  @upstreams = {}
end

Public Instance Methods

connected(name) click to toggle source
# File lib/redis_ha/router/connection.rb, line 63
def connected name
  logger.debug [:connected]
  @on_connect.call(name) if @on_connect
end
on_connect(&block) click to toggle source
# File lib/redis_ha/router/connection.rb, line 9
def on_connect(&block);  @on_connect  = block; end
on_data(&block) click to toggle source
# File lib/redis_ha/router/connection.rb, line 6
def on_data(&block);     @on_data     = block; end
on_finish(&block) click to toggle source
# File lib/redis_ha/router/connection.rb, line 8
def on_finish(&block);   @on_finish   = block; end
on_response(&block) click to toggle source
# File lib/redis_ha/router/connection.rb, line 7
def on_response(&block); @on_response = block; end
peer() click to toggle source
# File lib/redis_ha/router/connection.rb, line 50
def peer
  @peer ||= begin
    peername = get_peername
    peername ? Socket.unpack_sockaddr_in(peername).reverse : nil
  end
end
receive_data(data) click to toggle source
# File lib/redis_ha/router/connection.rb, line 16
def receive_data data
  logger.debug [:connection, data]
  processed = @on_data.call(data) if @on_data

  return if processed == :async or processed.nil?
  relay_to_upstreams(processed)
end
relay_from_upstream(name, data) click to toggle source
# File lib/redis_ha/router/connection.rb, line 57
def relay_from_upstream name, data
  logger.debug [:relay_from_upsteam, name, data]
  data = @on_response.call(name, data) if @on_response
  send_data data unless data.nil?
end
relay_to_upstreams(processed) click to toggle source
# File lib/redis_ha/router/connection.rb, line 24
def relay_to_upstreams processed
  if processed.is_a? Array
    data, servers = *processed
    servers = servers.collect {|s| @upstreams[s]}.compact
  else
    data = processed
    servers ||= @upstreams.values.compact
  end

  servers.each do |s|
    s.send_data data unless data.nil?
  end
end
unbind() click to toggle source
# File lib/redis_ha/router/connection.rb, line 68
def unbind
  logger.debug [:unbind, :connection]

  @upstreams.values.compact.each do |serv|
    serv.close_connection
  end
end
unbind_backend(name) click to toggle source
# File lib/redis_ha/router/connection.rb, line 76
def unbind_backend name
  logger.debug [:unbind_backend, name]
  @upstreams[name] = nil
  close = :close

  if @on_finish
    close = @on_finish.call(name)
  end

  if (@upstreams.values.compact.size.zero? && close != :keep) || close == :close
    close_connection_after_writing
  end
end
upstream(name, options) click to toggle source
# File lib/redis_ha/router/connection.rb, line 38
def upstream name, options
  serv = EventMachine::bind_connect(*build_upstream_signature(options)) do |c|
    c.name = name
    c.plexer = self
    c.proxy_incoming_to(self, 10240) if options[:relay_server]
  end

  self.proxy_incoming_to(serv, 10240) if options[:relay_client]

  @upstreams[name] = serv
end

Private Instance Methods

build_upstream_signature(options) click to toggle source
# File lib/redis_ha/router/connection.rb, line 91
def build_upstream_signature options
  [options[:bind_host], 
   options[:bind_port], 
   options[:host],
   options[:port], 
   RedisHA::Router::Upstream, 
   @debug]
end