Kouhei Sutou
null+****@clear*****
Wed Oct 16 12:25:52 JST 2013
Kouhei Sutou 2013-10-16 12:25:52 +0900 (Wed, 16 Oct 2013) New Revision: 30edf92ec93f1d85d7e50826dce195970e5d6a93 https://github.com/droonga/fluent-plugin-droonga/commit/30edf92ec93f1d85d7e50826dce195970e5d6a93 Message: Fix dump_uncaught_error in the SignalThread on stop GitHub: fixes #12 It works well when you send SIGTERM signal to only fluentd master process. If you send SIGTERM signal to all fluentd processes (including worker processes), it may not work well. In the case, you need to send SIGTERM signal to all fluentd processes N-times until fluetnd is finished. Modified files: lib/droonga/server.rb Modified: lib/droonga/server.rb (+43 -11) =================================================================== --- lib/droonga/server.rb 2013-10-16 11:40:40 +0900 (b1fb359) +++ lib/droonga/server.rb 2013-10-16 12:25:52 +0900 (2777f04) @@ -38,17 +38,7 @@ module Droonga def stop(stop_graceful) $log.trace("#{log_tag}: stop: start") - - $log.trace("#{log_tag}: stop: queue: unblock: start") - 3.times do |i| - $log.trace("#{log_tag}: stop: queue: unblock: #{i}: start") - super(stop_graceful) - @queue.unblock - sleep(i ** 2 * 0.1) - $log.trace("#{log_tag}: stop: queue: unblock: #{i}: done") - end - $log.trace("#{log_tag}: stop: queue: unblock: done") - + super(stop_graceful) $log.trace("#{log_tag}: stop: done") end @@ -56,5 +46,47 @@ module Droonga def log_tag "[#{Process.ppid}][#{Process.pid}] server" end + + def start_worker(wid) + worker = super(wid) + worker.extend(WorkerStopper) + worker.queue = @queue + worker + end + + module WorkerStopper + attr_writer :queue + + def send_stop(stop_graceful) + $log.trace("#{log_tag}: stop: start") + + $log.trace("#{log_tag}: stop: queue: unblock: start") + max_n_retries = 10 + max_n_retries.times do |i| + $log.trace("#{log_tag}: stop: queue: unblock: #{i}: start") + super(stop_graceful) + @queue.unblock + alive_p = alive? + $log.trace("#{log_tag}: stop: queue: unblock: #{i}: done: #{alive_p}") + break unless alive_p + sleep(i * 0.1) + end + $log.trace("#{log_tag}: stop: queue: unblock: done") + + $log.trace("#{log_tag}: stop: done") + end + + def send_reload + $log.trace("#{log_tag}: reload: start") + super + @queue.unblock + $log.trace("#{log_tag}: reload: done") + end + + private + def log_tag + "[#{Process.ppid}][#{Process.pid}][#{@wid}] server: worker-stopper" + end + end end end -------------- next part -------------- HTML����������������������������...Download