module Aerospike::Socket::Base

Public Class Methods

new(*args) click to toggle source
Calls superclass method
# File lib/aerospike/socket/base.rb, line 23
def initialize(*args)
  super(*args)
  @timeout = nil
end

Public Instance Methods

alive?() click to toggle source

Returns whether the connection to the server is alive.

It is useful to call this method before making a call to the server that would change data on the server.

Note: This method is only useful if the server closed the connection or if a previous connection failure occurred. If the server is hard killed this will still return true until one or more writes are attempted.

# File lib/aerospike/socket/base.rb, line 73
def alive?
  return false if closed?

  if IO.select([self], nil, nil, 0)
    !eof? rescue false
  else
    true
  end
rescue IOError
  false
end
close() click to toggle source
Calls superclass method
# File lib/aerospike/socket/base.rb, line 85
def close
  return if closed?
  super()
end
connected?() click to toggle source
# File lib/aerospike/socket/base.rb, line 61
def connected?
  !closed?
end
read(buffer, length, offset = 0) click to toggle source
# File lib/aerospike/socket/base.rb, line 28
def read(buffer, length, offset = 0)
  bytes_read = 0
  until bytes_read >= length
    result = read_from_socket(length - bytes_read)
    buffer.write_binary(result, offset + bytes_read)
    bytes_read += result.bytesize
  end
  bytes_read
end
read_from_socket(length) click to toggle source
# File lib/aerospike/socket/base.rb, line 38
def read_from_socket(length)
  with_timeout(@timeout) do
    read_nonblock(length)
  end
end
timeout=(timeout) click to toggle source
# File lib/aerospike/socket/base.rb, line 57
def timeout=(timeout)
  @timeout = timeout && timeout > 0 ? timeout : nil
end
write(buffer, length) click to toggle source
# File lib/aerospike/socket/base.rb, line 44
def write(buffer, length)
  bytes_written = 0
  until bytes_written >= length
    bytes_written += write_to_socket(buffer.read(bytes_written, length - bytes_written))
  end
end
write_to_socket(data) click to toggle source
# File lib/aerospike/socket/base.rb, line 51
def write_to_socket(data)
  with_timeout(@timeout) do
    write_nonblock(data)
  end
end

Private Instance Methods

with_timeout(timeout, &block) click to toggle source

Note: For SSL connections, read_nonblock may invoke write system call, which may raise IO::WaitWritable, and vice versa, due to SSL renegotiation, so we should always rescue both.

# File lib/aerospike/socket/base.rb, line 95
def with_timeout(timeout, &block)
  block.call
rescue IO::WaitReadable => e
  if IO::select([self], nil, nil, timeout)
    retry
  else
    fail Aerospike::Exceptions::Connection, "Socket timeout: #{e}"
  end
rescue IO::WaitWritable => e
  if IO::select(nil, [self], nil, timeout)
    retry
  else
    fail Aerospike::Exceptions::Connection, "Socket timeout: #{e}"
  end
rescue => e
  raise Aerospike::Exceptions::Connection, "Socket error: #{e}"
end