Class: Mongo::TCPSocket

Inherits:
Object show all
Includes:
SocketUtil
Defined in:
lib/mongo/util/tcp_socket.rb

Overview

Wrapper class for Socket

Emulates TCPSocket with operation and connection timeout sans Timeout::timeout

Direct Known Subclasses

UNIXSocket

Instance Attribute Summary

Attributes included from SocketUtil

#pid, #pool

Instance Method Summary collapse

Methods included from SocketUtil

#checkin, #checkout, #close, #closed?

Constructor Details

#initialize(host, port, op_timeout = nil, connect_timeout = nil, opts = {}) ⇒ TCPSocket

Returns a new instance of TCPSocket.



27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
# File 'lib/mongo/util/tcp_socket.rb', line 27

def initialize(host, port, op_timeout=nil, connect_timeout=nil, opts={})
  @op_timeout      = op_timeout
  @connect_timeout = connect_timeout
  @pid             = Process.pid

  # TODO: Prefer ipv6 if server is ipv6 enabled
  @address = Socket.getaddrinfo(host, nil, Socket::AF_INET).first[3]
  @port    = port

  @socket_address = Socket.pack_sockaddr_in(@port, @address)
  @socket = Socket.new(Socket::AF_INET, Socket::SOCK_STREAM, 0)
  @socket.setsockopt(Socket::IPPROTO_TCP, Socket::TCP_NODELAY, 1)

  connect
end

Instance Method Details

#connectObject



43
44
45
46
47
48
49
50
51
# File 'lib/mongo/util/tcp_socket.rb', line 43

def connect
  if @connect_timeout
    Timeout::timeout(@connect_timeout, ConnectionTimeoutError) do
      @socket.connect(@socket_address)
    end
  else
    @socket.connect(@socket_address)
  end
end

#read(maxlen, buffer) ⇒ Object



57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
# File 'lib/mongo/util/tcp_socket.rb', line 57

def read(maxlen, buffer)
  # Block on data to read for @op_timeout seconds
  begin
    ready = IO.select([@socket], nil, [@socket], @op_timeout)
    unless ready
      raise OperationTimeout
    end
  rescue IOError
    raise ConnectionFailure
  end

  # Read data from socket
  begin
    @socket.sysread(maxlen, buffer)
  rescue SystemCallError, IOError => ex
    raise ConnectionFailure, ex
  end
end

#send(data) ⇒ Object



53
54
55
# File 'lib/mongo/util/tcp_socket.rb', line 53

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