Permalink
Browse files

Make fcgi handler respond to TERM signals with an explicit exit

git-svn-id: http://svn-commit.rubyonrails.org/rails/trunk@2847 5ecf4fe2-1ee6-0310-87b1-e25e094e27de
  • Loading branch information...
1 parent a52132a commit 49cd52a93febcef28a5ae2ed5427294ec5159548 @jamis jamis committed Nov 2, 2005
Showing with 24 additions and 2 deletions.
  1. +2 −0 railties/CHANGELOG
  2. +6 −1 railties/lib/fcgi_handler.rb
  3. +16 −1 railties/test/fcgi_dispatcher_test.rb
View
@@ -1,5 +1,7 @@
*SVN*
+* Make fcgi handler respond to TERM signals with an explicit exit [Jamis Buck]
+
* Added demonstration of fixture use to the test case generated by the model generator [DHH]
* If specified, pass PostgreSQL client character encoding to createdb. #2703 [Kazuhiko <kazuhiko@fdiary.net>]
@@ -6,7 +6,7 @@
class RailsFCGIHandler
SIGNALS = {
'HUP' => :reload,
- 'TERM' => :exit,
+ 'TERM' => :exit_now,
'USR1' => :exit,
'USR2' => :restart
}
@@ -117,6 +117,11 @@ def install_signal_handler(signal, handler)
dispatcher_log :warn, "Ignoring unsupported signal #{signal}."
end
+ def exit_now_handler(signal)
+ dispatcher_log :info, "asked to terminate immediately"
+ exit
+ end
+
def exit_handler(signal)
dispatcher_log :info, "asked to terminate ASAP"
@when_ready = :exit
@@ -30,6 +30,10 @@ def send_signal(which)
def restore!
@reloaded = true
end
+
+ def reload!
+ @reloaded = true
+ end
alias_method :old_run_gc!, :run_gc!
def run_gc!
@@ -62,7 +66,7 @@ def test_interrupted_via_HUP_when_not_in_request
@handler.send_signal("HUP")
@handler.thread.join
assert_nil @handler.exit_code
- assert_nil @handler.when_ready
+ assert_equal :reload, @handler.when_ready
assert @handler.reloaded
end
@@ -74,6 +78,7 @@ def test_interrupted_via_HUP_when_in_request
@handler.thread.join
assert_nil @handler.exit_code
assert_equal :reload, @handler.when_ready
+ assert @handler.reloaded
end
def test_interrupted_via_USR1_when_not_in_request
@@ -95,6 +100,16 @@ def test_interrupted_via_USR1_when_in_request
assert_nil @handler.exit_code
assert_equal :exit, @handler.when_ready
end
+
+ def test_interrupted_via_TERM
+ Dispatcher.time_to_sleep = 1
+ @handler.thread = Thread.new { @handler.process! }
+ sleep 0.1 # let the thread get started
+ @handler.send_signal("TERM")
+ @handler.thread.join
+ assert_equal 0, @handler.exit_code
+ assert_nil @handler.when_ready
+ end
%w(RuntimeError SignalException).each do |exception|
define_method("test_#{exception}_in_fcgi") do

0 comments on commit 49cd52a

Please sign in to comment.