Kouhei Sutou
null+****@clear*****
Sun Jul 20 23:40:31 JST 2014
Kouhei Sutou 2014-07-20 23:40:31 +0900 (Sun, 20 Jul 2014) New Revision: 6c24fd491494fca63e68ed32e0d52a66846a82ff https://github.com/droonga/droonga-engine/commit/6c24fd491494fca63e68ed32e0d52a66846a82ff Message: Add --ready-notify-fd It is for tools like drntest. It is useful to wait until droonga-engine is ready. Modified files: lib/droonga/command/droonga_engine.rb lib/droonga/command/droonga_engine_service.rb lib/droonga/command/droonga_engine_worker.rb lib/droonga/dispatcher.rb lib/droonga/engine.rb lib/droonga/engine_state.rb lib/droonga/farm.rb lib/droonga/slice.rb lib/droonga/supervisor.rb lib/droonga/worker_process_agent.rb Modified: lib/droonga/command/droonga_engine.rb (+19 -0) =================================================================== --- lib/droonga/command/droonga_engine.rb 2014-07-20 23:17:03 +0900 (e10e112) +++ lib/droonga/command/droonga_engine.rb 2014-07-20 23:40:31 +0900 (619969f) @@ -112,6 +112,7 @@ module Droonga DEFAULT_PORT = 10031 attr_reader :host, :port, :tag, :log_file, :pid_file_path + attr_reader :ready_notify_fd def initialize @host = DEFAULT_HOST @port = DEFAULT_PORT @@ -119,6 +120,7 @@ module Droonga @log_file = nil @daemon = false @pid_file_path = nil + @ready_notify_fd = nil end def engine_name @@ -150,6 +152,7 @@ module Droonga add_log_options(parser) add_process_options(parser) add_path_options(parser) + add_notification_options(parser) end def listen_socket @@ -221,6 +224,15 @@ module Droonga end end + def add_notification_options(parser) + parser.separator("") + parser.separator("Notification:") + parser.on("--ready-notify-fd=FD", Integer, + "Send 'ready' message to FD on ready") do |fd| + @ready_notify_fd = fd + end + end + def bind_heartbeat_socket socket = UDPSocket.new(address_family) socket.bind(@host, @port) @@ -238,6 +250,13 @@ module Droonga @serf = run_serf @serf_status_observer = run_serf_status_observer @service_runner = run_service + if****@confi*****_notify_fd + @service_runner.on_ready = lambda do + output = IO.new(@configuration.ready_notify_fd) + output.puts("ready") + output.close + end + end @catalog_observer = run_catalog_observer @loop_breaker = Coolio::AsyncWatcher.new @loop.attach(@loop_breaker) Modified: lib/droonga/command/droonga_engine_service.rb (+3 -0) =================================================================== --- lib/droonga/command/droonga_engine_service.rb 2014-07-20 23:17:03 +0900 (f5d74ec) +++ lib/droonga/command/droonga_engine_service.rb 2014-07-20 23:40:31 +0900 (ff5c19f) @@ -140,6 +140,9 @@ module Droonga def run_engine @engine = Engine.new(@loop, @engine_name, @internal_engine_name) + @engine.on_ready = lambda do + @worker_process_agent.ready + end @engine.start end Modified: lib/droonga/command/droonga_engine_worker.rb (+1 -0) =================================================================== --- lib/droonga/command/droonga_engine_worker.rb 2014-07-20 23:17:03 +0900 (0e8b4d1) +++ lib/droonga/command/droonga_engine_worker.rb 2014-07-20 23:40:31 +0900 (d9d7c93) @@ -216,6 +216,7 @@ module Droonga stop_immediately end @worker_process_agent.start + @worker_process_agent.ready end def stop_worker_process_agent Modified: lib/droonga/dispatcher.rb (+3 -0) =================================================================== --- lib/droonga/dispatcher.rb 2014-07-20 23:17:03 +0900 (2e12f30) +++ lib/droonga/dispatcher.rb 2014-07-20 23:40:31 +0900 (cbfb23f) @@ -63,6 +63,9 @@ module Droonga end def start + @farm.on_ready = lambda do + @engine_state.on_ready + end @farm.start end Modified: lib/droonga/engine.rb (+5 -0) =================================================================== --- lib/droonga/engine.rb 2014-07-20 23:17:03 +0900 (41f837f) +++ lib/droonga/engine.rb 2014-07-20 23:40:31 +0900 (3a5b324) @@ -29,6 +29,7 @@ module Droonga class Engine include Loggable + attr_writer :on_ready def initialize(loop, name, internal_name) @state = EngineState.new(loop, name, internal_name) @catalog = load_catalog @@ -38,10 +39,14 @@ module Droonga @live_nodes_list_observer.on_change = lambda do @state.live_nodes = load_live_nodes end + @on_ready = nil end def start logger.trace("start: start") + @state.on_ready = lambda do + @on_ready.call if @on_ready + end @state.start @live_nodes_list_observer.start @dispatcher.start Modified: lib/droonga/engine_state.rb (+6 -0) =================================================================== --- lib/droonga/engine_state.rb 2014-07-20 23:17:03 +0900 (8b78288) +++ lib/droonga/engine_state.rb 2014-07-20 23:40:31 +0900 (01e02f8) @@ -31,6 +31,7 @@ module Droonga attr_reader :internal_name attr_reader :forwarder attr_reader :replier + attr_writer :on_ready attr_accessor :on_finish attr_accessor :catalog def initialize(loop, name, internal_name) @@ -42,6 +43,7 @@ module Droonga @forwarder = Forwarder.new(@loop) @forwarder.resume @replier = Replier.new(@forwarder) + @on_ready = nil @on_finish = nil @catalog = nil @live_nodes = nil @@ -124,6 +126,10 @@ module Droonga end end + def on_ready + @on_ready.call if @on_ready + end + private def log_tag "engine_state" Modified: lib/droonga/farm.rb (+8 -0) =================================================================== --- lib/droonga/farm.rb 2014-07-20 23:17:03 +0900 (6f82c3d) +++ lib/droonga/farm.rb 2014-07-20 23:40:31 +0900 (fa2f13e) @@ -19,6 +19,7 @@ require "droonga/slice" module Droonga class Farm + attr_writer :on_ready def initialize(name, catalog, loop, options={}) @name = name @catalog = catalog @@ -36,7 +37,14 @@ module Droonga end def start + n_ready_slices = 0 @slices.each_value do |slice| + slice.on_ready = lambda do + n_ready_slices += 1 + if n_ready_slices ==****@slice***** + @on_ready.call if @on_ready + end + end slice.start end end Modified: lib/droonga/slice.rb (+13 -1) =================================================================== --- lib/droonga/slice.rb 2014-07-20 23:17:03 +0900 (2b8520e) +++ lib/droonga/slice.rb 2014-07-20 23:40:31 +0900 (68f2d3f) @@ -24,6 +24,7 @@ module Droonga class Slice include Loggable + attr_accessor :on_ready def initialize(dataset, loop, options={}) @dataset = dataset @loop = loop @@ -33,6 +34,7 @@ module Droonga @job_pusher = JobPusher.new(@loop, @database_path) @processor = Processor.new(@loop, @job_pusher, @options) @supervisor = nil + @on_ready = nil end def start @@ -86,7 +88,10 @@ module Droonga end def start_supervisor - return if @n_workers.zero? + if @n_workers.zero? + on_ready + return + end config = Supervisor::WorkerConfiguration.new config.name = @options[:name] @@ -95,6 +100,9 @@ module Droonga config.plugins = @options[:plugins] config.job_pusher = @job_pusher @supervisor = Supervisor.new(@loop, @n_workers, config) + @supervisor.on_ready = lambda do + on_ready + end @supervisor.start end @@ -105,6 +113,10 @@ module Droonga end private + def on_ready + @on_ready.call if @on_ready + end + def log_tag "slice" end Modified: lib/droonga/supervisor.rb (+9 -0) =================================================================== --- lib/droonga/supervisor.rb 2014-07-20 23:17:03 +0900 (bbddff9) +++ lib/droonga/supervisor.rb 2014-07-20 23:40:31 +0900 (da3a302) @@ -20,15 +20,24 @@ module Droonga class Supervisor include Loggable + attr_writer :on_ready def initialize(loop, n_workers, config) @loop = loop @n_workers = n_workers @config = config + @on_ready = nil end def start + n_ready_workers = 0 @worker_runners = @n_workers.times.collect do |i| worker_runner = WorkerRunner.new(@loop, i, @config) + worker_runner.on_ready = lambda do + n_ready_workers += 1 + if n_ready_workers == @n_workers + @on_ready.call if @on_ready + end + end worker_runner.start # TODO: support auto re-run worker_runner Modified: lib/droonga/worker_process_agent.rb (+4 -2) =================================================================== --- lib/droonga/worker_process_agent.rb 2014-07-20 23:17:03 +0900 (878cdb4) +++ lib/droonga/worker_process_agent.rb 2014-07-20 23:40:31 +0900 (1cb757d) @@ -33,8 +33,6 @@ module Droonga def start @loop.attach(@input) @loop.attach(@output) - - @output.write(Messages::READY) end def stop @@ -49,6 +47,10 @@ module Droonga end end + def ready + @output.write(Messages::READY) + end + def on_stop_gracefully=(callback) @on_stop_gracefully = callback end -------------- next part -------------- HTML����������������������������... Download