[Groonga-commit] droonga/droonga-engine at 2c83432 [master] Process stop/restart commands in main loop instead of signal handler context

Back to archive index

Kouhei Sutou null+****@clear*****
Mon Jul 21 19:52:01 JST 2014


Kouhei Sutou	2014-07-21 19:52:01 +0900 (Mon, 21 Jul 2014)

  New Revision: 2c83432c1bf22b27ff7cf1e1441081cd9add9bd5
  https://github.com/droonga/droonga-engine/commit/2c83432c1bf22b27ff7cf1e1441081cd9add9bd5

  Message:
    Process stop/restart commands in main loop instead of signal handler context
    
    It is safe.

  Modified files:
    lib/droonga/command/droonga_engine.rb

  Modified: lib/droonga/command/droonga_engine.rb (+55 -11)
===================================================================
--- lib/droonga/command/droonga_engine.rb    2014-07-21 19:47:20 +0900 (4c33033)
+++ lib/droonga/command/droonga_engine.rb    2014-07-21 19:52:01 +0900 (4284d47)
@@ -252,8 +252,7 @@ module Droonga
           @service_runner = run_service
           setup_initial_on_ready
           @catalog_observer = run_catalog_observer
-          @loop_breaker = Coolio::AsyncWatcher.new
-          @loop.attach(@loop_breaker)
+          @command_runner = run_command_runner
 
           trap_signals
           @loop.run
@@ -274,22 +273,22 @@ module Droonga
 
         def trap_signals
           trap(:TERM) do
-            stop_gracefully
+            @command_runner.push_command(:stop_gracefully)
             trap(:TERM, "DEFAULT")
           end
           trap(:INT) do
-            stop_immediately
+            @command_runner.push_command(:stop_immediately)
             trap(:INT, "DEFAULT")
           end
           trap(:QUIT) do
-            stop_immediately
+            @command_runner.push_cmmand(:stop_immediately)
             trap(:QUIT, "DEFAULT")
           end
           trap(:USR1) do
-            restart_graceful
+            @command_runner.push_command(:restart_graceful)
           end
           trap(:HUP) do
-            restart_immediately
+            @command_runner.push_command(:restart_immediately)
           end
           trap(:USR2) do
             Sigdump.dump
@@ -297,8 +296,7 @@ module Droonga
         end
 
         def stop_gracefully
-          @loop_breaker.signal
-          @loop_breaker.detach
+          @command_runner.stop
           @serf.stop
           @serf_status_observer.stop
           @catalog_observer.stop
@@ -306,8 +304,7 @@ module Droonga
         end
 
         def stop_immediately
-          @loop_breaker.signal
-          @loop_breaker.detach
+          @command_runner.stop
           @serf.stop
           @serf_status_observer.stop
           @catalog_observer.stop
@@ -369,6 +366,15 @@ module Droonga
           catalog_observer.start
           catalog_observer
         end
+
+        def run_command_runner
+          command_runner = CommandRunner.new(@loop)
+          command_runner.on_command = lambda do |command|
+            __send__(command)
+          end
+          command_runner.start
+          command_runner
+        end
       end
 
       class ServiceRunner
@@ -457,6 +463,44 @@ module Droonga
           on_failure unless success?
         end
       end
+
+      class CommandRunner
+        attr_writer :on_command
+        def initialize(loop)
+          @loop = loop
+          @commands = []
+          @on_command = nil
+        end
+
+        def start
+          @async_watcher = Coolio::AsyncWatcher.new
+          on_signal = lambda do
+            commands =****@comma*****
+            @commands.clear
+            until commands.empty?
+              command = commands.shift
+              @on_command.call(command) if @on_command
+            end
+          end
+          @async_watcher.on_signal do
+            on_signal.call
+          end
+          @loop.attach(@async_watcher)
+        end
+
+        def stop
+          return if @async_watcher.nil?
+          @async_watcher.detach
+          @async_watcher = nil
+        end
+
+        def push_command(command)
+          return if @async_watcher.nil?
+          first_command_p =****@comma*****?
+          @commands << command
+          @async_watcher.signal if first_command_p
+        end
+      end
     end
   end
 end
-------------- next part --------------
HTML����������������������������...
Download 



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