[Groonga-commit] droonga/droonga-engine at ab4bfc9 [buffered-forward] Unify LiveNodesList to ClusterState

Back to archive index

YUKI Hiroshi null+****@clear*****
Fri Dec 26 15:31:32 JST 2014


YUKI Hiroshi	2014-12-26 15:31:32 +0900 (Fri, 26 Dec 2014)

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

  Message:
    Unify LiveNodesList to ClusterState
    
    Conflicts:
    	lib/droonga/cluster_state.rb
    	lib/droonga/engine_state.rb

  Removed files:
    lib/droonga/live_nodes_list.rb
    lib/droonga/live_nodes_list_loader.rb
  Modified files:
    lib/droonga/cluster_state.rb
    lib/droonga/command/remote.rb
    lib/droonga/command/serf_event_handler.rb
    lib/droonga/engine.rb
    lib/droonga/engine_state.rb
    lib/droonga/path.rb
    lib/droonga/serf.rb

  Modified: lib/droonga/cluster_state.rb (+103 -20)
===================================================================
--- lib/droonga/cluster_state.rb    2014-12-26 13:08:41 +0900 (efe61fe)
+++ lib/droonga/cluster_state.rb    2014-12-26 15:31:32 +0900 (04e7e3e)
@@ -14,6 +14,7 @@
 # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
 
 require "droonga/loggable"
+require "droonga/file_observer"
 require "droonga/node_metadata"
 
 module Droonga
@@ -23,43 +24,74 @@ module Droonga
     attr_accessor :catalog
     attr_writer :on_change
 
-    def initialize
+    def initialize(loop)
+      @loop = loop
+
       @catalog = nil
-      @live_nodes_list = nil
+      @state = nil
       @on_change = nil
+
+      @file_observer = FileObserver.new(loop, Path.cluster_state)
+      @file_observer.on_change = lambda do
+        reload
+      end
+
+      reload
+    end
+
+    def start_observe
+      @file_observer.start
+    end
+
+    def stop_observe
+      @file_observer.stop
+    end
+
+    def reload
+      old_state = to_hash
+      clear_cache
+      @state = state
+      logger.info("live-nodes-list loaded")
+      unless to_hash == old_state
+        on_change
+      end
     end
 
     def all_nodes
-      @catalog.all_nodes
+      if @catalog
+        @catalog.all_nodes
+      else
+        []
+      end
     end
 
     def dead_nodes
-      if @live_nodes_list
-        @live_nodes_list.dead_nodes
+      if @state
+        @dead_nodes ||= collect_dead_nodes
       else
         []
       end
     end
 
     def service_provider_nodes
-      if @live_nodes_list
-        @live_nodes_list.service_provider_nodes
+      if @state
+        @service_provider_nodes ||= collect_nodes_by_role(NodeMetadata::Role::SERVICE_PROVIDER)
       else
         all_nodes
       end
     end
 
     def absorb_source_nodes
-      if @live_nodes_list
-        @live_nodes_list.absorb_source_nodes
+      if @state
+        @absorb_source_nodes ||= collect_nodes_by_role(NodeMetadata::Role::ABSORB_SOURCE)
       else
         []
       end
     end
 
     def absorb_destination_nodes
-      if @live_nodes_list
-        @live_nodes_list.absorb_destination_nodes
+      if @state
+        @absorb_destination_nodes ||= collect_nodes_by_role(NodeMetadata::Role::ABSORB_DESTINATION)
       else
         []
       end
@@ -107,20 +139,71 @@ module Droonga
       end
     end
 
-    def live_nodes_list=(new_nodes_list)
-      old_live_nodes_list = @live_nodes_list
-      @live_nodes_list = new_nodes_list
-      unless old_live_nodes_list == new_nodes_list
-        on_change
-      end
-      @live_nodes_list
-    end
-
     def on_change
       @on_change.call if @on_change
     end
 
     private
