Class: Varnish::SocketFactory
- Inherits:
-
Object
- Object
- Varnish::SocketFactory
- Defined in:
- lib/varnish/socket_factory.rb
Overview
Wrapper around Ruby’s Socket.
Uses Mike Perhams superior (in both reliability and performance) connection technique with proper timeouts: See: github.com/mperham/memcache-client
Class Method Summary collapse
Class Method Details
.tcp_socket(host, port, timeout = nil) ⇒ Object
28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 |
# File 'lib/varnish/socket_factory.rb', line 28 def self.tcp_socket(host, port, timeout = nil) addr = Socket.getaddrinfo(host, nil) sock = Socket.new(Socket.const_get(addr[0][0]), Socket::SOCK_STREAM, 0) if timeout secs = Integer(timeout) usecs = Integer((timeout - secs) * 1_000_000) optval = [secs, usecs].pack("l_2") sock.setsockopt Socket::SOL_SOCKET, Socket::SO_RCVTIMEO, optval sock.setsockopt Socket::SOL_SOCKET, Socket::SO_SNDTIMEO, optval # Socket timeouts don't work for more complex IO operations # like gets which lay on top of read. We need to fall back to # the standard Timeout mechanism. sock.instance_eval <<-EOR alias :blocking_gets :gets def gets Timer.timeout(#{timeout}) do self.blocking_gets end end EOR end sock.connect(Socket.pack_sockaddr_in(port, addr[0][3])) sock.setsockopt(Socket::IPPROTO_TCP, Socket::TCP_NODELAY, 1) sock end |