From 36a405de444e62c738c33368bbd91a9cd77fe897 Mon Sep 17 00:00:00 2001 From: Yuta Iwama Date: Thu, 30 Apr 2020 11:32:30 +0900 Subject: [PATCH 1/3] Call lifecycle methods Service discovery manager should manager sd instance Signed-off-by: Yuta Iwama --- lib/fluent/plugin_helper/service_discovery.rb | 7 +++++++ lib/fluent/plugin_helper/service_discovery/manager.rb | 8 ++++++++ 2 files changed, 15 insertions(+) diff --git a/lib/fluent/plugin_helper/service_discovery.rb b/lib/fluent/plugin_helper/service_discovery.rb index 2a4adacb6e..b850d5a54e 100644 --- a/lib/fluent/plugin_helper/service_discovery.rb +++ b/lib/fluent/plugin_helper/service_discovery.rb @@ -43,6 +43,13 @@ def start super end + %i[after_start stop before_shutdown shutdown after_shutdown close terminate].each do |mth| + define_method(mth) do + @discovery_manager&.__send__(mth) + super() + end + end + private # @param title [Symbol] the thread name. this value should be unique. diff --git a/lib/fluent/plugin_helper/service_discovery/manager.rb b/lib/fluent/plugin_helper/service_discovery/manager.rb index 02369ee50c..b7032db70f 100644 --- a/lib/fluent/plugin_helper/service_discovery/manager.rb +++ b/lib/fluent/plugin_helper/service_discovery/manager.rb @@ -60,6 +60,14 @@ def start end end + %i[after_start stop before_shutdown shutdown after_shutdown close terminate].each do |mth| + define_method(mth) do + @discoveries.each do |d| + d.__send__(mth) + end + end + end + def run_once # Don't care race in this loop intentionally s = @queue.size From d6bdbccafbc03b6e7e3ab6ba39d7cf5dd103ba9b Mon Sep 17 00:00:00 2001 From: Yuta Iwama Date: Thu, 30 Apr 2020 11:33:41 +0900 Subject: [PATCH 2/3] test: unnecessary space, and const var Signed-off-by: Yuta Iwama --- test/plugin_helper/test_service_discovery.rb | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/test/plugin_helper/test_service_discovery.rb b/test/plugin_helper/test_service_discovery.rb index 34173bb89f..68835fbd31 100644 --- a/test/plugin_helper/test_service_discovery.rb +++ b/test/plugin_helper/test_service_discovery.rb @@ -4,9 +4,6 @@ require 'fluent/plugin/output' class ServiceDiscoveryHelper < Test::Unit::TestCase - PORT = unused_port - NULL_LOGGER = Logger.new(nil) - class Dummy < Fluent::Plugin::TestBase helpers :service_discovery @@ -40,7 +37,7 @@ def discovery_manager d.service_discovery_create_manager( :service_discovery_helper_test, - configurations: [{ type: :static, conf: config_element('root', '', {}, [config_element('service', '', { 'host' => '127.0.0.1', 'port' => '1234' })]) }], + configurations: [{ type: :static, conf: config_element('root', '', {}, [config_element('service', '', { 'host' => '127.0.0.1', 'port' => '1234' })]) }], ) assert_true !!d.discovery_manager From 41f66d64f21c145567468d2f3edf3f8fb2bad759 Mon Sep 17 00:00:00 2001 From: Yuta Iwama Date: Thu, 30 Apr 2020 12:15:31 +0900 Subject: [PATCH 3/3] test: make sure that service_discovery exits without errors Signed-off-by: Yuta Iwama --- test/plugin_helper/test_service_discovery.rb | 36 ++++++++++++++++++++ 1 file changed, 36 insertions(+) diff --git a/test/plugin_helper/test_service_discovery.rb b/test/plugin_helper/test_service_discovery.rb index 68835fbd31..4faf609139 100644 --- a/test/plugin_helper/test_service_discovery.rb +++ b/test/plugin_helper/test_service_discovery.rb @@ -27,6 +27,7 @@ def discovery_manager if @d @d.stop unless @d.stopped? @d.shutdown unless @d.shutdown? + @d.after_shutdown unless @d.after_shutdown? @d.close unless @d.closed? @d.terminate unless @d.terminated? end @@ -46,6 +47,7 @@ def discovery_manager mock.proxy(d).timer_execute(:service_discovery_helper_test, anything).never d.start + d.event_loop_wait_until_start services = d.discovery_manager.services assert_equal 1, services.size @@ -65,5 +67,39 @@ def discovery_manager mock.proxy(d.discovery_manager).start.once mock(d).timer_execute(:service_discovery_helper_test, anything).once d.start + d.event_loop_wait_until_start + end + + test 'exits service discovery instances without any errors' do + d = @d = Dummy.new + mockv = flexmock('dns_resolver', getaddress: '127.0.0.1') + .should_receive(:getresources) + .and_return([Resolv::DNS::Resource::IN::SRV.new(1, 10, 8081, 'service1.example.com')]) + .mock + mock(Resolv::DNS).new { mockv } + + d.service_discovery_create_manager( + :service_discovery_helper_test2, + configurations: [{ type: :srv, conf: config_element('service_discovery', '', { 'service' => 'service1', 'hostname' => 'example.com' }) }], + ) + + assert_true !!d.discovery_manager + mock.proxy(d.discovery_manager).start.once + mock(d).timer_execute(:service_discovery_helper_test2, anything).once + + # To avoid claring `@logs` during `terminate` step + # https://github.com/fluent/fluentd/blob/bc78d889f93dad8c2a4e0ad1ca802546185dacba/lib/fluent/test/log.rb#L33 + mock(d.log).reset.twice + + d.start + d.event_loop_wait_until_start + + d.stop unless d.stopped? + d.shutdown unless d.shutdown? + d.after_shutdown unless d.after_shutdown? + d.close unless d.closed? + d.terminate unless d.terminated? + + assert_false(d.log.out.logs.any? { |e| e.match?(/thread doesn't exit correctly/) }) end end