From ff49fc7b46f9a5696629b6fa9bc265ab58cf7870 Mon Sep 17 00:00:00 2001 From: Yuchen Dai Date: Fri, 10 Apr 2020 05:21:20 -0700 Subject: [PATCH] cluster: warm up strict dns cluster with 0 hosts (#10728) Signed-off-by: Yuchen Dai --- source/common/upstream/strict_dns_cluster.cc | 5 ++++ test/common/upstream/upstream_impl_test.cc | 28 ++++++++++++++++++++ 2 files changed, 33 insertions(+) diff --git a/source/common/upstream/strict_dns_cluster.cc b/source/common/upstream/strict_dns_cluster.cc index cc3142a87aeba..658ec5f9d809d 100644 --- a/source/common/upstream/strict_dns_cluster.cc +++ b/source/common/upstream/strict_dns_cluster.cc @@ -54,6 +54,11 @@ void StrictDnsClusterImpl::startPreInit() { for (const ResolveTargetPtr& target : resolve_targets_) { target->startResolve(); } + // If the config provides no endpoints, the cluster is initialized immediately as if all hosts are + // resolved in failure. + if (resolve_targets_.empty()) { + onPreInitComplete(); + } } void StrictDnsClusterImpl::updateAllHosts(const HostVector& hosts_added, diff --git a/test/common/upstream/upstream_impl_test.cc b/test/common/upstream/upstream_impl_test.cc index e32fef2f110ec..0e6e76c1408dd 100644 --- a/test/common/upstream/upstream_impl_test.cc +++ b/test/common/upstream/upstream_impl_test.cc @@ -192,6 +192,34 @@ class StrictDnsClusterImplTest : public testing::Test, public UpstreamImplTestBa std::make_shared(); }; +TEST_F(StrictDnsClusterImplTest, ZeroHostsIsInializedImmediately) { + ReadyWatcher initialized; + + const std::string yaml = R"EOF( + name: name + connect_timeout: 0.25s + type: STRICT_DNS + lb_policy: ROUND_ROBIN + load_assignment: + endpoints: + - lb_endpoints: + )EOF"; + + envoy::config::cluster::v3::Cluster cluster_config = parseClusterFromV2Yaml(yaml); + Envoy::Stats::ScopePtr scope = stats_.createScope(fmt::format( + "cluster.{}.", cluster_config.alt_stat_name().empty() ? cluster_config.name() + : cluster_config.alt_stat_name())); + Envoy::Server::Configuration::TransportSocketFactoryContextImpl factory_context( + admin_, ssl_context_manager_, *scope, cm_, local_info_, dispatcher_, random_, stats_, + singleton_manager_, tls_, validation_visitor_, *api_); + StrictDnsClusterImpl cluster(cluster_config, runtime_, dns_resolver_, factory_context, + std::move(scope), false); + EXPECT_CALL(initialized, ready()); + cluster.initialize([&]() -> void { initialized.ready(); }); + EXPECT_EQ(0UL, cluster.prioritySet().hostSetsPerPriority()[0]->hosts().size()); + EXPECT_EQ(0UL, cluster.prioritySet().hostSetsPerPriority()[0]->healthyHosts().size()); +} + // Resolve zero hosts, while using health checking. TEST_F(StrictDnsClusterImplTest, ZeroHostsHealthChecker) { ReadyWatcher initialized;