From fbf11c4c80933c5086676ccd43f0d957e94ccd04 Mon Sep 17 00:00:00 2001 From: Yuchen Dai Date: Thu, 9 Apr 2020 21:58:35 +0000 Subject: [PATCH] cluster: warm up strict dns cluster with 0 hosts 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 189eb7e982212..eb7477b5b5cf2 100644 --- a/source/common/upstream/strict_dns_cluster.cc +++ b/source/common/upstream/strict_dns_cluster.cc @@ -55,6 +55,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 a041dbdd72c15..28c658c76b276 100644 --- a/test/common/upstream/upstream_impl_test.cc +++ b/test/common/upstream/upstream_impl_test.cc @@ -194,6 +194,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;