Class: Mongo::Socket Private

Inherits:
Object
  • Object
show all
Includes:
Socket::Constants
Defined in:
lib/mongo/socket.rb,
lib/mongo/socket/ssl.rb,
lib/mongo/socket/tcp.rb,
lib/mongo/socket/unix.rb,
lib/mongo/socket/ocsp_cache.rb,
lib/mongo/socket/ocsp_verifier.rb

Overview

This class is part of a private API. You should avoid using this class if possible, as it may be removed or be changed in the future.

Provides additional data around sockets for the driver’s use.

Since:

  • 2.0.0

Direct Known Subclasses

SSL, TCP, Unix

Defined Under Namespace

Modules: OcspCache Classes: OcspVerifier, SSL, TCP, Unix

Constant Summary collapse

SSL_ERROR =

This constant is part of a private API. You should avoid using this constant if possible, as it may be removed or be changed in the future.

Deprecated.

Error message for TLS related exceptions.

Since:

  • 2.0.0

'MongoDB may not be configured with TLS support'.freeze
TIMEOUT_ERROR =

This constant is part of a private API. You should avoid using this constant if possible, as it may be removed or be changed in the future.

Deprecated.

Error message for timeouts on socket calls.

Since:

  • 2.0.0

'Socket request timed out'.freeze
TIMEOUT_PACK =

This constant is part of a private API. You should avoid using this constant if possible, as it may be removed or be changed in the future.

The pack directive for timeouts.

Since:

  • 2.0.0

'l_2'.freeze
WRITE_CHUNK_SIZE =

This constant is part of a private API. You should avoid using this constant if possible, as it may be removed or be changed in the future.

Write data to the socket in chunks of this size.

Since:

  • 2.0.0

65536

Instance Attribute Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(timeout, options) ⇒ Socket

This method is part of a private API. You should avoid using this method if possible, as it may be removed or be changed in the future.

Initializes common socket attributes.

Parameters:

  • timeout (Float)

    The socket timeout value.

  • options (Hash)

    The options.

Options Hash (options):

  • :connect_timeout (Float)

    Connect timeout.

  • :connection_address (Address)

    Address of the connection that created this socket.

  • :connection_generation (Integer)

    Generation of the connection (for non-monitoring connections) that created this socket.

  • :monitor (true | false)

    Whether this socket was created by a monitoring connection.

  • :pipe (IO)

    The file descriptor for the read end of the pipe to listen on during the select system call when reading from the socket.

Since:

  • 2.0.0



72
73
74
75
# File 'lib/mongo/socket.rb', line 72

def initialize(timeout, options)
  @timeout = timeout
  @options = options
end

Instance Attribute Details

#familyInteger (readonly)

This method is part of a private API. You should avoid using this method if possible, as it may be removed or be changed in the future.

Returns family The type of host family.

Returns:

  • (Integer)

    family The type of host family.

Since:

  • 2.0.0



78
79
80
# File 'lib/mongo/socket.rb', line 78

def family
  @family
end

#optionsHash (readonly)

This method is part of a private API. You should avoid using this method if possible, as it may be removed or be changed in the future.

Returns The options.

Returns:

  • (Hash)

    The options.

Since:

  • 2.0.0



84
85
86
# File 'lib/mongo/socket.rb', line 84

def options
  @options
end

#socketSocket (readonly)

This method is part of a private API. You should avoid using this method if possible, as it may be removed or be changed in the future.

Returns socket The wrapped socket.

Returns:

  • (Socket)

    socket The wrapped socket.

Since:

  • 2.0.0



81
82
83
# File 'lib/mongo/socket.rb', line 81

def socket
  @socket
end

#timeoutFloat (readonly)

This method is part of a private API. You should avoid using this method if possible, as it may be removed or be changed in the future.

Returns timeout The socket timeout.

Returns:

  • (Float)

    timeout The socket timeout.

Since:

  • 2.0.0



87
88
89
# File 'lib/mongo/socket.rb', line 87

def timeout
  @timeout
end

Instance Method Details

#alive?true, false

This method is part of a private API. You should avoid using this method if possible, as it may be removed or be changed in the future.

Deprecated.

Use #connectable? on the connection instead.

Is the socket connection alive?

Examples:

Is the socket alive?

socket.alive?

Returns:

  • (true, false)

    If the socket is alive.

Since:

  • 2.0.0



144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
# File 'lib/mongo/socket.rb', line 144

def alive?
  sock_arr = [ @socket ]
  if Kernel::select(sock_arr, nil, sock_arr, 0)
    # The eof? call is supposed to return immediately since select
    # indicated the socket is readable. However, if @socket is a TLS
    # socket, eof? can block anyway - see RUBY-2140.
    begin
      Timeout.timeout(0.1) do
        eof?
      end
    rescue ::Timeout::Error
      true
    end
  else
    true
  end
end

#closetrue

This method is part of a private API. You should avoid using this method if possible, as it may be removed or be changed in the future.

Close the socket.

Examples:

Close the socket.

socket.close

Returns:

  • (true)

    Always true.

Since:

  • 2.0.0



170
171
172
173
174
175
176
177
178
179
180
# File 'lib/mongo/socket.rb', line 170

def close
  begin
    # Sometimes it seems the close call can hang for a long time
    ::Timeout.timeout(5) do
      @socket&.close
    end
  rescue
    # Silence all errors
  end
  true
end

#connectable?true

This method is part of a private API. You should avoid using this method if possible, as it may be removed or be changed in the future.

Deprecated.

For backwards compatibility only, do not use.

Returns:

  • (true)

    Always true.

Since:

  • 2.0.0



