[Groonga-commit] droonga/droonga-engine at 414de86 [master] Wait until all existing nodes are restarted, after cluster information is changed

Back to archive index

YUKI Hiroshi null+****@clear*****
Tue Apr 21 18:20:37 JST 2015


YUKI Hiroshi	2015-04-21 18:20:37 +0900 (Tue, 21 Apr 2015)

  New Revision: 414de8685ac333d5e8fdafd7105d4e5ea06dd4f0
  https://github.com/droonga/droonga-engine/commit/414de8685ac333d5e8fdafd7105d4e5ea06dd4f0

  Message:
    Wait until all existing nodes are restarted, after cluster information is changed

  Modified files:
    bin/droonga-engine-join
    lib/droonga/serf.rb

  Modified: bin/droonga-engine-join (+23 -2)
===================================================================
--- bin/droonga-engine-join    2015-04-21 18:05:49 +0900 (f59962c)
+++ bin/droonga-engine-join    2015-04-21 18:20:37 +0900 (aed7ecf)
@@ -169,6 +169,27 @@ module Droonga
       source_catalog.cluster_id
     end
 
+    def all_nodes
+      existing_nodes + [joining_node]
+    end
+
+    def existing_nodes
+      @existing_nodes ||= prepare_existing_nodes
+    end
+
+    def prepare_existing_nodes
+      generator = Catalog::Generator.new
+      generator.load(raw_source_catalog)
+
+      dataset = generator.dataset_for_host(source_node.host)
+      other_hosts = dataset.replicas.hosts
+      other_hosts.collect do |host|
+        NodeName.new(:host => host,
+                     :port => source_node.port,
+                     :tag  => source_node.tag)
+      end
+    end
+
     def source_catalog
       @source_catalog ||= parse_source_catalog
     end
@@ -314,7 +335,7 @@ module Droonga
 
     def register_to_existing_nodes
       puts("Register new node to existing hosts in the cluster...")
-      source_node_serf.ensure_restarted do
+      source_node_serf.ensure_restarted(*existing_nodes) do
         source_node_serf.send_query("add_replicas",
                                     "cluster_id" => source_cluster_id,
                                     "dataset"    => dataset,
@@ -325,7 +346,7 @@ module Droonga
 
     def unregister_from_existing_nodes
       puts("Unregister new node from existing hosts in the cluster...")
-      source_node_serf.ensure_restarted do
+      source_node_serf.ensure_restarted(*existing_nodes) do
         source_node_serf.send_query("remove_replicas",
                                     "cluster_id" => source_cluster_id,
                                     "dataset"    => dataset,

  Modified: lib/droonga/serf.rb (+17 -6)
===================================================================
--- lib/droonga/serf.rb    2015-04-21 18:05:49 +0900 (8a0c5c2)
+++ lib/droonga/serf.rb    2015-04-21 18:20:37 +0900 (86a0b64)
@@ -222,20 +222,31 @@ module Droonga
     CHECK_RESTARTED_INTERVAL = 3
     CHECK_RESTARTED_TIMEOUT = 60 * 5
 
-    def ensure_restarted(&block)
+    def ensure_restarted(*nodes, &block)
+      nodes << @name.to_s if nodes.empty?
+
+      targets = nodes.collect do |node|
+        serf = self.class.new(node)
+        {
+          :serf          => serf,
+          :previous_name => serf.get_tag(Tag.internal_node_name),
+        }
+      end
+
       start_time = Time.now
-      previous_internal_name = get_tag(Tag.internal_node_name)
-      restarted = false
 
       yield # the given operation must restart the service.
 
       while Time.now - start_time < CHECK_RESTARTED_TIMEOUT
-        restarted = get_tag(Tag.internal_node_name) == previous_internal_name
-        break if restarted
+        targets.reject! do |target|
+          name = target[:serf].get_tag(Tag.internal_node_name)
+          name != target[:previous_name]
+        end
+        break if targets.empty?
         sleep(CHECK_RESTARTED_INTERVAL)
       end
 
-      restarted
+      targets.empty?
     end
 
     private
-------------- next part --------------
HTML����������������������������...
Download 



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