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