270
271
272
# File 'lib/mongo/socket.rb', line 270

def connectable?
  true
end

#connection_addressAddress

This method is part of a private API. You should avoid using this method if possible, as it may be removed or be changed in the future.

Returns Address of the connection that created this socket.

Returns:

  • (Address)

    Address of the connection that created this socket.

Since:

  • 2.0.0



92
93
94
# File 'lib/mongo/socket.rb', line 92

def connection_address
  options[:connection_address]
end

#connection_generationInteger

This method is part of a private API. You should avoid using this method if possible, as it may be removed or be changed in the future.

Returns Generation of the connection (for non-monitoring connections) that created this socket.

Returns:

  • (Integer)

    Generation of the connection (for non-monitoring connections) that created this socket.

Since:

  • 2.0.0



100
101
102
# File 'lib/mongo/socket.rb', line 100

def connection_generation
  options[:connection_generation]
end

#eof?Boolean

This method is part of a private API. You should avoid using this method if possible, as it may be removed or be changed in the future.

Tests if this socket has reached EOF. Primarily used for liveness checks.

Returns:

  • (Boolean)

Since:

  • 2.0.5



259
260
261
262
263
# File 'lib/mongo/socket.rb', line 259

def eof?
  @socket.eof?
rescue IOError, SystemCallError
  true
end

#gets(*args) ⇒ Object

This method is part of a private API. You should avoid using this method if possible, as it may be removed or be changed in the future.

Delegates gets to the underlying socket.

Examples:

Get the next line.

socket.gets(10)

Parameters:

  • args (Array<Object>)

    The arguments to pass through.

Returns:

  • (Object)

    The returned bytes.

Since:

  • 2.0.0



192
193
194
195
196
# File 'lib/mongo/socket.rb', line 192

def gets(*args)
  map_exceptions do
    @socket.gets(*args)
  end
end

#monitor?true | false

This method is part of a private API. You should avoid using this method if possible, as it may be removed or be changed in the future.

Returns Whether this socket was created by a monitoring connection.

Returns:

  • (true | false)

    Whether this socket was created by a monitoring connection.

Since:

  • 2.0.0



108
109
110
# File 'lib/mongo/socket.rb', line 108

def monitor?
  !!options[:monitor]
end

#pipeIO

This method is part of a private API. You should avoid using this method if possible, as it may be removed or be changed in the future.

listen on during the select system call when reading from the socket.

Returns:

  • (IO)

    The file descriptor for the read end of the pipe to

Since:

  • 2.0.0



115
116
117
# File 'lib/mongo/socket.rb', line 115

def pipe
  options[:pipe]
end

#read(length, socket_timeout: nil, timeout: nil) ⇒ Object

This method is part of a private API. You should avoid using this method if possible, as it may be removed or be changed in the future.

Will read all data from the socket for the provided number of bytes. If no data is returned, an exception will be raised.

Examples:

Read all the requested data from the socket.

socket.read(4096)

Parameters:

  • length (Integer)

    The number of bytes to read.

  • socket_timeout (Numeric) (defaults to: nil)

    The timeout to use for each chunk read, mutually exclusive to timeout.

  • timeout (Numeric) (defaults to: nil)

    The total timeout to the whole read operation, mutually exclusive to socket_timeout.

Returns:

  • (Object)

    The data from the socket.

Raises:

  • (Mongo::SocketError)

    If not all data is returned.

Since:

  • 2.0.0



215
216
217
218
219
220
221
222
223
224
# File 'lib/mongo/socket.rb', line 215

def read(length, socket_timeout: nil, timeout: nil)
  if !socket_timeout.nil? && !timeout.nil?
    raise ArgumentError, 'Both timeout and socket_timeout cannot be set'
  end
  if !socket_timeout.nil? || timeout.nil?
    read_without_timeout(length, socket_timeout)
  else
    read_with_timeout(length, timeout)
  end
end

#readbyteObject

This method is part of a private API. You should avoid using this method if possible, as it may be removed or be changed in the future.

Read a single byte from the socket.

Examples:

Read a single byte.

socket.readbyte

Returns:

  • (Object)

    The read byte.

Since:

  • 2.0.0



234
235
236
237
238
# File 'lib/mongo/socket.rb', line 234

def readbyte
  map_exceptions do
    @socket.readbyte
  end
end

#summaryString

This method is part of a private API. You should avoid using this method if possible, as it may be removed or be changed in the future.

Returns Human-readable summary of the socket for debugging.

Returns:

  • (String)

    Human-readable summary of the socket for debugging.

Since:

  • 2.0.0



122
123
124
125
126
127
128
129
130
131
132
133
134
# File 'lib/mongo/socket.rb', line 122

def summary
  fileno = @socket&.fileno rescue '<no socket>' || '<no socket>'
  if monitor?
    indicator = if options[:push]
      'pm'
    else
      'm'
    end
    "#{connection_address};#{indicator};fd=#{fileno}"
  else
    "#{connection_address};c:#{connection_generation};fd=#{fileno}"
  end
end

#write(*args, timeout: nil) ⇒ Integer

This method is part of a private API. You should avoid using this method if possible, as it may be removed or be changed in the future.

Writes data to the socket instance.

Parameters:

  • args (Array<Object>)

    The data to be written.

  • timeout (Numeric) (defaults to: nil)

    The total timeout to the whole write operation.

Returns:

  • (Integer)

    The length of bytes written to the socket.

Raises:

Since:

  • 2.0.0



250
251
252
253
254
# File 'lib/mongo/socket.rb', line 250

def write(*args, timeout: nil)
  map_exceptions do
    do_write(*args, timeout: timeout)
  end
end