diff options
author | Jamis Buck <jamis@37signals.com> | 2005-06-29 11:07:20 +0000 |
---|---|---|
committer | Jamis Buck <jamis@37signals.com> | 2005-06-29 11:07:20 +0000 |
commit | 3cc47a4297d9c43e88972555e853e2d5359d804f (patch) | |
tree | e020dbfe531b90316377664ef6bfeca8f3976f73 /railties/dispatches | |
parent | 8335fc610c7f2f5bc1d4b0e01370013bfccdba81 (diff) | |
download | rails-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-x | railties/dispatches/dispatch.fcgi | 98 |
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! |