From fc0b6b766cea725534d1fd4dd91673a38cd0e172 Mon Sep 17 00:00:00 2001 From: Jose Ulises Nino Rivera Date: Tue, 11 Oct 2016 14:36:40 -0700 Subject: [PATCH] Add cluster configurable dns refresh rate for logical dns and strict dns clusters (#139) --- docs/configuration/cluster_manager/cluster.rst | 9 ++++++++- source/common/upstream/logical_dns_cluster.cc | 4 +++- source/common/upstream/logical_dns_cluster.h | 1 + source/common/upstream/upstream_impl.cc | 5 +++-- source/common/upstream/upstream_impl.h | 1 + test/common/upstream/logical_dns_cluster_test.cc | 5 +++-- test/common/upstream/upstream_impl_test.cc | 11 ++++++----- 7 files changed, 25 insertions(+), 11 deletions(-) diff --git a/docs/configuration/cluster_manager/cluster.rst b/docs/configuration/cluster_manager/cluster.rst index 4cdcb41b7d70..a83ca045c9b6 100644 --- a/docs/configuration/cluster_manager/cluster.rst +++ b/docs/configuration/cluster_manager/cluster.rst @@ -18,7 +18,8 @@ Cluster "ssl_context": "{...}", "features": "...", "http_codec_options": "...", - "alt_stat_name": "..." + "alt_stat_name": "...", + "dns_refresh_rate_ms": "..." } .. _config_cluster_manager_cluster_name: @@ -129,6 +130,12 @@ alt_stat_name ` will be duplicated between the standard statistics and a tree specified by this parameter (e.g., *cluster..*). +dns_refresh_rate_ms + *(optional, integer)* If the dns refresh rate is specified and the cluster type is either *strict_dns*, + or *logical_dns*, this value is used as the cluster's dns refresh rate. If this setting is not specified, + the value defaults to 5000. For cluster types other than *strict_dns* and *logical_dns* this setting is + ignored. + .. toctree:: :hidden: diff --git a/source/common/upstream/logical_dns_cluster.cc b/source/common/upstream/logical_dns_cluster.cc index 8ac64dacfbe9..bd6d134d8b71 100644 --- a/source/common/upstream/logical_dns_cluster.cc +++ b/source/common/upstream/logical_dns_cluster.cc @@ -8,6 +8,8 @@ LogicalDnsCluster::LogicalDnsCluster(const Json::Object& config, Runtime::Loader Stats::Store& stats, Ssl::ContextManager& ssl_context_manager, Network::DnsResolver& dns_resolver, ThreadLocal::Instance& tls) : ClusterImplBase(config, runtime, stats, ssl_context_manager), dns_resolver_(dns_resolver), + dns_refresh_rate_ms_( + std::chrono::milliseconds(config.getInteger("dns_refresh_rate_ms", 5000))), tls_(tls), tls_slot_(tls.allocateSlot()), resolve_timer_(dns_resolver.dispatcher().createTimer([this]() -> void { startResolve(); })) { @@ -61,7 +63,7 @@ void LogicalDnsCluster::startResolve() { initialize_callback_ = nullptr; } - resolve_timer_->enableTimer(std::chrono::milliseconds(5000)); + resolve_timer_->enableTimer(dns_refresh_rate_ms_); }); } diff --git a/source/common/upstream/logical_dns_cluster.h b/source/common/upstream/logical_dns_cluster.h index f650bb8b4ec7..5d13ebd9b93a 100644 --- a/source/common/upstream/logical_dns_cluster.h +++ b/source/common/upstream/logical_dns_cluster.h @@ -69,6 +69,7 @@ class LogicalDnsCluster : public ClusterImplBase { void startResolve(); Network::DnsResolver& dns_resolver_; + const std::chrono::milliseconds dns_refresh_rate_ms_; ThreadLocal::Instance& tls_; uint32_t tls_slot_; std::function initialize_callback_; diff --git a/source/common/upstream/upstream_impl.cc b/source/common/upstream/upstream_impl.cc index 873cc18afe4c..5915f4c3502a 100644 --- a/source/common/upstream/upstream_impl.cc +++ b/source/common/upstream/upstream_impl.cc @@ -262,7 +262,8 @@ StrictDnsClusterImpl::StrictDnsClusterImpl(const Json::Object& config, Runtime:: Ssl::ContextManager& ssl_context_manager, Network::DnsResolver& dns_resolver) : BaseDynamicClusterImpl(config, runtime, stats, ssl_context_manager), - dns_resolver_(dns_resolver) { + dns_resolver_(dns_resolver), dns_refresh_rate_ms_(std::chrono::milliseconds( + config.getInteger("dns_refresh_rate_ms", 5000))) { for (Json::Object& host : config.getObjectArray("hosts")) { resolve_targets_.emplace_back(new ResolveTarget(*this, host.getString("url"))); } @@ -326,7 +327,7 @@ void StrictDnsClusterImpl::ResolveTarget::startResolve() { parent_.initialize_callback_ = nullptr; } - resolve_timer_->enableTimer(std::chrono::milliseconds(5000)); + resolve_timer_->enableTimer(parent_.dns_refresh_rate_ms_); }); } diff --git a/source/common/upstream/upstream_impl.h b/source/common/upstream/upstream_impl.h index dabb60f040d9..0b7573af771c 100644 --- a/source/common/upstream/upstream_impl.h +++ b/source/common/upstream/upstream_impl.h @@ -269,6 +269,7 @@ class StrictDnsClusterImpl : public BaseDynamicClusterImpl { Network::DnsResolver& dns_resolver_; std::list resolve_targets_; + const std::chrono::milliseconds dns_refresh_rate_ms_; }; } // Upstream diff --git a/test/common/upstream/logical_dns_cluster_test.cc b/test/common/upstream/logical_dns_cluster_test.cc index 5dabfeb2af0f..da67a259fea5 100644 --- a/test/common/upstream/logical_dns_cluster_test.cc +++ b/test/common/upstream/logical_dns_cluster_test.cc @@ -63,7 +63,8 @@ TEST_F(LogicalDnsClusterTest, Basic) { "connect_timeout_ms": 250, "type": "logical_dns", "lb_type": "round_robin", - "hosts": [{"url": "tcp://foo.bar.com:443"}] + "hosts": [{"url": "tcp://foo.bar.com:443"}], + "dns_refresh_rate_ms": 4000 } )EOF"; @@ -72,7 +73,7 @@ TEST_F(LogicalDnsClusterTest, Basic) { EXPECT_CALL(membership_updated_, ready()); EXPECT_CALL(initialized_, ready()); - EXPECT_CALL(*resolve_timer_, enableTimer(_)); + EXPECT_CALL(*resolve_timer_, enableTimer(std::chrono::milliseconds(4000))); dns_callback_({"127.0.0.1", "127.0.0.2"}); EXPECT_EQ(1UL, cluster_->hosts().size()); diff --git a/test/common/upstream/upstream_impl_test.cc b/test/common/upstream/upstream_impl_test.cc index 01c86610e744..db4ac8f6c46a 100644 --- a/test/common/upstream/upstream_impl_test.cc +++ b/test/common/upstream/upstream_impl_test.cc @@ -58,6 +58,7 @@ TEST(StrictDnsClusterImplTest, Basic) { "name": "name", "connect_timeout_ms": 250, "type": "strict_dns", + "dns_refresh_rate_ms": 4000, "lb_type": "round_robin", "circuit_breakers": { "default": { @@ -97,7 +98,7 @@ TEST(StrictDnsClusterImplTest, Basic) { -> void { membership_updated.ready(); }); resolver1.expectResolve(dns_resolver); - EXPECT_CALL(*resolver1.timer_, enableTimer(_)); + EXPECT_CALL(*resolver1.timer_, enableTimer(std::chrono::milliseconds(4000))); EXPECT_CALL(membership_updated, ready()); resolver1.dns_callback_({"127.0.0.1", "127.0.0.2"}); EXPECT_THAT(std::list({"tcp://127.0.0.1:11001", "tcp://127.0.0.2:11001"}), @@ -105,26 +106,26 @@ TEST(StrictDnsClusterImplTest, Basic) { resolver1.expectResolve(dns_resolver); resolver1.timer_->callback_(); - EXPECT_CALL(*resolver1.timer_, enableTimer(_)); + EXPECT_CALL(*resolver1.timer_, enableTimer(std::chrono::milliseconds(4000))); resolver1.dns_callback_({"127.0.0.2", "127.0.0.1"}); EXPECT_THAT(std::list({"tcp://127.0.0.1:11001", "tcp://127.0.0.2:11001"}), ContainerEq(hostListToURLs(cluster.hosts()))); resolver1.expectResolve(dns_resolver); resolver1.timer_->callback_(); - EXPECT_CALL(*resolver1.timer_, enableTimer(_)); + EXPECT_CALL(*resolver1.timer_, enableTimer(std::chrono::milliseconds(4000))); resolver1.dns_callback_({"127.0.0.2", "127.0.0.1"}); EXPECT_THAT(std::list({"tcp://127.0.0.1:11001", "tcp://127.0.0.2:11001"}), ContainerEq(hostListToURLs(cluster.hosts()))); resolver1.timer_->callback_(); - EXPECT_CALL(*resolver1.timer_, enableTimer(_)); + EXPECT_CALL(*resolver1.timer_, enableTimer(std::chrono::milliseconds(4000))); EXPECT_CALL(membership_updated, ready()); resolver1.dns_callback_({"127.0.0.3"}); EXPECT_THAT(std::list({"tcp://127.0.0.3:11001"}), ContainerEq(hostListToURLs(cluster.hosts()))); - EXPECT_CALL(*resolver2.timer_, enableTimer(_)); + EXPECT_CALL(*resolver2.timer_, enableTimer(std::chrono::milliseconds(4000))); EXPECT_CALL(membership_updated, ready()); resolver2.dns_callback_({"10.0.0.1"}); EXPECT_THAT(std::list({"tcp://127.0.0.3:11001", "tcp://10.0.0.1:11002"}),