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