diff options
author | Eric Wong <normalperson@yhbt.net> | 2013-10-19 22:38:06 +0000 |
---|---|---|
committer | Eric Wong <normalperson@yhbt.net> | 2013-10-19 22:38:06 +0000 |
commit | 0bf908cfdcde0731924f1ed6a11c094db8688551 (patch) | |
tree | 5692928edeb93e5b4aadf35caf8e0dc8023e5002 | |
parent | d973de0d6dfdf799e111d9f9a71170b61a0ac100 (diff) | |
download | yahns-0bf908cfdcde0731924f1ed6a11c094db8688551.tar.gz |
Just forgot to trap USR1 in workers. While we're at it, add tests.
-rw-r--r-- | lib/yahns/server_mp.rb | 2 | ||||
-rw-r--r-- | test/test_reopen_logs.rb | 59 |
2 files changed, 60 insertions, 1 deletions
diff --git a/lib/yahns/server_mp.rb b/lib/yahns/server_mp.rb index c75a3c9..ab0559d 100644 --- a/lib/yahns/server_mp.rb +++ b/lib/yahns/server_mp.rb @@ -150,7 +150,7 @@ module Yahns::ServerMP # :nodoc: def fdmap_init_mp fdmap = fdmap_init # builds apps (if not preloading) - EXIT_SIGS.each { |sig| trap(sig) { sqwakeup(sig) } } + [:USR1, *EXIT_SIGS].each { |sig| trap(sig) { sqwakeup(sig) } } @config.postfork_cleanup # reduce live objects fdmap end diff --git a/test/test_reopen_logs.rb b/test/test_reopen_logs.rb new file mode 100644 index 0000000..a5aeca7 --- /dev/null +++ b/test/test_reopen_logs.rb @@ -0,0 +1,59 @@ +# Copyright (C) 2013, Eric Wong <normalperson@yhbt.net> and all contributors +# License: GPLv3 or later (https://www.gnu.org/licenses/gpl-3.0.txt) +require_relative 'server_helper' +require 'rack/commonlogger' + +class TestReopenLogs < Testcase + parallelize_me! + include ServerHelper + alias setup server_helper_setup + alias teardown server_helper_teardown + + def test_reopen_logs_noworker; reopen(false); end + def test_reopen_logs_worker; reopen(true); end + + def reopen(worker) + err = @err + out = tmpfile(%w(log .out)) + opath = out.path + cfg = Yahns::Config.new + host, port = @srv.addr[3], @srv.addr[1] + cfg.instance_eval do + stderr_path err.path + stdout_path opath + GTL.synchronize do + app = Rack::Builder.new do + use Rack::CommonLogger, $stdout + use Rack::ContentLength + use Rack::ContentType, "text/plain" + run lambda { |_| [ 200, {}, [ "#$$" ] ] } + end + app(:rack, app.to_app) { listen "#{host}:#{port}" } + end + worker_processes 1 if worker + end + pid = fork do + ENV["YAHNS_FD"] = @srv.fileno.to_s + Yahns::Server.new(cfg).start.join + end + Net::HTTP.start(host, port) do |http| + res = http.request(Net::HTTP::Get.new("/aaa")) + assert_equal 200, res.code.to_i + orig = res.body + Timeout.timeout(10) { Thread.pass until File.read(opath) =~ /aaa/ } + File.unlink(opath) + Process.kill(:USR1, pid) + Timeout.timeout(10) { sleep(0.01) until File.exist?(opath) } + + res = http.request(Net::HTTP::Get.new("/bbb")) + assert_equal 200, res.code.to_i + assert_equal orig, res.body + Timeout.timeout(10) { Thread.pass until File.read(opath) =~ /bbb/ } + end + rescue => e + Yahns::Log.exception(Logger.new($stderr), "test", e) + raise + ensure + quit_wait(pid) + end +end |