[Groonga-commit] droonga/droonga-engine at 9f1252d [master] Set role of nodes while joining

Back to archive index

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����������������������������...
下載 



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