@@ -18,6 +18,7 @@ namespace Upstream {
1818LogicalDnsCluster::LogicalDnsCluster (const envoy::api::v2::Cluster& cluster,
1919 Runtime::Loader& runtime, Stats::Store& stats,
2020 Ssl::ContextManager& ssl_context_manager,
21+ const LocalInfo::LocalInfo& local_info,
2122 Network::DnsResolverSharedPtr dns_resolver,
2223 ThreadLocal::SlotAllocator& tls, ClusterManager& cm,
2324 Event::Dispatcher& dispatcher, bool added_via_api)
@@ -27,10 +28,19 @@ LogicalDnsCluster::LogicalDnsCluster(const envoy::api::v2::Cluster& cluster,
2728 dns_refresh_rate_ms_(
2829 std::chrono::milliseconds (PROTOBUF_GET_MS_OR_DEFAULT(cluster, dns_refresh_rate, 5000 ))),
2930 tls_(tls.allocateSlot()),
30- resolve_timer_(dispatcher.createTimer([this ]() -> void { startResolve (); })) {
31- const auto & hosts = cluster.hosts ();
32- if (hosts.size () != 1 ) {
33- throw EnvoyException (" logical_dns clusters must have a single host" );
31+ resolve_timer_(dispatcher.createTimer([this ]() -> void { startResolve (); })),
32+ local_info_(local_info),
33+ load_assignment_(cluster.has_load_assignment()
34+ ? cluster.load_assignment()
35+ : Config::Utility::translateClusterHosts(cluster.hosts())) {
36+ const auto & locality_lb_endpoints = load_assignment_.endpoints ();
37+ if (locality_lb_endpoints.size () != 1 || locality_lb_endpoints[0 ].lb_endpoints ().size () != 1 ) {
38+ if (cluster.has_load_assignment ()) {
39+ throw EnvoyException (
40+ " LOGICAL_DNS clusters must have a single locality_lb_endpoint and a single lb_endpoint" );
41+ } else {
42+ throw EnvoyException (" LOGICAL_DNS clusters must have a single host" );
43+ }
3444 }
3545
3646 switch (cluster.dns_lookup_family ()) {
@@ -47,7 +57,8 @@ LogicalDnsCluster::LogicalDnsCluster(const envoy::api::v2::Cluster& cluster,
4757 NOT_REACHED_GCOVR_EXCL_LINE;
4858 }
4959
50- const auto & socket_address = hosts[0 ].socket_address ();
60+ const envoy::api::v2::core::SocketAddress& socket_address =
61+ lbEndpoint ().endpoint ().address ().socket_address ();
5162 dns_url_ = fmt::format (" tcp://{}:{}" , socket_address.address (), socket_address.port_value ());
5263 hostname_ = Network::Utility::hostFromTcpUrl (dns_url_);
5364 Network::Utility::portFromTcpUrl (dns_url_);
@@ -88,7 +99,8 @@ void LogicalDnsCluster::startResolve() {
8899 current_resolved_address_ = new_address;
89100 // Capture URL to avoid a race with another update.
90101 tls_->runOnAllThreads ([this , new_address]() -> void {
91- tls_->getTyped <PerThreadCurrentHostData>().current_resolved_address_ = new_address;
102+ PerThreadCurrentHostData& data = tls_->getTyped <PerThreadCurrentHostData>();
103+ data.current_resolved_address_ = new_address;
92104 });
93105 }
94106
@@ -107,14 +119,16 @@ void LogicalDnsCluster::startResolve() {
107119 new LogicalHost (info_, hostname_, Network::Utility::getIpv6AnyAddress (), *this ));
108120 break ;
109121 }
110- HostVectorSharedPtr new_hosts (new HostVector ());
111- new_hosts->emplace_back (logical_host_);
112- // Given the current config, only EDS clusters support multiple priorities.
113- ASSERT (priority_set_.hostSetsPerPriority ().size () == 1 );
114- auto & first_host_set = priority_set_.getOrCreateHostSet (0 );
115- first_host_set.updateHosts (new_hosts, createHealthyHostList (*new_hosts),
116- HostsPerLocalityImpl::empty (), HostsPerLocalityImpl::empty (),
117- {}, *new_hosts, {});
122+ const auto & locality_lb_endpoint = localityLbEndpoint ();
123+ PriorityStateManager priority_state_manager (*this , local_info_);
124+ priority_state_manager.initializePriorityFor (locality_lb_endpoint);
125+ priority_state_manager.registerHostForPriority (logical_host_, locality_lb_endpoint,
126+ lbEndpoint (), absl::nullopt );
127+
128+ const uint32_t priority = locality_lb_endpoint.priority ();
129+ priority_state_manager.updateClusterPrioritySet (
130+ priority, std::move (priority_state_manager.priorityState ()[priority].first ),
131+ absl::nullopt , absl::nullopt , absl::nullopt );
118132 }
119133 }
120134
@@ -131,7 +145,8 @@ Upstream::Host::CreateConnectionData LogicalDnsCluster::LogicalHost::createConne
131145 return {HostImpl::createConnection (dispatcher, *parent_.info_ , data.current_resolved_address_ ,
132146 options),
133147 HostDescriptionConstSharedPtr{
134- new RealHostDescription (data.current_resolved_address_ , shared_from_this ())}};
148+ new RealHostDescription (data.current_resolved_address_ , parent_.localityLbEndpoint (),
149+ parent_.lbEndpoint (), shared_from_this ())}};
135150}
136151
137152} // namespace Upstream
0 commit comments