+    def to_hash
+      return nil unless @state
+
+      {
+        :all                => @state.keys,
+        :dead               => dead_nodes,
+        :service_provider   => service_provider_nodes,
+        :absorb_source      => absorb_source_nodes,
+        :absorb_destination => absorb_destination_nodes,
+      }
+    end
+
+    def clear_cache
+      @dead_nodes = nil
+      @service_provider_nodes = nil
+      @absorb_source_nodes = nil
+      @absorb_destination_nodes = nil
+    end
+
+    def state
+      path = Path.cluster_state
+
+      return default_state unless path.exist?
+
+      contents = path.read
+      return default_state if contents.empty?
+
+      begin
+        JSON.parse(contents)
+      rescue JSON::ParserError
+        default_state
+      end
+    end
+
+    def default_state
+      {}
+    end
+
+    def collect_dead_nodes
+      nodes = []
+      @state.each do |name, state|
+        unless state["live"]
+          nodes << name
+        end
+      end
+      nodes.sort
+    end
+
+    def collect_nodes_by_role(role)
+      nodes = []
+      @state.each do |name, state|
+        if not state["foreign"] and
+             state["tags"]["type"] == "engine" and
+             state["tags"]["role"] == role
+          nodes << name
+        end
+      end
+      nodes.sort
+    end
+
     def node_metadata
       @node_metadata ||= NodeMetadata.new
     end

  Modified: lib/droonga/command/remote.rb (+2 -2)
===================================================================
--- lib/droonga/command/remote.rb    2014-12-26 13:08:41 +0900 (47a05e2)
+++ lib/droonga/command/remote.rb    2014-12-26 15:31:32 +0900 (2ffd9ec)
@@ -395,9 +395,9 @@ module Droonga
         end
       end
 
-      class UpdateLiveNodesList < Base
+      class UpdateClusterState < Base
         def process
-          @serf.update_live_nodes_list
+          @serf.update_cluster_state
         end
       end
     end

  Modified: lib/droonga/command/serf_event_handler.rb (+1 -1)
===================================================================
--- lib/droonga/command/serf_event_handler.rb    2014-12-26 13:08:41 +0900 (be992aa)
+++ lib/droonga/command/serf_event_handler.rb    2014-12-26 15:31:32 +0900 (b19d281)
@@ -66,7 +66,7 @@ module Droonga
           @payload = JSON.parse($stdin.gets)
           detect_command_class_from_custom_event(ENV["SERF_QUERY_NAME"])
         when "member-join", "member-leave", "member-update", "member-reap"
-          Remote::UpdateLiveNodesList
+          Remote::UpdateClusterState
         else
           nil
         end

  Modified: lib/droonga/engine.rb (+3 -18)
===================================================================
--- lib/droonga/engine.rb    2014-12-26 13:08:41 +0900 (e9d0912)
+++ lib/droonga/engine.rb    2014-12-26 15:31:32 +0900 (d5fb0da)
@@ -23,7 +23,6 @@ require "droonga/engine_state"
 require "droonga/catalog_loader"
 require "droonga/dispatcher"
 require "droonga/file_observer"
-require "droonga/live_nodes_list_loader"
 require "droonga/node_metadata"
 
 module Droonga
@@ -33,14 +32,9 @@ module Droonga
     attr_writer :on_ready
     def initialize(loop, name, internal_name)
       @state = EngineState.new(loop, name, internal_name)
-      @state.cluster.live_nodes_list = load_live_nodes_list
       @catalog = load_catalog
       @state.catalog = @catalog
       @dispatcher = create_dispatcher
-      @live_nodes_list_observer = FileObserver.new(loop, Path.live_nodes_list)
-      @live_nodes_list_observer.on_change = lambda do
-        @state.cluster.live_nodes_list = load_live_nodes_list
-      end
       @node_metadata_observer = FileObserver.new(loop, Path.node_metadata)
       @node_metadata_observer.on_change = lambda do
         logger.trace("reloading node_metadata: start")
@@ -56,7 +50,7 @@ module Droonga
         @on_ready.call if @on_ready
       end
       @state.start
