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?)