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