Piro / YUKI Hiroshi
null+****@clear*****
Thu Apr 23 02:51:40 JST 2015
Piro / YUKI Hiroshi 2015-04-23 02:51:40 +0900 (Thu, 23 Apr 2015) New Revision: d71071eee223fd4792c03ae702517ec416b12373 https://github.com/droonga/droonga-engine/commit/d71071eee223fd4792c03ae702517ec416b12373 Message: Refresh new service's internal senders before finishing of graceful restart. While graceful restart, connection to "(myself):(10031 or something)/(tag)" are established by the old (going to be dying) service. However, after the new service becomes ready, the graceful stop of the old service can be blocked by living connections from the new service itself. So, before starting graceful stop, we must close all self-reference connections from the new. Modified files: lib/droonga/command/droonga_engine.rb lib/droonga/command/droonga_engine_service.rb lib/droonga/engine.rb lib/droonga/forwarder.rb lib/droonga/process_control_protocol.rb lib/droonga/process_supervisor.rb lib/droonga/worker_process_agent.rb Modified: lib/droonga/command/droonga_engine.rb (+5 -0) =================================================================== --- lib/droonga/command/droonga_engine.rb 2015-04-23 02:33:14 +0900 (05debd4) +++ lib/droonga/command/droonga_engine.rb 2015-04-23 02:51:40 +0900 (4ab4c4d) @@ -528,6 +528,7 @@ module Droonga @service_runner.on_ready = lambda do logger.info("restart_graceful: new service runner is ready") @service_runner.on_failure = nil + @service_runner.refresh_self_reference old_service_runner.stop_gracefully @restarting = false logger.trace("restart_graceful: done") @@ -720,6 +721,10 @@ module Droonga @success end + def refresh_self_reference + @supervisor.refresh_self_reference + end + private def create_process_supervisor(input, output) supervisor = ProcessSupervisor.new(@raw_loop, input, output) Modified: lib/droonga/command/droonga_engine_service.rb (+8 -4) =================================================================== --- lib/droonga/command/droonga_engine_service.rb 2015-04-23 02:33:14 +0900 (6b643c3) +++ lib/droonga/command/droonga_engine_service.rb 2015-04-23 02:51:40 +0900 (9a28694) @@ -171,6 +171,9 @@ module Droonga @worker_process_agent.on_stop_immediately = lambda do stop_immediately end + @worker_process_agent.on_refresh_self_reference = lambda do + @engine.refresh_self_reference + end @worker_process_agent.start end @@ -221,10 +224,11 @@ module Droonga @stopping = true @receiver.stop_gracefully #XXX To disconnect all clients to myself (old service), - # we must refresh all connections via EngineNode. - @engine.cluster.refresh_connection_for(@engine_name) - #XXX However, internal connections via Forwarder can be - # still there. Then we have to wait for their timeout. + # we must refresh the connection via EngineNode + # and Forwarder. + # However, connections from workers can be still + # there. Then we have to wait for their timeout. + @engine.refresh_self_reference @receiver.ensure_no_client do logger.trace("stop_gracefully: ready to stop service") @engine.stop_gracefully do Modified: lib/droonga/engine.rb (+5 -0) =================================================================== --- lib/droonga/engine.rb 2015-04-23 02:33:14 +0900 (2e32c17) +++ lib/droonga/engine.rb 2015-04-23 02:51:40 +0900 (1b8df34) @@ -100,6 +100,11 @@ module Droonga logger.trace("stop_immediately: done") end + def refresh_self_reference + @cluster.refresh_connection_for(@name) + @state.forwarder.refresh_connection_for(@name) + end + def process(message) @last_processed_message_timestamp = message["date"] @dispatcher.process_message(message) Modified: lib/droonga/forwarder.rb (+8 -0) =================================================================== --- lib/droonga/forwarder.rb 2015-04-23 02:33:14 +0900 (c22e3c2) +++ lib/droonga/forwarder.rb 2015-04-23 02:51:40 +0900 (f06d349) @@ -66,6 +66,14 @@ module Droonga logger.trace("forward: done") end + def refresh_connection_for(name) + sender = @senders[name] + if sender + sender.shutdown + @senders.delete(name) + end + end + private def output(receiver, message, command, arguments, options={}) logger.trace("output: start") Modified: lib/droonga/process_control_protocol.rb (+2 -1) =================================================================== --- lib/droonga/process_control_protocol.rb 2015-04-23 02:33:14 +0900 (b579780) +++ lib/droonga/process_control_protocol.rb 2015-04-23 02:51:40 +0900 (210cdaa) @@ -1,4 +1,4 @@ -# Copyright (C) 2014 Droonga Project +# Copyright (C) 2014-2015 Droonga Project # # This library is free software; you can redistribute it and/or # modify it under the terms of the GNU Lesser General Public @@ -18,6 +18,7 @@ module Droonga module Messages STOP_GRACEFUL = "stop-graceful\n" STOP_IMMEDIATELY = "stop-immediately\n" + REFRESH_SELF_REFERENCE = "refresh-self-reference\n" READY = "ready\n" FINISH = "finish\n" Modified: lib/droonga/process_supervisor.rb (+6 -0) =================================================================== --- lib/droonga/process_supervisor.rb 2015-04-23 02:33:14 +0900 (6015069) +++ lib/droonga/process_supervisor.rb 2015-04-23 02:51:40 +0900 (bf64736) @@ -64,6 +64,12 @@ module Droonga logger.trace("stop_immediately: done") end + def refresh_self_reference + logger.trace("refresh_self_reference: start") + @output.write(Messages::REFRESH_SELF_REFERENCE) + logger.trace("refresh_self_reference: done") + end + private def create_input(raw_input) input = Coolio::IO.new(raw_input) Modified: lib/droonga/worker_process_agent.rb (+10 -0) =================================================================== --- lib/droonga/worker_process_agent.rb 2015-04-23 02:33:14 +0900 (403d6a2) +++ lib/droonga/worker_process_agent.rb 2015-04-23 02:51:40 +0900 (8f6c29b) @@ -73,6 +73,10 @@ module Droonga @on_stop_immediately = callback end + def on_refresh_self_reference=(callback) + @on_refresh_self_reference = callback + end + private def create_input(raw_input) @input = Coolio::IO.new(raw_input) @@ -85,6 +89,8 @@ module Droonga on_stop_gracefully when Messages::STOP_IMMEDIATELY on_stop_immediately + when Messages::REFRESH_SELF_REFERENCE + on_refresh_self_reference end end end @@ -123,6 +129,10 @@ module Droonga @on_stop_immediately.call if @on_stop_immediately end + def on_refresh_self_reference + @on_refresh_self_reference.call if @on_refresh_self_reference + end + def log_tag "worker_process_agent" end -------------- next part -------------- HTML����������������������������...Download