1
0
Fork 0
mirror of https://github.com/puma/puma.git synced 2022-11-09 13:48:40 -05:00

Adds thread tracking and cleaner shutdown.

git-svn-id: svn+ssh://rubyforge.org/var/svn/mongrel/trunk@147 19e92222-5c0b-0410-8929-a290d50e31e9
This commit is contained in:
zedshaw 2006-04-05 12:29:23 +00:00
parent 41ed417517
commit c607d8cdbc
3 changed files with 40 additions and 6 deletions

View file

@ -1,6 +1,7 @@
require 'rubygems'
require 'yaml'
require 'mongrel'
require 'mongrel/rails'

View file

@ -370,6 +370,8 @@ module Mongrel
attr_reader :acceptor
attr_reader :workers
attr_reader :classifier
attr_reader :host
attr_reader :port
# Creates a working server on host:port (strange things happen if port isn't a Number).
# Use HttpServer::run to start the server and HttpServer.acceptor.join to
@ -392,6 +394,7 @@ module Mongrel
@workers = ThreadGroup.new
@timeout = timeout
@num_processors = num_processors
@death_time = 60
end
@ -464,7 +467,9 @@ module Mongrel
def reap_dead_workers(worker_list)
mark = Time.now
worker_list.each do |w|
if mark - w[:started_on] > 10 * @timeout
w[:started_on] = Time.now if not w[:started_on]
if mark - w[:started_on] > @death_time + @timeout
STDERR.puts "Thread #{w.inspect} is too old, killing."
w.raise(StopServer.new("Timed out thread."))
end
@ -482,6 +487,7 @@ module Mongrel
begin
client = @socket.accept
worker_list = @workers.list
if worker_list.length >= @num_processors
STDERR.puts "Server overloaded with #{worker_list.length} processors (#@num_processors max). Dropping connection."
client.close
@ -510,10 +516,15 @@ module Mongrel
# now that processing is done we feed enough false onto the request queue to get
# each processor to exit and stop processing.
# finally we wait until the queue is empty
# finally we wait until the queue is empty (but only about 10 seconds)
@death_time = 10
shutdown_start = Time.now
while @workers.list.length > 0
STDERR.puts "Shutdown waiting for #{@workers.list.length} requests" if @workers.list.length > 0
waited_for = (Time.now - shutdown_start).ceil
STDERR.print "Shutdown waited #{waited_for} for #{@workers.list.length} requests, could take #{@death_time + @timeout} seconds.\r" if @workers.list.length > 0
sleep 1
reap_dead_workers(@workers.list)
end
end
@ -802,11 +813,13 @@ module Mongrel
MongrelDbg.begin_trace :objects
MongrelDbg.begin_trace :rails
MongrelDbg.begin_trace :files
MongrelDbg.begin_trace :threads
uri location, :handler => plugin("/handlers/requestlog::access")
uri location, :handler => plugin("/handlers/requestlog::files")
uri location, :handler => plugin("/handlers/requestlog::objects")
uri location, :handler => plugin("/handlers/requestlog::params")
uri location, :handler => plugin("/handlers/requestlog::threads")
end
# Used to allow you to let users specify their own configurations

View file

@ -148,7 +148,7 @@ module RequestLog
include Mongrel::HttpHandlerPlugin
def process(request, response)
MongrelDbg::trace(:objects, "#{Time.now} OBJECT STATS BEFORE REQUEST #{request.params['PATH_INFO']}")
MongrelDbg::trace(:objects, "#{'-' * 10}\n#{Time.now} OBJECT STATS BEFORE REQUEST #{request.params['PATH_INFO']}")
ObjectTracker.sample
end
@ -164,10 +164,30 @@ module RequestLog
end
end
class Threads < GemPlugin::Plugin "/handlers"
include Mongrel::HttpHandlerPlugin
def process(request, response)
MongrelDbg::trace(:threads, "#{Time.now} REQUEST #{request.params['PATH_INFO']}")
ObjectSpace.each_object do |obj|
if obj.class == Mongrel::HttpServer
worker_list = obj.workers.list
if worker_list.length > 0
keys = "-----\n\tKEYS:"
worker_list.each {|t| keys << "\n\t\t-- #{t}: #{t.keys.inspect}" }
end
MongrelDbg::trace(:threads, "#{obj.host}:#{obj.port} -- THREADS: #{worker_list.length} #{keys}")
end
end
end
end
end
END {
MongrelDbg::trace(:files, "FILES OPEN AT EXIT")
log_open_files
MongrelDbg::trace(:files, "FILES OPEN AT EXIT")
log_open_files
}