YUKI Hiroshi
null+****@clear*****
Fri Nov 21 21:56:02 JST 2014
YUKI Hiroshi 2014-11-21 21:56:02 +0900 (Fri, 21 Nov 2014) New Revision: 9f1252da3093a563576232d6a104f990c91d6fab https://github.com/droonga/droonga-engine/commit/9f1252da3093a563576232d6a104f990c91d6fab Message: Set role of nodes while joining Modified files: bin/droonga-engine-join lib/droonga/data_absorber.rb Modified: bin/droonga-engine-join (+18 -0) =================================================================== --- bin/droonga-engine-join 2014-11-21 21:28:39 +0900 (beba6a2) +++ bin/droonga-engine-join 2014-11-21 21:56:02 +0900 (17c9cc2) @@ -75,6 +75,15 @@ absorber_options = { } absorber = Droonga::DataAbsorber.new(absorber_options) +if absorber.source_node_suspendable? + run_remote_command(source_node, "change_role", + "node" => source_node, + "role" => "source") +end +run_remote_command(joining_node, "change_role", + "node" => joining_node, + "role" => "destination") + start_time_in_seconds = Time.new.to_i puts("Joining new replica to the cluster...") run_remote_command(joining_node, "join", @@ -126,6 +135,15 @@ run_remote_command(source_node, "add_replicas", "dataset" => options[:dataset], "hosts" => [options[:host]]) +if absorber.source_node_suspendable? + run_remote_command(source_node, "change_role", + "node" => source_node, + "role" => "") +end +run_remote_command(joining_node, "change_role", + "node" => joining_node, + "role" => "") + puts("Done.") Modified: lib/droonga/data_absorber.rb (+67 -21) =================================================================== --- lib/droonga/data_absorber.rb 2014-11-21 21:28:39 +0900 (34505c0) +++ lib/droonga/data_absorber.rb 2014-11-21 21:56:02 +0900 (b3291f2) @@ -17,6 +17,8 @@ require "open3" require "droonga/loggable" require "droonga/client" +require "droonga/catalog_generator" +require "droonga/catalog_fetcher" module Droonga class DataAbsorber @@ -42,6 +44,10 @@ module Droonga # We should use droonga-send instead of droonga-request, # because droonga-request is too slow. @params[:client] ||= "droonga-send" + + @params[:dataset] ||= CatalogGenerator::DEFAULT_DATASET + @params[:port] ||= CatalogGenerator::DEFAULT_PORT + @params[:tag] ||= CatalogGenerator::DEFAULT_TAG end def absorb @@ -87,6 +93,34 @@ module Droonga end end + def source_client + options = { + :host => @params[:source_host], + :port => @params[:port], + :tag => @params[:tag], + :progocol => :droonga, + :receiver_host => @params[:destination_host], + :receiver_port => 0, + } + @source_client ||= Droonga::Client.new(options) + end + + def destination_client + options = { + :host => @params[:destination_host], + :port => @params[:port], + :tag => @params[:tag], + :progocol => :droonga, + :receiver_host => @params[:destination_host], + :receiver_port => 0, + } + @destination_client ||= Droonga::Client.new(options) + end + + def source_node_suspendable? + (source_replica_hosts - [@params[:source_host]]).size > 1 + end + private def calculate_required_time_in_seconds if @params[:client].include?("droonga-send") @@ -99,21 +133,21 @@ module Droonga def drndump_options options = [] options += ["--host", @params[:source_host]] if @params[:source_host] - options += ["--port", @params[:port].to_s] if @params[:port] - options += ["--tag", @params[:tag]] if @params[:tag] - options += ["--dataset", @params[:dataset]] if @params[:dataset] + options += ["--port", @params[:port]] + options += ["--tag", @params[:tag]] + options += ["--dataset", @params[:dataset]] options += ["--receiver-host", @params[:destination_host]] - options += ["--receiver-port", @params[:receiver_port].to_s] if @params[:receiver_port] + options += ["--receiver-port", @params[:receiver_port]] if @params[:receiver_port] options.collect(&:to_s) end def droonga_request_options options = [] options += ["--host", @params[:destination_host]] - options += ["--port", @params[:port].to_s] if @params[:port] - options += ["--tag", @params[:tag]] if @params[:tag] + options += ["--port", @params[:port]] + options += ["--tag", @params[:tag]] options += ["--receiver-host", @params[:destination_host]] - options += ["--receiver-port", @params[:receiver_port].to_s] if @params[:receiver_port] + options += ["--receiver-port", @params[:receiver_port]] if @params[:receiver_port] options.collect(&:to_s) end @@ -128,8 +162,8 @@ module Droonga # So, we always use just one endpoint for now, # even if there are too much data. server = "droonga:#{params[:destination_host]}" - server = "#{server}:#{params[:port].to_s}" if @params[:port] - server = "#{server}/#{params[:tag].to_s}" if @params[:tag] + server = "#{server}:#{params[:port].to_s}" + server = "#{server}/#{params[:tag].to_s}" options += ["--server", server] #XXX We should restrict the traffic to avoid overflowing! @@ -148,18 +182,6 @@ module Droonga end end - def source_client - options = { - :host => @params[:source_host], - :port => @params[:port], - :tag => @params[:tag], - :progocol => :droonga, - :receiver_host => @params[:destination_host], - :receiver_port => 0, - } - @source_client ||= Droonga::Client.new(options) - end - def source_tables response = source_client.request("dataset" => @params[:dataset], "type" => "table_list") @@ -192,6 +214,30 @@ module Droonga n_records end + def source_replica_hosts + @source_replica_hosts ||= get_source_replica_hosts + end + + def get_source_replica_hosts + generator = CatalogGenerator.new + generator.load(source_catalog) + dataset = generator.dataset_for_host(@params[:source_host]) + return [] unless dataset + dataset.replicas.hosts + end + + def source_catalog + @source_catalog ||= fetch_source_catalog + end + + def fetch_source_catalog + fetcher = CatalogFetcher.new(:host => @params[:source_host], + :port => @params[:port], + :tag => @params[:tag], + :receiver_host => @params[:destination_host]) + fetcher.fetch(:dataset => @params[:dataset]) + end + def log_tag "data-absorber" end -------------- next part -------------- HTML����������������������������... 下載