Class: MemCache::Server

Inherits:
Object
  • Object
show all
Defined in:
lib/memcache.rb

Overview

This class represents a memcached server instance.

Constant Summary collapse

CONNECT_TIMEOUT =

The amount of time to wait to establish a connection with a memcached server. If a connection cannot be established within this time limit, the server will be marked as down.

0.25
RETRY_DELAY =

The amount of time to wait before attempting to re-establish a connection with a server that is marked dead.

30.0

Instance Attribute Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(memcache, host, port = DEFAULT_PORT, weight = DEFAULT_WEIGHT) ⇒ Server

Create a new MemCache::Server object for the memcached instance listening on the given host and port, weighted by the given weight.

Raises:

  • (ArgumentError)


968
969
970
971
972
973
974
975
976
977
978
979
980
981
# File 'lib/memcache.rb', line 968

def initialize(memcache, host, port = DEFAULT_PORT, weight = DEFAULT_WEIGHT)
  raise ArgumentError, "No host specified" if host.nil? or host.empty?
  raise ArgumentError, "No port specified" if port.nil? or port.to_i.zero?

  @host   = host
  @port   = port.to_i
  @weight = weight.to_i

  @sock   = nil
  @retry  = nil
  @status = 'NOT CONNECTED'
  @timeout = memcache.timeout
  @logger = memcache.logger
end

Instance Attribute Details

#hostObject (readonly)

The host the memcached server is running on.



940
941
942
# File 'lib/memcache.rb', line 940

def host
  @host
end

#loggerObject (readonly)

Returns the value of attribute logger.



962
963
964
# File 'lib/memcache.rb', line 962

def logger
  @logger
end

#portObject (readonly)

The port the memcached server is listening on.



945
946
947
# File 'lib/memcache.rb', line 945

def port
  @port
end

#retryObject (readonly)

The time of next retry if the connection is dead.



955
956
957
# File 'lib/memcache.rb', line 955

def retry
  @retry
end

#statusObject (readonly)

A text status string describing the state of the server.



960
961
962
# File 'lib/memcache.rb', line 960

def status
  @status
end

#weightObject (readonly)

The weight given to the server.



950
951
952
# File 'lib/memcache.rb', line 950

def weight
  @weight
end

Instance Method Details

#alive?Boolean

Check whether the server connection is alive. This will cause the socket to attempt to connect if it isn’t already connected and or if the server was previously marked as down and the retry time has been exceeded.

Returns:

  • (Boolean)


996
997
998
# File 'lib/memcache.rb', line 996

def alive?
  !!socket
end

#closeObject

Close the connection to the memcached server targeted by this object. The server is not considered dead.



1033
1034
1035
1036
1037
1038
# File 'lib/memcache.rb', line 1033

def close
  @sock.close if @sock && !@sock.closed?
  @sock   = nil
  @retry  = nil
  @status = "NOT CONNECTED"
end

#inspectObject

Return a string representation of the server object.



986
987
988
# File 'lib/memcache.rb', line 986

def inspect
  "<MemCache::Server: %s:%d [%d] (%s)>" % [@host, @port, @weight, @status]
end

#mark_dead(error) ⇒ Object

Mark the server as dead and close its socket.



1043
1044
1045
1046
1047
1048
1049
1050
1051
# File 'lib/memcache.rb', line 1043

def mark_dead(error)
  @sock.close if @sock && !@sock.closed?
  @sock   = nil
  @retry  = Time.now + RETRY_DELAY

  reason = "#{error.class.name}: #{error.message}"
  @status = sprintf "%s:%s DEAD (%s), will retry at %s", @host, @port, reason, @retry
  @logger.info { @status } if @logger
end

#socketObject

Try to connect to the memcached server targeted by this object. Returns the connected socket object on success or nil on failure.



1004
1005
1006
1007
1008
1009
1010
1011
1012
1013
1014
1015
1016
1017
1018
1019
1020
1021
1022
1023
1024
1025
1026
1027
# File 'lib/memcache.rb', line 1004

def socket
  return @sock if @sock and not @sock.closed?

  @sock = 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
    @sock = @timeout ? TCPTimeoutSocket.new(@host, @port, @timeout) : TCPSocket.new(@host, @port)

    if Socket.constants.include? 'TCP_NODELAY' then
      @sock.setsockopt Socket::IPPROTO_TCP, Socket::TCP_NODELAY, 1
    end
    @retry  = nil
    @status = 'CONNECTED'
  rescue SocketError, SystemCallError, IOError, Timeout::Error => err
    logger.warn { "Unable to open socket: #{err.class.name}, #{err.message}" } if logger
    mark_dead err
  end

  return @sock
end