Sha256: 3030c9b1ae259030e4f86f55743e452b076e1d774ed32e841894a67c9abc4f08

Contents?: true

Size: 1.13 KB

Versions: 2

Compression:

Stored size: 1.13 KB

Contents

require 'socket'
require 'timeout'

class FastCache::Memcache::Node
  attr_reader :host, :port, :status
  attr_accessor :weight

  CONNECT_TIMEOUT = 0.25
  RETRY_DELAY = 10.0

  def initialize(host, port)
    @host = host
    @port = port
    @weight = 1
    @status = :disconnected
    @socket = nil
    @retry = nil
  end

  def read(*a)
    socket.read(*a)
  end

  def write(data)
    socket.write(data)
  end

  def gets
    socket.gets
  end

  def close
    socket.close if @socket
    @socket = nil
  end

  def connect
    socket
  end

private

  def socket
    return @socket if @socket && !@socket.closed?

    @socket = nil

    # If the host was dead, don't retry for a while.
    return if @retry and @retry > Time.now

    # Attempt to connect if not already connected.
    begin
      @socket = timeout CONNECT_TIMEOUT do
        TCPSocket.new @host, @port
      end
      @retry  = nil
      @status = :connected
    rescue SocketError, SystemCallError, IOError, Timeout::Error => err
      @status = :dead
      @socket = nil
      @retry  = Time.now + RETRY_DELAY
    end

    @socket
  rescue IOError
    @socket = nil
    retry
  end

end

Version data entries

2 entries across 2 versions & 1 rubygems

Version Path
binary42-fastcache-0.2 lib/fastcache/memcache/node.rb
binary42-fastcache-0.3 lib/fastcache/memcache/node.rb