Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
43 commits
Select commit Hold shift + click to select a range
0c95fab
upstream cluster: introduce endpoints to allow specifying per cluster…
dio May 1, 2018
a974b87
Update version history
dio May 1, 2018
036a319
review: update DEPRECATED.md
dio May 3, 2018
88090ed
review: update cds.proto doc
dio May 3, 2018
8da2c60
review: add discussion about HealthCheckConfig
dio May 3, 2018
ed08cd2
review: add deprecation note
dio May 3, 2018
9ba78d3
review: translate hosts to endpoints
dio May 3, 2018
14b0d23
review: remove TODO
dio May 3, 2018
bd6ac42
Fix version history entry
dio May 3, 2018
8b2ee7f
review: use LocalityLbEndpoints instead of Endpoints
dio May 3, 2018
e92c5e5
review: implement Cluster.endpoints as LocalityLbEndpoints
dio May 3, 2018
1626fab
Fix logical dns cluster test
dio May 3, 2018
3213dd1
Use ClusterLoadAssignment instead
dio May 8, 2018
d887de6
Merge remote-tracking branch 'upstream/master'
dio May 8, 2018
8629c7b
Back to square 1
dio May 8, 2018
11c77b3
Merge remote-tracking branch 'upstream/master'
dio May 8, 2018
f2bbd12
Merge remote-tracking branch 'upstream/master'
dio May 9, 2018
cf34a06
Refactor static cluster
dio May 9, 2018
c019448
Merge remote-tracking branch 'upstream/master'
dio May 11, 2018
df77682
review: add load_assignment
dio May 11, 2018
2708782
review: health check docs update
dio May 11, 2018
c5db329
Translate cluster hosts to load_assignment
dio May 11, 2018
fc8251e
Update DEPRECATED.md
dio May 11, 2018
675bb90
Fix build api
dio May 11, 2018
5879fd5
review: remove const for translateClusterHosts
dio May 11, 2018
4bfd57e
Locality-aware StrictDnsCluster
dio May 12, 2018
1a48994
Use common function for STATIC and STRICT_DNS
dio May 12, 2018
a34c195
review: update docs
dio May 12, 2018
669fa63
Local info for LOGICAL_DNS
dio May 12, 2018
cb69f92
Add simple tests using load_assignment
dio May 12, 2018
307e247
Fix comments breakpoints
dio May 12, 2018
c724f2a
Context namespacing
dio May 13, 2018
37c6c72
Introduce priority state manager
dio May 13, 2018
81fc59d
Remove initializePrioritySet
dio May 13, 2018
9c6254f
review: reword DEPRECATED.md
dio May 15, 2018
1a2f404
review: update health checking config doc
dio May 15, 2018
572cf12
review: update CDS doc
dio May 15, 2018
decca86
review: NiceMock-ing LocalInfo
dio May 15, 2018
d3ed76e
review: remove context
dio May 15, 2018
b79ddbe
Copy the temporary
dio May 15, 2018
af559be
Fix unnecessary additions and removals
dio May 15, 2018
b88200c
Remove more unnecessary additions and removals
dio May 15, 2018
3cc11be
Update cds.proto next free field
dio May 15, 2018
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 3 additions & 0 deletions DEPRECATED.md
Original file line number Diff line number Diff line change
Expand Up @@ -21,6 +21,9 @@ A logged warning is expected for each deprecated item that is in deprecation win
* `SAN` is replaced by `URI` in the `x-forwarded-client-cert` header.
* The `endpoint` field in the http health check filter is deprecated in favor of the `headers`
field where one can specify HeaderMatch objects to match on.
* The `hosts` field in the `Cluster` is deprecated in favor of the `load_assigment` field. This change
allows CDS static/DNS assignments to contain embedded EDS equivalent endpoint assignments and
accommodates specifying `HealthCheckConfig` for each cluster member.

## Version 1.6.0 (March 20, 2018)

