aboutsummaryrefslogtreecommitdiffstats
path: root/railties/dispatches
diff options
context:
space:
mode:
authorJamis Buck <jamis@37signals.com>2005-06-29 11:07:20 +0000
committerJamis Buck <jamis@37signals.com>2005-06-29 11:07:20 +0000
commit3cc47a4297d9c43e88972555e853e2d5359d804f (patch)
treee020dbfe531b90316377664ef6bfeca8f3976f73 /railties/dispatches
parent8335fc610c7f2f5bc1d4b0e01370013bfccdba81 (diff)
downloadrails-3cc47a4297d9c43e88972555e853e2d5359d804f.tar.gz
rails-3cc47a4297d9c43e88972555e853e2d5359d804f.tar.bz2
rails-3cc47a4297d9c43e88972555e853e2d5359d804f.zip
Use SIGHUP to dynamically reload an fcgi process without restarting it. Refactored dispatch.fcgi so that the RailsFCGIHandler is in the lib dir.
git-svn-id: http://svn-commit.rubyonrails.org/rails/trunk@1565 5ecf4fe2-1ee6-0310-87b1-e25e094e27de
Diffstat (limited to 'railties/dispatches')
-rwxr-xr-xrailties/dispatches/dispatch.fcgi98
1 files changed, 3 insertions, 95 deletions
diff --git a/railties/dispatches/dispatch.fcgi b/railties/dispatches/dispatch.fcgi
index 684f04db86..5164669f2e 100755
--- a/railties/dispatches/dispatch.fcgi
+++ b/railties/dispatches/dispatch.fcgi
@@ -1,98 +1,6 @@
#!/usr/local/bin/ruby
-# to allow unit testing
-if !defined?(RAILS_ROOT)
- require File.dirname(__FILE__) + "/../config/environment"
-end
+require File.dirname(__FILE__) + "/../config/environment"
+require 'fcgi_handler'
-require 'dispatcher'
-require 'fcgi'
-require 'logger'
-
-class RailsFCGIHandler
- attr_reader :please_exit_at_your_earliest_convenience
- attr_reader :i_am_currently_processing_a_request
-
- def initialize(log_file_path = "#{RAILS_ROOT}/log/fastcgi.crash.log")
- @please_exit_at_your_earliest_convenience = false
- @i_am_currently_processing_a_request = false
-
- trap_handler = method(:trap_handler).to_proc
- trap("HUP", trap_handler)
- trap("USR1", trap_handler)
-
- # initialize to 11 seconds from now to minimize special cases
- @last_error_on = Time.now - 11
-
- @log_file_path = log_file_path
- dispatcher_log(:info, "fcgi #{$$} starting")
- end
-
- def process!
- FCGI.each_cgi do |cgi|
- process_request(cgi)
- break if please_exit_at_your_earliest_convenience
- end
-
- dispatcher_log(:info, "fcgi #{$$} terminated gracefully")
-
- rescue SystemExit => exit_error
- dispatcher_log(:info, "fcgi #{$$} terminated by explicit exit")
-
- rescue Object => fcgi_error
- # retry on errors that would otherwise have terminated the FCGI process,
- # but only if they occur more than 10 seconds apart.
- if !(SignalException === fcgi_error) && Time.now - @last_error_on > 10
- @last_error_on = Time.now
- dispatcher_error(fcgi_error,
- "FCGI process #{$$} almost killed by this error\n")
- retry
- else
- dispatcher_error(fcgi_error, "FCGI process #{$$} killed by this error\n")
- end
- end
-
- private
- def logger
- @logger ||= Logger.new(@log_file_path)
- end
-
- def dispatcher_log(level, msg)
- logger.send(level, msg)
- rescue Object => log_error
- STDERR << "Couldn't write to #{@log_file_path.inspect}: #{msg}\n"
- STDERR << " #{log_error.class}: #{log_error.message}\n"
- end
-
- def dispatcher_error(e,msg="")
- error_message =
- "[#{Time.now}] Dispatcher failed to catch: #{e} (#{e.class})\n" +
- " #{e.backtrace.join("\n ")}\n#{msg}"
- dispatcher_log(:error, error_message)
- end
-
- def trap_handler(signal)
- if i_am_currently_processing_a_request
- dispatcher_log(:info, "asking #{$$} to terminate ASAP")
- @please_exit_at_your_earliest_convenience = true
- else
- dispatcher_log(:info, "telling #{$$} to terminate NOW")
- exit
- end
- end
-
- def process_request(cgi)
- @i_am_currently_processing_a_request = true
- Dispatcher.dispatch(cgi)
- rescue Object => e
- raise if SignalException === e
- dispatcher_error(e)
- ensure
- @i_am_currently_processing_a_request = false
- end
-end
-
-if __FILE__ == $0
- handler = RailsFCGIHandler.new
- handler.process!
-end
+RailsFCGIHandler.process!