[Groonga-commit] droonga/droonga-engine at 30ee99e [master] Support graceful catalog.json reloading

Zurück zum Archiv-Index

Kouhei Sutou null+****@clear*****
Wed May 28 11:43:24 JST 2014


Kouhei Sutou	2014-05-28 11:43:24 +0900 (Wed, 28 May 2014)

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

  Message:
    Support graceful catalog.json reloading

  Modified files:
    lib/droonga/catalog_observer.rb
    lib/droonga/command/droonga_engine.rb
    lib/droonga/engine.rb
    lib/droonga/path.rb
    lib/droonga/serf.rb

  Modified: lib/droonga/catalog_observer.rb (+16 -35)
===================================================================
--- lib/droonga/catalog_observer.rb    2014-05-28 11:14:15 +0900 (152729c)
+++ lib/droonga/catalog_observer.rb    2014-05-28 11:43:24 +0900 (32a1d1b)
@@ -15,31 +15,36 @@
 # License along with this library; if not, write to the Free Software
 # Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
 
+require "coolio"
+
 require "droonga/path"
 require "droonga/loggable"
-require "droonga/catalog_loader"
 
 module Droonga
   class CatalogObserver
     include Loggable
 
-    DEFAULT_CATALOG_PATH = "catalog.json"
     CHECK_INTERVAL = 1
 
-    attr_reader :catalog
-    attr_accessor :on_reload
+    attr_accessor :on_change
 
     def initialize(loop)
       @loop = loop
-      @catalog_path = catalog_path
-      load_catalog!
+      @path = Path.catalog
+      @mtime =****@path*****
+      @on_change = nil
     end
 
     def start
       @watcher = Cool.io::TimerWatcher.new(CHECK_INTERVAL, true)
-      observer = self
+      on_timer = lambda do
+        if updated?
+          @mtime =****@path*****
+          @on_change.call if @on_change
+        end
+      end
       @watcher.on_timer do
-        observer.ensure_latest_catalog_loaded
+        on_timer.call
       end
       @loop.attach(@watcher)
     end
@@ -48,35 +53,11 @@ module Droonga
       @watcher.detach
     end
 
-    def ensure_latest_catalog_loaded
-      if catalog_updated?
-        begin
-          load_catalog!
-          on_reload.call(catalog) if on_reload
-        rescue Droonga::Error => error
-          logger.warn("reload: fail", :path => @catalog_path, :error => error)
-        end
-      end
-    end
-
-    def catalog_path
-      path = ENV["DROONGA_CATALOG"] || DEFAULT_CATALOG_PATH
-      File.expand_path(path, Droonga::Path.base)
-    end
-
-    def catalog_updated?
-      File.mtime(catalog_path) > @catalog_mtime
-    end
-
-    def load_catalog!
-      loader = CatalogLoader.new(@catalog_path)
-      @catalog = loader.load
-      logger.info("loaded", :path => @catalog_path, :mtime => @catalog_mtime)
-    ensure
-      @catalog_mtime = File.mtime(@catalog_path)
+    private
+    def updated?
+      @path.mtime > @mtime
     end
 
-    private
     def log_tag
       "catalog-observer"
     end

  Modified: lib/droonga/command/droonga_engine.rb (+13 -0)
===================================================================
--- lib/droonga/command/droonga_engine.rb    2014-05-28 11:14:15 +0900 (d5ea9b9)
+++ lib/droonga/command/droonga_engine.rb    2014-05-28 11:43:24 +0900 (d21a9d4)
@@ -22,6 +22,7 @@ require "coolio"
 
 require "droonga/path"
 require "droonga/serf"
+require "droonga/catalog_observer"
 require "droonga/service_control_protocol"
 
 module Droonga
@@ -226,6 +227,7 @@ module Droonga
         def run
           @serf = run_serf
           @service_runner = run_service
+          @catalog_observer = run_catalog_observer
           @loop_breaker = Coolio::AsyncWatcher.new
           @loop.attach(@loop_breaker)
 
@@ -262,6 +264,7 @@ module Droonga
           @loop_breaker.signal
           @loop_breaker.detach
           @serf.shutdown
+          @catalog_observer.stop
           @service_runner.stop_gracefully
         end
 
@@ -269,6 +272,7 @@ module Droonga
           @loop_breaker.signal
           @loop_breaker.detach
           @serf.shutdown
+          @catalog_observer.stop
           @service_runner.stop_immediately
         end
 
@@ -299,6 +303,15 @@ module Droonga
           serf.start
           serf
         end
+
+        def run_catalog_observer
+          catalog_observer = CatalogObserver.new(@loop)
+          catalog_observer.on_change = lambda do
+            restart_graceful
+          end
+          catalog_observer.start
+          catalog_observer
+        end
       end
 
       class ServiceRunner

  Modified: lib/droonga/engine.rb (+16 -28)
