class GELF::Transport::TCP

Attributes

addresses[R]

Public Class Methods

new(addresses) click to toggle source

`addresses` Array of [host, port] pairs

# File lib/gelf/transport/tcp.rb, line 7
def initialize(addresses)
  @sockets = []
  self.addresses = addresses
end

Public Instance Methods

addresses=(addresses) click to toggle source
# File lib/gelf/transport/tcp.rb, line 12
def addresses=(addresses)
  @addresses = addresses.dup.freeze.tap do |addrs|
    @sockets.each(&:close)
    @sockets = addrs.map { |peer| connect(*peer) }
  end
end
send(message) click to toggle source
# File lib/gelf/transport/tcp.rb, line 19
def send(message)
  return if @addresses.empty?
  loop do
    connected = @sockets.reject(&:closed?)
    reconnect_all if connected.empty?
    break if write_any(connected, message)
  end
end

Private Instance Methods

connect(host, port) click to toggle source
# File lib/gelf/transport/tcp.rb, line 30
def connect(host, port)
  socket_class.new(host, port)
end
reconnect_all() click to toggle source
# File lib/gelf/transport/tcp.rb, line 34
def reconnect_all
  @sockets = @sockets.each_with_index.map do |old_socket, index|
    old_socket.closed? ? connect(*@addresses[index]) : old_socket
  end
end
socket_class() click to toggle source
# File lib/gelf/transport/tcp.rb, line 40
def socket_class
  if defined?(Celluloid::IO::TCPSocket)
    Celluloid::IO::TCPSocket
  else
    ::TCPSocket
  end
end
unsafe_write_socket(socket, message) click to toggle source
# File lib/gelf/transport/tcp.rb, line 62
def unsafe_write_socket(socket, message)
  r,w = IO.select([socket], [socket])
  # Read everything first
  while r.any? do
    # don't expect any reads, but a readable socket might
    # mean the remote end closed, so read it and throw it away.
    # we'll get an EOFError if it happens.
    socket.sysread(16384)
    r = IO.select([socket])
  end

  # Now send the payload
  return false unless w.any?
  return socket.syswrite(message) > 0
end
write_any(sockets, message) click to toggle source
# File lib/gelf/transport/tcp.rb, line 48
def write_any(sockets, message)
  sockets.shuffle.each do |socket|
    return true if write_socket(socket, message)
  end
  false
end
write_socket(socket, message) click to toggle source
# File lib/gelf/transport/tcp.rb, line 55
def write_socket(socket, message)
  unsafe_write_socket(socket, message)
rescue IOError, SystemCallError
  socket.close unless socket.closed?
  false
end