[Groonga-commit] droonga/droonga-engine at d71071e [master] Refresh new service's internal senders before finishing of graceful restart.

Back to archive index

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 



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