lib/yarn/server.rb in yarn-0.0.9 vs lib/yarn/server.rb in yarn-0.1.0

- old
+ new

@@ -2,10 +2,20 @@ module Yarn class Server include Logging + include Socket::Constants + + # TCP optimizations + TCP_OPTS = [ + # delays accepting connections until clients send data + [Socket::SOL_TCP, TCP_DEFER_ACCEPT, 1], + # send ACK flags in their own packets (faster) + [Socket::SOL_TCP, TCP_QUICKACK, 1], + # set maximum number of + ] attr_accessor :host, :port, :socket, :workers def initialize(options={}) # merge given options with default values @@ -39,34 +49,43 @@ end def start trap("INT") { stop } @socket = TCPServer.new(@host, @port) + @socket.listen(1024) + ::BasicSocket.do_not_reverse_lookup=true log "Yarn started #{@num_workers} workers and is listening on #{@host}:#{@port}" init_workers # Waits here for all processes to exit Process.waitall end + def configure_socket + TCP_OPTS.each { |opt| @session.setsockopt(*opt) } + end + def init_workers - @num_workers.times do - @workers << fork_worker - end + @num_workers.times { @workers << fork_worker } end def fork_worker fork { worker } end def worker trap("INT") { exit } + handler = get_handler loop do - @handler ||= @app ? RackHandler.new(@app,@opts) : RequestHandler.new - session = @socket.accept - @handler.run session + @session = @socket.accept + configure_socket + handler.run @session end + end + + def get_handler + @app ? RackHandler.new(@app,@opts) : RequestHandler.new end def stop @socket.close if (@socket && !@socket.closed?)