-      @live_nodes_list_observer.start
+      @state.cluster.start_observe
       @node_metadata_observer.start
       @dispatcher.start
       logger.trace("start: done")
@@ -64,7 +58,7 @@ module Droonga
 
     def stop_gracefully
       logger.trace("stop_gracefully: start")
-      @live_nodes_list_observer.stop
+      @state.cluster.stop_observe
       @node_metadata_observer.stop
       on_finish = lambda do
         logger.trace("stop_gracefully/on_finish: start")
@@ -89,7 +83,7 @@ module Droonga
     def stop_immediately
       logger.trace("stop_immediately: start")
       save_last_processed_message_timestamp
-      @live_nodes_list_observer.stop
+      @state.cluster.stop_observe
       @node_metadata_observer.stop
       @dispatcher.stop_immediately
       @state.shutdown
@@ -117,15 +111,6 @@ module Droonga
       catalog
     end
 
-    def load_live_nodes_list
-      path = Path.live_nodes_list
-      loader = LiveNodesListLoader.new(path)
-      live_nodes_list = loader.load
-      logger.info("live-nodes-list loaded",
-                  :path  => path.to_s)
-      live_nodes_list
-    end
-
     def create_dispatcher
       Dispatcher.new(@state, @catalog)
     end

  Modified: lib/droonga/engine_state.rb (+1 -1)
===================================================================
--- lib/droonga/engine_state.rb    2014-12-26 13:08:41 +0900 (05e12ab)
+++ lib/droonga/engine_state.rb    2014-12-26 15:31:32 +0900 (b9d1f84)
@@ -43,7 +43,7 @@ module Droonga
       @internal_name = internal_name
       @sessions = {}
       @current_id = 0
-      @cluster = ClusterState.new
+      @cluster = ClusterState.new(@loop)
       @forwarder = BufferedForwarder.new(@loop,
                                          :cluster_state => @cluster)
       @cluster.on_change = lambda do

  Deleted: lib/droonga/live_nodes_list.rb (+0 -88) 100644
===================================================================
--- lib/droonga/live_nodes_list.rb    2014-12-26 13:08:41 +0900 (deeaddb)
+++ /dev/null
@@ -1,88 +0,0 @@
-# Copyright (C) 2014 Droonga Project
-#
-# This library is free software; you can redistribute it and/or
-# modify it under the terms of the GNU Lesser General Public
-# License version 2.1 as published by the Free Software Foundation.
-#
-# This library is distributed in the hope that it will be useful,
-# but WITHOUT ANY WARRANTY; without even the implied warranty of
-# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
-# Lesser General Public License for more details.
-#
-# You should have received a copy of the GNU Lesser General Public
-# License along with this library; if not, write to the Free Software
-# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
-
-require "droonga/node_metadata"
-
-module Droonga
-  class LiveNodesList
-    def initialize(nodes)
-      @nodes = nodes
-    end
-
-    def all_nodes
-      @all_nodes ||=****@nodes*****
-    end
-
-    def dead_nodes
-      @dead_nodes ||= collect_dead_nodes
-    end
-
-    def absorb_source_nodes
-      @absorb_source_nodes ||= collect_absorb_source_nodes
-    end
-
-    def absorb_destination_nodes
-      @absorb_destination_nodes ||= collect_absorb_destination_nodes
-    end
-
-    def service_provider_nodes
-      @service_provider_nodes ||= collect_service_provider_nodes
-    end
-
-    def ==(nodes_list)
-      nodes_list.is_a?(self.class) and
-        nodes_list.all_nodes == all_nodes and
-        nodes_list.dead_nodes == dead_nodes and
-        nodes_list.absorb_source_nodes == absorb_source_nodes and
-        nodes_list.absorb_destination_nodes == absorb_destination_nodes and
-        nodes_list.service_provider_nodes == service_provider_nodes
-    end
-
-    private
-    def collect_dead_nodes
-      nodes = []
-      @nodes.each do |name, state|
-        unless state["live"]
-          nodes << name
-        end
-      end
-      nodes.sort
-    end
-
-    def collect_nodes_by_role(role)
-      nodes = []
-      @nodes.each do |name, state|
-        if not state["foreign"] and
-             state["tags"]["type"] == "engine" and
-             state["tags"]["role"] == role
-          nodes << name
-        end
-      end
-      nodes.sort
-    end
-
-    def collect_service_provider_nodes
-      collect_nodes_by_role(NodeMetadata::Role::SERVICE_PROVIDER)
-    end
-
-    def collect_absorb_source_nodes
-      collect_nodes_by_role(NodeMetadata::Role::ABSORB_SOURCE)
-    end
-
-    def collect_absorb_destination_nodes
-      collect_nodes_by_role(NodeMetadata::Role::ABSORB_DESTINATION)
-    end
-  end
-end

  Deleted: lib/droonga/live_nodes_list_loader.rb (+0 -50) 100644