===================================================================
--- lib/droonga/engine.rb    2014-05-28 11:14:15 +0900 (00fee6d)
+++ lib/droonga/engine.rb    2014-05-28 11:43:24 +0900 (089efec)
@@ -20,7 +20,7 @@ require "fileutils"
 require "droonga/engine/version"
 require "droonga/loggable"
 require "droonga/engine_state"
-require "droonga/catalog_observer"
+require "droonga/catalog_loader"
 require "droonga/dispatcher"
 require "droonga/live_nodes_list_observer"
 
@@ -33,13 +33,9 @@ module Droonga
 
     def initialize(loop, name, internal_name)
       @state = EngineState.new(loop, name, internal_name)
-
-      @catalog_observer = Droonga::CatalogObserver.new(@state.loop)
-      @catalog_observer.on_reload = lambda do |catalog|
-        graceful_restart(catalog)
-        logger.info("restarted")
-      end
-
+      @catalog = load_catalog
+      @live_nodes =****@catal*****_nodes
+      @dispatcher = create_dispatcher
       @live_nodes_list_observer = LiveNodesListObserver.new
       @live_nodes_list_observer.on_update = lambda do |live_nodes|
         @live_nodes = live_nodes
@@ -51,17 +47,12 @@ module Droonga
       logger.trace("start: start")
       @state.start
       @live_nodes_list_observer.start
-      @catalog_observer.start
-      catalog = @catalog_observer.catalog
-      @live_nodes = catalog.all_nodes
-      @dispatcher = create_dispatcher(catalog)
       @dispatcher.start
       logger.trace("start: done")
     end
 
     def stop_gracefully
       logger.trace("stop_gracefully: start")
-      @catalog_observer.stop
       @live_nodes_list_observer.stop
       on_finish = lambda do
         output_last_processed_timestamp
@@ -81,7 +72,6 @@ module Droonga
     def stop_immediately
       logger.trace("stop_immediately: start")
       output_last_processed_timestamp
-      @catalog_observer.stop
       @live_nodes_list_observer.stop
       @dispatcher.shutdown
       @state.shutdown
@@ -95,22 +85,20 @@ module Droonga
     end
 
     private
-    def create_dispatcher(catalog)
-      dispatcher = Dispatcher.new(@state, catalog)
-      dispatcher.live_nodes = @live_nodes
-      dispatcher
+    def load_catalog
+      catalog_path = Path.catalog
+      loader = CatalogLoader.new(catalog_path.to_s)
+      catalog = loader.load
+      logger.info("catalog loaded",
+                  :path  => catalog_path,
+                  :mtime => catalog_path.mtime)
+      catalog
     end
 
-    def graceful_restart(catalog)
-      logger.trace("graceful_restart: start")
-      old_dispatcher = @dispatcher
-      logger.trace("graceful_restart: creating new dispatcher")
-      new_dispatcher = create_dispatcher(catalog)
-      new_dispatcher.start
-      @dispatcher = new_dispatcher
-      logger.trace("graceful_restart: shutdown old dispatcher")
-      old_dispatcher.shutdown
-      logger.trace("graceful_restart: done")
+    def create_dispatcher
+      dispatcher = Dispatcher.new(@state, @catalog)
+      dispatcher.live_nodes = @live_nodes
+      dispatcher
     end
 
     def output_last_processed_timestamp

  Modified: lib/droonga/path.rb (+5 -0)
===================================================================
--- lib/droonga/path.rb    2014-05-28 11:14:15 +0900 (4ef27c9)
+++ lib/droonga/path.rb    2014-05-28 11:43:24 +0900 (cd4c576)
@@ -32,6 +32,11 @@ module Droonga
       def state
         base + "state"
       end
+
+      def catalog
+        base_file_name = ENV["DROONGA_CATALOG"] || "catalog.json"
+        Pathname.new(base_file_name).expand_path(base)
+      end
     end
   end
 end

  Modified: lib/droonga/serf.rb (+3 -3)
===================================================================
--- lib/droonga/serf.rb    2014-05-28 11:14:15 +0900 (267360e)
+++ lib/droonga/serf.rb    2014-05-28 11:43:24 +0900 (88262ad)
@@ -15,7 +15,7 @@
 
 require "droonga/path"
 require "droonga/loggable"
-require "droonga/catalog_observer"
+require "droonga/catalog_loader"
 require "droonga/serf_downloader"
 
 module Droonga
@@ -97,8 +97,8 @@ module Droonga
     end
 
     def detect_other_hosts
-      catalog_observer = Droonga::CatalogObserver.new(@loop)
-      catalog = catalog_observer.catalog
+      loader = CatalogLoader.new(Path.catalog.to_s)
+      catalog = loader.load
       other_nodes = catalog.all_nodes.reject do |node|
         node == @name
       end
-------------- next part --------------
HTML����������������������������...
Download 



More information about the Groonga-commit mailing list
Zurück zum Archiv-Index