about summary refs log tree commit homepage
diff options
context:
space:
mode:
authorzedshaw <zedshaw@19e92222-5c0b-0410-8929-a290d50e31e9>2006-04-05 12:29:23 +0000
committerzedshaw <zedshaw@19e92222-5c0b-0410-8929-a290d50e31e9>2006-04-05 12:29:23 +0000
commitc607d8cdbc179adc730d83de98f57233470d39d6 (patch)
tree9b9c08ce3232e25c42130f984edc41052f3bce45
parent41ed417517e62f51b0d89946cb7a3642871bccc0 (diff)
downloadunicorn-c607d8cdbc179adc730d83de98f57233470d39d6.tar.gz
git-svn-id: svn+ssh://rubyforge.org/var/svn/mongrel/trunk@147 19e92222-5c0b-0410-8929-a290d50e31e9
-rw-r--r--bin/mongrel_rails1
-rw-r--r--lib/mongrel.rb19
-rw-r--r--lib/mongrel/debug.rb26
3 files changed, 40 insertions, 6 deletions
diff --git a/bin/mongrel_rails b/bin/mongrel_rails
index 9d562b0..6f2635b 100644
--- a/bin/mongrel_rails
+++ b/bin/mongrel_rails
@@ -1,6 +1,7 @@
 
 require 'rubygems'
 require 'yaml'
+require 'mongrel'
 require 'mongrel/rails'
 
 
diff --git a/lib/mongrel.rb b/lib/mongrel.rb
index c2995e3..47b3b27 100644
--- a/lib/mongrel.rb
+++ b/lib/mongrel.rb
@@ -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
diff --git a/lib/mongrel/debug.rb b/lib/mongrel/debug.rb
index 9e9a811..840182f 100644
--- a/lib/mongrel/debug.rb
+++ b/lib/mongrel/debug.rb
@@ -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
 }