about summary refs log tree commit homepage
diff options
context:
space:
mode:
authorEric Wong <normalperson@yhbt.net>2013-10-19 22:38:06 +0000
committerEric Wong <normalperson@yhbt.net>2013-10-19 22:38:06 +0000
commit0bf908cfdcde0731924f1ed6a11c094db8688551 (patch)
tree5692928edeb93e5b4aadf35caf8e0dc8023e5002
parentd973de0d6dfdf799e111d9f9a71170b61a0ac100 (diff)
downloadyahns-0bf908cfdcde0731924f1ed6a11c094db8688551.tar.gz
Just forgot to trap USR1 in workers.  While we're at it, add tests.
-rw-r--r--lib/yahns/server_mp.rb2
-rw-r--r--test/test_reopen_logs.rb59
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