[Groonga-commit] droonga/fluent-plugin-droonga at 30edf92 [master] Fix dump_uncaught_error in the SignalThread on stop

Back to archive index

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 



More information about the Groonga-commit mailing list
Back to archive index