Expand Down
4 changes: 4 additions & 0 deletions api/envoy/api/v2/BUILD
Original file line number Diff line number Diff line change
Expand Up @@ -62,6 +62,7 @@ api_proto_library(
visibility = [":friends"],
deps = [
":discovery",
":eds",
"//envoy/api/v2/auth:cert",
"//envoy/api/v2/cluster:circuit_breaker",
"//envoy/api/v2/cluster:outlier_detection",
Expand All @@ -70,6 +71,7 @@ api_proto_library(
"//envoy/api/v2/core:config_source",
"//envoy/api/v2/core:health_check",
"//envoy/api/v2/core:protocol",
"//envoy/api/v2/endpoint",
"//envoy/type:percent",
],
)
Expand All @@ -79,6 +81,7 @@ api_go_grpc_library(
proto = ":cds",
deps = [
":discovery_go_proto",
":eds_go_grpc",
"//envoy/api/v2/auth:cert_go_proto",
"//envoy/api/v2/cluster:circuit_breaker_go_proto",
"//envoy/api/v2/cluster:outlier_detection_go_proto",
Expand All @@ -87,6 +90,7 @@ api_go_grpc_library(
"//envoy/api/v2/core:config_source_go_proto",
"//envoy/api/v2/core:health_check_go_proto",
"//envoy/api/v2/core:protocol_go_proto",
"//envoy/api/v2/endpoint:endpoint_go_proto",
"//envoy/type:percent_go_proto",
],
)
Expand Down
25 changes: 20 additions & 5 deletions api/envoy/api/v2/cds.proto
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,7 @@ import "envoy/api/v2/core/health_check.proto";
import "envoy/api/v2/core/protocol.proto";
import "envoy/api/v2/cluster/circuit_breaker.proto";
import "envoy/api/v2/cluster/outlier_detection.proto";
import "envoy/api/v2/eds.proto";
import "envoy/type/percent.proto";

import "google/api/annotations.proto";
Expand Down Expand Up @@ -41,7 +42,7 @@ service ClusterDiscoveryService {
// [#protodoc-title: Clusters]

// Configuration for a single upstream cluster.
// [#comment:next free field: 32]
// [#comment:next free field: 34]
message Cluster {
// Supplies the name of the cluster which must be unique across all clusters.
// The cluster name is used when emitting
Expand Down Expand Up @@ -150,12 +151,26 @@ message Cluster {
// when picking a host in the cluster.
LbPolicy lb_policy = 6 [(validate.rules).enum.defined_only = true];

// If the service discovery type is
// Setting this is a requirement for clusters with discovery type
// :ref:`STATIC<envoy_api_enum_value_Cluster.DiscoveryType.STATIC>`,
// :ref:`STRICT_DNS<envoy_api_enum_value_Cluster.DiscoveryType.STRICT_DNS>`
// or :ref:`LOGICAL_DNS<envoy_api_enum_value_Cluster.DiscoveryType.LOGICAL_DNS>`,
// then hosts is required.
repeated core.Address hosts = 7;
// or :ref:`LOGICAL_DNS<envoy_api_enum_value_Cluster.DiscoveryType.LOGICAL_DNS>`.
// **This field is deprecated**. Set the :ref:`load_assignment<envoy_api_field_Cluster.load_assignment>`
// field instead.
repeated core.Address hosts = 7 [deprecated = true];
Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@htuch what's our policy on docs and deprecation? I'd be inclined to say when we deprecate a field we should update the relevant docs (i.e. updating use of hosts in v2_overview.html) so folks cribbing configuration will be cribbing the new way of doing things and not the deprecated way of doing things.

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Ideally, yes.


// Setting this is required for specifying members of
// :ref:`STATIC<envoy_api_enum_value_Cluster.DiscoveryType.STATIC>`,
Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Can you update

// The upstream host address.
to indicate that the interpretation of the Address depends on the cluster type. For static, it will be expected to be a direct IP address (or something resolvable by the specified resolver in the Address). For logical/static DNS, it will be expected to be a hostname, resolved via DNS.

This is actually a bit more complicated thinking about it. See the wording at

// hostname to be resolved via DNS. If it is a hostname, :ref:`resolver_name
. I think we should try and get clear in the API (with some implementation TODOs) what the final relationship is going to be between the custom resolvers (which can apply to listener addresses as well, and act on port values/names) and the DNS resolvers for Clusters. @mattklein123 WDYT on this? Seems a rough edge in the API.

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Yeah I don't know. That's a good question. Should we just say that custom resolvers can't be used at all with DNS discovery types and block it? I don't think it really makes sense and is confusing. If we do that, I think we can have error checking / error messages to guide people in the right direction...

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This would be reasonable. I think if we had the custom resolvers able to operate async, and some hooks to detect DNS changes, we could replace the hardcoded DNS cluster types with just resolver extensions. But, moving the resolver extension model to be expressive enough and then plumbing this would be a fair chunk of work.

// :ref:`STRICT_DNS<envoy_api_enum_value_Cluster.DiscoveryType.STRICT_DNS>`
// or :ref:`LOGICAL_DNS<envoy_api_enum_value_Cluster.DiscoveryType.LOGICAL_DNS>` clusters.
// This field supersedes :ref:`hosts<envoy_api_field_Cluster.hosts>` field.
//
// .. attention::
//
// Setting this allows CDS static/DNS assignments to contain embedded EDS equivalent
// :ref:`endpoint assignments<envoy_api_msg_ClusterLoadAssignment>`.
// Setting this overrides :ref:`hosts<envoy_api_field_Cluster.hosts>` values.
ClusterLoadAssignment load_assignment = 33;

// Optional :ref:`active health checking <arch_overview_health_checking>`
// configuration for the cluster. If no
Expand Down
6 changes: 3 additions & 3 deletions api/envoy/api/v2/endpoint/endpoint.proto
Original file line number Diff line number Diff line change
Expand Up @@ -21,7 +21,7 @@ message Endpoint {
// The upstream host address.
core.Address address = 1;

// [#not-implemented-hide:] The optional health check configuration.
// The optional health check configuration.
message HealthCheckConfig {
// Optional alternative health check port value.
//
Expand All @@ -32,8 +32,8 @@ message Endpoint {
uint32 port_value = 1;
}

// [#not-implemented-hide:] The optional health check configuration is used as
// configuration for the health checker to contact the health checked host.
// The optional health check configuration is used as configuration for the health checker
// to contact the health checked host.
//
// .. attention::
//
Expand Down
29 changes: 29 additions & 0 deletions docs/root/intro/arch_overview/health_checking.rst
Original file line number Diff line number Diff line change
Expand Up @@ -24,6 +24,35 @@ unhealthy, successes required before marking a host healthy, etc.):
maintenance by setting the specified key to any value and waiting for traffic to drain. See
:ref:`redis_key <config_cluster_manager_cluster_hc_redis_key>`.

Per cluster member health checking config
-----------------------------------------

If active health checking is configured for an upstream cluster, a specific additional configuration
for each registered member can be specified by setting the
:ref:`health check config<envoy_api_msg_endpoint.Endpoint.HealthCheckConfig>`
in :ref:`endpoint message<envoy_api_msg_endpoint.Endpoint>`
of an :ref:`LbEndpoint<envoy_api_msg_endpoint.LbEndpoint>` of each defined
:ref:`LocalityLbEndpoints<envoy_api_msg_endpoint.LocalityLbEndpoints>`
in a :ref:`ClusterLoadAssignment<envoy_api_msg_ClusterLoadAssignment>`.

An example of setting up :ref:`health check config<envoy_api_msg_endpoint.Endpoint.HealthCheckConfig>`
to set a :ref:`cluster member<envoy_api_msg_endpoint.Endpoint>`'s alternative health check
:ref:`port<envoy_api_field_endpoint.Endpoint.HealthCheckConfig.port_value>` is:

.. code-block:: yaml

load_assignment:
endpoints:
- lb_endpoints:
- endpoint:
health_check_config:
port_value: 8080

address:
socket_address:
address: localhost
port_value: 80

Passive health checking
-----------------------

Expand Down
15 changes: 15 additions & 0 deletions source/common/config/utility.cc
Original file line number Diff line number Diff line change
Expand Up @@ -228,5 +228,20 @@ Grpc::AsyncClientFactoryPtr Utility::factoryForGrpcApiConfigSource(
return async_client_manager.factoryForGrpcService(grpc_service, scope, false);
}

envoy::api::v2::ClusterLoadAssignment Utility::translateClusterHosts(
const Protobuf::RepeatedPtrField<envoy::api::v2::core::Address>& hosts) {
envoy::api::v2::ClusterLoadAssignment load_assignment;
envoy::api::v2::endpoint::LocalityLbEndpoints* locality_lb_endpoints =
load_assignment.add_endpoints();
// Since this LocalityLbEndpoints is built from hosts list, set the default weight to 1.
locality_lb_endpoints->mutable_load_balancing_weight()->set_value(1);
for (const envoy::api::v2::core::Address& host : hosts) {
envoy::api::v2::endpoint::LbEndpoint* lb_endpoint = locality_lb_endpoints->add_lb_endpoints();
lb_endpoint->mutable_endpoint()->mutable_address()->MergeFrom(host);
lb_endpoint->mutable_load_balancing_weight()->set_value(1);
}
return load_assignment;
}

} // namespace Config
} // namespace Envoy
8 changes: 8 additions & 0 deletions source/common/config/utility.h
Original file line number Diff line number Diff line change
Expand Up @@ -284,6 +284,14 @@ class Utility {
factoryForGrpcApiConfigSource(Grpc::AsyncClientManager& async_client_manager,
const envoy::api::v2::core::ApiConfigSource& api_config_source,
Stats::Scope& scope);

/**
* Translate a set of cluster's hosts into a load assignment configuration.
* @param hosts cluster's list of hosts.
* @return envoy::api::v2::ClusterLoadAssignment a load assignment configuration.
*/
static envoy::api::v2::ClusterLoadAssignment
translateClusterHosts(const Protobuf::RepeatedPtrField<envoy::api::v2::core::Address>& hosts);
};

} // namespace Config
Expand Down
37 changes: 22 additions & 15 deletions source/common/upstream/logical_dns_cluster.cc
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,7 @@ namespace Upstream {
LogicalDnsCluster::LogicalDnsCluster(const envoy::api::v2::Cluster& cluster,
Runtime::Loader& runtime, Stats::Store& stats,
Ssl::ContextManager& ssl_context_manager,
const LocalInfo::LocalInfo& local_info,
Network::DnsResolverSharedPtr dns_resolver,
ThreadLocal::SlotAllocator& tls, ClusterManager& cm,
Event::Dispatcher& dispatcher, bool added_via_api)
Expand All @@ -26,10 +27,15 @@ LogicalDnsCluster::LogicalDnsCluster(const envoy::api::v2::Cluster& cluster,
dns_refresh_rate_ms_(
std::chrono::milliseconds(PROTOBUF_GET_MS_OR_DEFAULT(cluster, dns_refresh_rate, 5000))),
tls_(tls.allocateSlot()),
resolve_timer_(dispatcher.createTimer([this]() -> void { startResolve(); })) {
const auto& hosts = cluster.hosts();
if (hosts.size() != 1) {
throw EnvoyException("logical_dns clusters must have a single host");
resolve_timer_(dispatcher.createTimer([this]() -> void { startResolve(); })),
priority_state_manager_(new PriorityStateManager(*this, local_info)),
load_assignment_(cluster.has_load_assignment()
? cluster.load_assignment()
: Config::Utility::translateClusterHosts(cluster.hosts())) {
const auto& locality_lb_endpoints = load_assignment_.endpoints();
if (locality_lb_endpoints.size() != 1 || locality_lb_endpoints[0].lb_endpoints().size() != 1) {
throw EnvoyException(
"LOGICAL_DNS clusters must have a single locality_lb_endpoint and a single lb_endpoint");
Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Is there a test for this?

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

If I were using the deprecated hosts I'd be really confused at Envoy throwing an error message about there needing to be a single lb_endpoint. I'd encourage switching on the configuration type so for we still have helpful error messages during the transition.

}

switch (cluster.dns_lookup_family()) {
Expand All @@ -46,10 +52,12 @@ LogicalDnsCluster::LogicalDnsCluster(const envoy::api::v2::Cluster& cluster,
NOT_REACHED;
}

const auto& socket_address = hosts[0].socket_address();
const envoy::api::v2::core::SocketAddress& socket_address =
lbEndpoint().endpoint().address().socket_address();
dns_url_ = fmt::format("tcp://{}:{}", socket_address.address(), socket_address.port_value());
hostname_ = Network::Utility::hostFromTcpUrl(dns_url_);
Network::Utility::portFromTcpUrl(dns_url_);
priority_state_manager_->initializePerPriority(localityLbEndpoint());

tls_->set([](Event::Dispatcher&) -> ThreadLocal::ThreadLocalObjectSharedPtr {
return std::make_shared<PerThreadCurrentHostData>();
Expand Down Expand Up @@ -87,7 +95,8 @@ void LogicalDnsCluster::startResolve() {
current_resolved_address_ = new_address;
// Capture URL to avoid a race with another update.
tls_->runOnAllThreads([this, new_address]() -> void {
tls_->getTyped<PerThreadCurrentHostData>().current_resolved_address_ = new_address;
PerThreadCurrentHostData& data = tls_->getTyped<PerThreadCurrentHostData>();
data.current_resolved_address_ = new_address;
});
}

Expand All @@ -106,14 +115,11 @@ void LogicalDnsCluster::startResolve() {
new LogicalHost(info_, hostname_, Network::Utility::getIpv6AnyAddress(), *this));
break;
}
HostVectorSharedPtr new_hosts(new HostVector());
new_hosts->emplace_back(logical_host_);
// Given the current config, only EDS clusters support multiple priorities.
ASSERT(priority_set_.hostSetsPerPriority().size() == 1);
auto& first_host_set = priority_set_.getOrCreateHostSet(0);
first_host_set.updateHosts(new_hosts, createHealthyHostList(*new_hosts),
HostsPerLocalityImpl::empty(), HostsPerLocalityImpl::empty(),
{}, *new_hosts, {});

const uint32_t priority = localityLbEndpoint().priority();
priority_state_manager_->registerHostPerPriority(logical_host_, priority);
Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

registerHostForPriority?

priority_state_manager_->updateClusterPrioritySet(priority, absl::nullopt,
absl::nullopt, false);
}
}

Expand All @@ -130,7 +136,8 @@ Upstream::Host::CreateConnectionData LogicalDnsCluster::LogicalHost::createConne
return {HostImpl::createConnection(dispatcher, *parent_.info_, data.current_resolved_address_,
options),
HostDescriptionConstSharedPtr{
new RealHostDescription(data.current_resolved_address_, shared_from_this())}};
new RealHostDescription(data.current_resolved_address_, parent_.localityLbEndpoint(),
parent_.lbEndpoint(), shared_from_this())}};
}

} // namespace Upstream
Expand Down
42 changes: 34 additions & 8 deletions source/common/upstream/logical_dns_cluster.h
Original file line number Diff line number Diff line change
Expand Up @@ -30,6 +30,7 @@ class LogicalDnsCluster : public ClusterImplBase {
public:
LogicalDnsCluster(const envoy::api::v2::Cluster& cluster, Runtime::Loader& runtime,
Stats::Store& stats, Ssl::ContextManager& ssl_context_manager,
const LocalInfo::LocalInfo& local_info,
Network::DnsResolverSharedPtr dns_resolver, ThreadLocal::SlotAllocator& tls,
ClusterManager& cm, Event::Dispatcher& dispatcher, bool added_via_api);

Expand All @@ -42,9 +43,10 @@ class LogicalDnsCluster : public ClusterImplBase {
struct LogicalHost : public HostImpl {
LogicalHost(ClusterInfoConstSharedPtr cluster, const std::string& hostname,
Network::Address::InstanceConstSharedPtr address, LogicalDnsCluster& parent)
: HostImpl(cluster, hostname, address, envoy::api::v2::core::Metadata::default_instance(),
1, envoy::api::v2::core::Locality().default_instance(),
envoy::api::v2::endpoint::Endpoint::HealthCheckConfig().default_instance()),
: HostImpl(cluster, hostname, address, parent.lbEndpoint().metadata(),
parent.lbEndpoint().load_balancing_weight().value(),
parent.localityLbEndpoint().locality(),
parent.lbEndpoint().endpoint().health_check_config()),
parent_(parent) {}

// Upstream::Host
Expand All @@ -57,13 +59,22 @@ class LogicalDnsCluster : public ClusterImplBase {

struct RealHostDescription : public HostDescription {
RealHostDescription(Network::Address::InstanceConstSharedPtr address,
const envoy::api::v2::endpoint::LocalityLbEndpoints& locality_lb_endpoint,
const envoy::api::v2::endpoint::LbEndpoint& lb_endpoint,
HostConstSharedPtr logical_host)
: address_(address), logical_host_(logical_host) {}
: address_(address),
health_check_address_(
lb_endpoint.endpoint().health_check_config().port_value() == 0
? address
: Network::Utility::getAddressWithPort(
*address, lb_endpoint.endpoint().health_check_config().port_value())),
locality_lb_endpoint_(locality_lb_endpoint), lb_endpoint_(lb_endpoint),
logical_host_(logical_host) {}

// Upstream:HostDescription
bool canary() const override { return false; }
const envoy::api::v2::core::Metadata& metadata() const override {
return envoy::api::v2::core::Metadata::default_instance();
return lb_endpoint_.metadata();
}
const ClusterInfo& cluster() const override { return logical_host_->cluster(); }
HealthCheckHostMonitor& healthChecker() const override {
Expand All @@ -76,20 +87,33 @@ class LogicalDnsCluster : public ClusterImplBase {
const std::string& hostname() const override { return logical_host_->hostname(); }
Network::Address::InstanceConstSharedPtr address() const override { return address_; }
const envoy::api::v2::core::Locality& locality() const override {
return envoy::api::v2::core::Locality().default_instance();
return locality_lb_endpoint_.locality();
}
// TODO(dio): To support different address port.
Network::Address::InstanceConstSharedPtr healthCheckAddress() const override {
return address_;
return health_check_address_;
}
uint32_t priority() const { return locality_lb_endpoint_.priority(); }
Network::Address::InstanceConstSharedPtr address_;
Network::Address::InstanceConstSharedPtr health_check_address_;
const envoy::api::v2::endpoint::LocalityLbEndpoints& locality_lb_endpoint_;
const envoy::api::v2::endpoint::LbEndpoint& lb_endpoint_;
HostConstSharedPtr logical_host_;
};

struct PerThreadCurrentHostData : public ThreadLocal::ThreadLocalObject {
Network::Address::InstanceConstSharedPtr current_resolved_address_;
};

const envoy::api::v2::endpoint::LocalityLbEndpoints& localityLbEndpoint() const {
ASSERT(load_assignment_.endpoints().size() == 1);
Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Can you add a comment explaining this is checked in the constructor (at config load time)?

return load_assignment_.endpoints()[0];
}

const envoy::api::v2::endpoint::LbEndpoint& lbEndpoint() const {
ASSERT(localityLbEndpoint().lb_endpoints().size() == 1);
Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Ditto.

return localityLbEndpoint().lb_endpoints()[0];
}

void startResolve();

// ClusterImplBase
Expand All @@ -105,6 +129,8 @@ class LogicalDnsCluster : public ClusterImplBase {
Network::Address::InstanceConstSharedPtr current_resolved_address_;
HostSharedPtr logical_host_;
Network::ActiveDnsQuery* active_dns_query_{};
PriorityStateManagerPtr priority_state_manager_;
const envoy::api::v2::ClusterLoadAssignment load_assignment_;
};

} // namespace Upstream
Expand Down
Loading