===================================================================
--- lib/droonga/live_nodes_list_loader.rb    2014-12-26 13:08:41 +0900 (3df662d)
+++ /dev/null
@@ -1,50 +0,0 @@
-# Copyright (C) 2014 Droonga Project
-#
-# This library is free software; you can redistribute it and/or
-# modify it under the terms of the GNU Lesser General Public
-# License version 2.1 as published by the Free Software Foundation.
-#
-# This library is distributed in the hope that it will be useful,
-# but WITHOUT ANY WARRANTY; without even the implied warranty of
-# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
-# Lesser General Public License for more details.
-#
-# You should have received a copy of the GNU Lesser General Public
-# License along with this library; if not, write to the Free Software
-# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
-
-require "pathname"
-require "json"
-
-require "droonga/live_nodes_list"
-
-module Droonga
-  class LiveNodesListLoader
-    def initialize(path)
-      @path = path
-    end
-
-    def load
-      list = parse
-      LiveNodesList.new(list)
-    end
-
-    private
-    def parse
-      return default_list unles****@path*****?
-
-      contents =****@path*****
-      return default_list if contents.empty?
-
-      begin
-        JSON.parse(contents)
-      rescue JSON::ParserError
-        default_list
-      end
-    end
-
-    def default_list
-      {}
-    end
-  end
-end

  Modified: lib/droonga/path.rb (+2 -2)
===================================================================
--- lib/droonga/path.rb    2014-12-26 13:08:41 +0900 (ab547a1)
+++ lib/droonga/path.rb    2014-12-26 15:31:32 +0900 (1b9278b)
@@ -48,8 +48,8 @@ module Droonga
         state + "metadata.json"
       end
 
-      def live_nodes_list
-        state + "live-nodes.json"
+      def cluster_state
+        state + "cluster-state.json"
       end
 
       def config

  Modified: lib/droonga/serf.rb (+5 -5)
===================================================================
--- lib/droonga/serf.rb    2014-12-26 13:08:41 +0900 (cc53f14)
+++ lib/droonga/serf.rb    2014-12-26 15:31:32 +0900 (5e2eb09)
@@ -70,7 +70,7 @@ module Droonga
                    *retry_joins)
       Thread.new do
         sleep 1 # wait until the serf agent becomes running
-        update_live_nodes_list if****@agent*****?
+        update_cluster_state if****@agent*****?
       end
       logger.trace("start: done")
     end
@@ -124,9 +124,9 @@ module Droonga
       result
     end
 
-    def update_live_nodes_list
-      path = Path.live_nodes_list
-      new_list = live_nodes_list
+    def update_cluster_state
+      path = Path.cluster_state
+      new_state = current_cluster_state
       file_contents = JSON.pretty_generate(new_list)
       SafeFileWriter.write(path) do |output, file|
         output.puts(file_contents)
@@ -134,7 +134,7 @@ module Droonga
       end
     end
 
-    def live_nodes_list
+    def current_cluster_state
       ensure_serf
       nodes_list = {}
       result = run_once("members", "-format", "json")
-------------- next part --------------
HTML����������������������������...
다운로드 



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