module Moped::Sockets::Connectable

Attributes

host[R]
port[R]

Public Class Methods

included(klass) click to toggle source

Bring in the class methods when included.

@example Extend the class methods.

Connectable.included(class)

@param [ Class ] klass The class including the module.

@since 1.3.0

# File lib/moped/sockets/connectable.rb, line 33
def self.included(klass)
  klass.send(:extend, ClassMethods)
end

Public Instance Methods

alive?() click to toggle source

Is the socket connection alive?

@example Is the socket alive?

socket.alive?

@return [ true, false ] If the socket is alive.

@since 1.0.0

# File lib/moped/sockets/connectable.rb, line 15
def alive?
  if Kernel::select([ self ], nil, [ self ], 0)
    !eof? rescue false
  else
    true
  end
rescue IOError
  false
end
read(length) click to toggle source

Read from the TCP socket.

@param [ Integer ] length The length to read.

@return [ Object ] The data.

@since 1.2.0

Calls superclass method
# File lib/moped/sockets/connectable.rb, line 44
def read(length)
  check_if_alive!
  handle_socket_errors { super }
end
write(*args) click to toggle source

Write to the socket.

@example Write to the socket.

socket.write(data)

@param [ Object ] args The data to write.

@return [ Integer ] The number of bytes written.

@since 1.0.0

Calls superclass method
# File lib/moped/sockets/connectable.rb, line 59
def write(*args)
  check_if_alive!
  handle_socket_errors { super }
end

Private Instance Methods

check_if_alive!() click to toggle source

Before performing a read or write operating, ping the server to check if it is alive.

@api private

@example Check if the connection is alive.

connectable.check_if_alive!

@raise [ ConnectionFailure ] If the connectable is not alive.

@since 1.4.0

# File lib/moped/sockets/connectable.rb, line 77
def check_if_alive!
  unless alive?
    raise Errors::ConnectionFailure, "Socket connection was closed by remote host"
  end
end
generate_message(error) click to toggle source

Generate the message for the connection failure based of the system call error, with some added information.

@api private

@example Generate the error message.

connectable.generate_message(error)

@param [ SystemCallError ] error The error.

@return [ String ] The error message.

@since 1.4.0

# File lib/moped/sockets/connectable.rb, line 96
def generate_message(error)
  "#{host}:#{port}: #{error.class.name} (#{error.errno}): #{error.message}"
end
handle_socket_errors() { || ... } click to toggle source

Handle the potential socket errors that can occur.

@api private

@example Handle the socket errors while executing the block.

handle_socket_errors do
  socket.read(128)
end

@raise [ Moped::Errors::ConnectionFailure ] If a system call error or

IOError occured which can be retried.

@raise [ Moped::Errors::Unrecoverable ] If a system call error occured

which cannot be retried and should be re-raised.

@return [ Object ] The result of the yield.

@since 1.0.0

# File lib/moped/sockets/connectable.rb, line 117
def handle_socket_errors
  yield
rescue Errno::ECONNREFUSED => e
  raise Errors::ConnectionFailure, generate_message(e)
rescue Errno::EHOSTUNREACH => e
  raise Errors::ConnectionFailure, generate_message(e)
rescue Errno::EPIPE => e
  raise Errors::ConnectionFailure, generate_message(e)
rescue Errno::ECONNRESET => e
  raise Errors::ConnectionFailure, generate_message(e)
rescue Errno::ETIMEDOUT => e
  raise Errors::ConnectionFailure, generate_message(e)
rescue IOError
  raise Errors::ConnectionFailure, "Connection timed out to Mongo on #{host}:#{port}"
rescue OpenSSL::SSL::SSLError => e
  raise Errors::ConnectionFailure, "SSL Error '#{e.to_s}' for connection to Mongo on #{host}:#{port}"
end