[Groonga-commit] droonga/droonga-engine at a020e40 [master] Add "join" serf event (experimental)

Back to archive index

YUKI Hiroshi null+****@clear*****
Sun Jun 29 01:43:29 JST 2014


YUKI Hiroshi	2014-06-29 01:43:29 +0900 (Sun, 29 Jun 2014)

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

  Message:
    Add "join" serf event (experimental)

  Modified files:
    lib/droonga/command/serf_event_handler.rb

  Modified: lib/droonga/command/serf_event_handler.rb (+62 -9)
===================================================================
--- lib/droonga/command/serf_event_handler.rb    2014-06-29 01:22:24 +0900 (eae4366)
+++ lib/droonga/command/serf_event_handler.rb    2014-06-29 01:43:29 +0900 (8bd10e4)
@@ -70,6 +70,8 @@ module Droonga
         case @event_sub_name
         when "change_role"
           save_status(:role, @payload["role"])
+        when "join"
+          join
         when "set_replicas"
           set_replicas
         when "add_replicas"
@@ -92,6 +94,53 @@ module Droonga
         hosts
       end
 
+      def join
+        type = @payload["type"]
+        case type
+        when "replica"
+          join_as_replica
+        end
+      end
+
+      def join_as_replica
+        source = @payload["source"]
+        return unless soruce
+
+        generator = create_current_catalog_generator
+        dataset = generator.dataset_for_host(source)
+        return unless dataset
+
+        dataset_name = dataset.name
+        tag          = dataset.tag
+        port         = dataset.port
+        other_hosts  = dataset.hosts
+
+        if @payload["copy"]
+          modify_catalog do |modifier|
+            modifier.datasets[dataset].replicas.hosts = [host]
+          end
+          sleep(1) # wait for restart
+
+          DataAbsorber.absorb(:dataset          => dataset,
+                              :source_host      => source,
+                              :destination_host => host,
+                              :port             => port,
+                              :tag              => tag)
+          sleep(1)
+        end
+
+        modify_catalog do |modifier|
+          modifier.datasets[dataset].replicas.hosts += other_hosts
+          modifier.datasets[dataset].replicas.hosts.uniq!
+        end
+        sleep(1) # wait for restart
+
+        source_node  = "#{source}:#{port}/#{tag}"
+        Serf.send_event(source_node, "add_replicas",
+                        "dataset" => dataset,
+                        "hosts"   => [host])
+      end
+
       def set_replicas
         dataset = @payload["dataset"]
         return unless dataset
@@ -99,8 +148,8 @@ module Droonga
         hosts = given_hosts
         return unless hosts
 
-        modify_catalog do |generator|
-          generator.datasets[dataset].replicas.hosts = hosts
+        modify_catalog do |modifier|
+          modifier.datasets[dataset].replicas.hosts = hosts
         end
       end
 
@@ -111,9 +160,9 @@ module Droonga
         hosts = given_hosts
         return unless hosts
 
-        modify_catalog do |generator|
-          generator.datasets[dataset].replicas.hosts += hosts
-          generator.datasets[dataset].replicas.hosts.uniq!
+        modify_catalog do |modifier|
+          modifier.datasets[dataset].replicas.hosts += hosts
+          modifier.datasets[dataset].replicas.hosts.uniq!
         end
       end
 
@@ -124,17 +173,21 @@ module Droonga
         hosts = given_hosts
         return unless hosts
 
-        modify_catalog do |generator|
-          generator.datasets[dataset].replicas.hosts -= hosts
+        modify_catalog do |modifier|
+          modifier.datasets[dataset].replicas.hosts -= hosts
         end
       end
 
       def modify_catalog
+        generator = create_current_catalog_generator
+        yield(generator)
+        SafeFileWriter.write(Path.catalog, JSON.pretty_generate(generator.catalog))
+      end
+
+      def create_current_catalog_generator
         current_catalog = JSON.parse(Path.catalog.read)
         generator = CatalogGenerator.new
         generator.load(current_catalog)
-        yield(generator)
-        SafeFileWriter.write(Path.catalog, JSON.pretty_generate(generator.catalog))
       end
 
       def absorb_data
-------------- next part --------------
HTML����������������������������...
Download 



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