Changeset 5485
- Timestamp:
- 11/11/06 08:08:53 (2 years ago)
- Files:
-
- trunk/railties/CHANGELOG (modified) (1 diff)
- trunk/railties/lib/fcgi_handler.rb (modified) (10 diffs)
Legend:
- Unmodified
- Added
- Removed
- Modified
- Copied
- Moved
trunk/railties/CHANGELOG
r5471 r5485 1 1 *SVN* 2 3 * Only wrap request processing with our USR1 signal handler so FastCGI can trap it and raise an exception while waiting for connections. Idle processes exit immediately rather than waiting for another request; active processes gracefully exit when the request is finished. [Jeremy Kemper] 2 4 3 5 * Alter prior change to use require_dependency instead of require_or_load. Causes ApplicationController to be reloaded again. Closes #6587. [Nicholas Seckar] trunk/railties/lib/fcgi_handler.rb
r4913 r5485 7 7 SIGNALS = { 8 8 'HUP' => :reload, 9 'INT' => :exit_now, 9 10 'TERM' => :exit_now, 10 11 'USR1' => :exit, … … 12 13 'SIGTRAP' => :breakpoint 13 14 } 15 GLOBAL_SIGNALS = SIGNALS.keys - %w(USR1) 14 16 15 17 attr_reader :when_ready … … 93 95 94 96 def install_signal_handlers 95 SIGNALS.each do |signal, handler_name| 96 install_signal_handler(signal, method("#{handler_name}_handler").to_proc) 97 end 98 end 99 100 def install_signal_handler(signal, handler) 97 GLOBAL_SIGNALS.each { |signal| install_signal_handler(signal) } 98 end 99 100 def install_signal_handler(signal, handler = nil) 101 handler ||= method("#{SIGNALS[signal]}_handler").to_proc 101 102 trap(signal, handler) 102 103 rescue ArgumentError … … 104 105 end 105 106 107 def with_signal_handler(signal) 108 install_signal_handler(signal) 109 yield 110 ensure 111 install_signal_handler(signal, 'DEFAULT') 112 end 113 106 114 def exit_now_handler(signal) 107 115 dispatcher_log :info, "asked to terminate immediately" … … 128 136 @when_ready = :breakpoint 129 137 end 130 138 131 139 def process_each_request!(provider) 132 provider.each_cgi do |cgi| 133 process_request(cgi) 140 cgi = nil 141 provider.each_cgi do |cgi| 142 with_signal_handler 'USR1' do 143 process_request(cgi) 144 end 134 145 135 146 case when_ready … … 149 160 gc_countdown 150 161 end 162 rescue SignalException => signal 163 raise unless signal.message == 'SIGUSR1' 164 close_connection(cgi) if cgi 151 165 end 152 166 … … 162 176 ruby = File::join(config['bindir'], config['ruby_install_name']) + config['EXEEXT'] 163 177 command_line = [ruby, $0, ARGV].flatten.join(' ') 164 178 165 179 dispatcher_log :info, "restarted" 166 180 … … 184 198 ActionController::Routing::Routes.reload 185 199 end 186 200 187 201 def breakpoint! 188 202 require 'breakpoint' … … 198 212 GC.enable; GC.start; GC.disable 199 213 end 200 214 201 215 def gc_countdown 202 216 if gc_request_period … … 205 219 end 206 220 end 207 221 208 222 def close_connection(cgi) 209 223 cgi.instance_variable_get("@request").finish