xDS watchers: use C++14 and skip events on stale RDS watchers (#31675)

* xDS watchers: use C++14 and skip events on stale RDS watchers

* Automated change: Fix sanity tests

Co-authored-by: markdroth <markdroth@users.noreply.github.com>
pull/31688/head
Mark D. Roth 2 years ago committed by GitHub
parent 3d68bb735a
commit cf666c4c20
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
  1. 25
      src/core/ext/filters/client_channel/lb_policy/xds/cds.cc
  2. 23
      src/core/ext/filters/client_channel/lb_policy/xds/xds_cluster_resolver.cc
  3. 56
      src/core/ext/filters/client_channel/resolver/xds/xds_resolver.cc

@ -122,31 +122,28 @@ class CdsLb : public LoadBalancingPolicy {
: parent_(std::move(parent)), name_(std::move(name)) {} : parent_(std::move(parent)), name_(std::move(name)) {}
void OnResourceChanged(XdsClusterResource cluster_data) override { void OnResourceChanged(XdsClusterResource cluster_data) override {
Ref().release(); // Ref held by lambda RefCountedPtr<ClusterWatcher> self = Ref();
parent_->work_serializer()->Run( parent_->work_serializer()->Run(
// TODO(roth): When we move to C++14, capture cluster_data with [self = std::move(self),
// std::move(). cluster_data = std::move(cluster_data)]() mutable {
[this, cluster_data]() mutable { self->parent_->OnClusterChanged(self->name_,
parent_->OnClusterChanged(name_, std::move(cluster_data)); std::move(cluster_data));
Unref();
}, },
DEBUG_LOCATION); DEBUG_LOCATION);
} }
void OnError(absl::Status status) override { void OnError(absl::Status status) override {
Ref().release(); // Ref held by lambda RefCountedPtr<ClusterWatcher> self = Ref();
parent_->work_serializer()->Run( parent_->work_serializer()->Run(
[this, status]() { [self = std::move(self), status = std::move(status)]() mutable {
parent_->OnError(name_, status); self->parent_->OnError(self->name_, std::move(status));
Unref();
}, },
DEBUG_LOCATION); DEBUG_LOCATION);
} }
void OnResourceDoesNotExist() override { void OnResourceDoesNotExist() override {
Ref().release(); // Ref held by lambda RefCountedPtr<ClusterWatcher> self = Ref();
parent_->work_serializer()->Run( parent_->work_serializer()->Run(
[this]() { [self = std::move(self)]() {
parent_->OnResourceDoesNotExist(name_); self->parent_->OnResourceDoesNotExist(self->name_);
Unref();
}, },
DEBUG_LOCATION); DEBUG_LOCATION);
} }

@ -209,31 +209,26 @@ class XdsClusterResolverLb : public LoadBalancingPolicy {
discovery_mechanism_.reset(DEBUG_LOCATION, "EndpointWatcher"); discovery_mechanism_.reset(DEBUG_LOCATION, "EndpointWatcher");
} }
void OnResourceChanged(XdsEndpointResource update) override { void OnResourceChanged(XdsEndpointResource update) override {
Ref().release(); // ref held by callback RefCountedPtr<EndpointWatcher> self = Ref();
discovery_mechanism_->parent()->work_serializer()->Run( discovery_mechanism_->parent()->work_serializer()->Run(
// TODO(yashykt): When we move to C++14, capture update with [self = std::move(self), update = std::move(update)]() mutable {
// std::move self->OnResourceChangedHelper(std::move(update));
[this, update]() mutable {
OnResourceChangedHelper(std::move(update));
Unref();
}, },
DEBUG_LOCATION); DEBUG_LOCATION);
} }
void OnError(absl::Status status) override { void OnError(absl::Status status) override {
Ref().release(); // ref held by callback RefCountedPtr<EndpointWatcher> self = Ref();
discovery_mechanism_->parent()->work_serializer()->Run( discovery_mechanism_->parent()->work_serializer()->Run(
[this, status]() { [self = std::move(self), status = std::move(status)]() mutable {
OnErrorHelper(status); self->OnErrorHelper(std::move(status));
Unref();
}, },
DEBUG_LOCATION); DEBUG_LOCATION);
} }
void OnResourceDoesNotExist() override { void OnResourceDoesNotExist() override {
Ref().release(); // ref held by callback RefCountedPtr<EndpointWatcher> self = Ref();
discovery_mechanism_->parent()->work_serializer()->Run( discovery_mechanism_->parent()->work_serializer()->Run(
[this]() { [self = std::move(self)]() {
OnResourceDoesNotExistHelper(); self->OnResourceDoesNotExistHelper();
Unref();
}, },
DEBUG_LOCATION); DEBUG_LOCATION);
} }

@ -156,33 +156,29 @@ class XdsResolver : public Resolver {
explicit ListenerWatcher(RefCountedPtr<XdsResolver> resolver) explicit ListenerWatcher(RefCountedPtr<XdsResolver> resolver)
: resolver_(std::move(resolver)) {} : resolver_(std::move(resolver)) {}
void OnResourceChanged(XdsListenerResource listener) override { void OnResourceChanged(XdsListenerResource listener) override {
Ref().release(); // ref held by lambda RefCountedPtr<ListenerWatcher> self = Ref();
resolver_->work_serializer_->Run( resolver_->work_serializer_->Run(
// TODO(yashykt): When we move to C++14, capture listener with [self = std::move(self), listener = std::move(listener)]() mutable {
// std::move self->resolver_->OnListenerUpdate(std::move(listener));
[this, listener]() mutable {
resolver_->OnListenerUpdate(std::move(listener));
Unref();
}, },
DEBUG_LOCATION); DEBUG_LOCATION);
} }
void OnError(absl::Status status) override { void OnError(absl::Status status) override {
Ref().release(); // ref held by lambda RefCountedPtr<ListenerWatcher> self = Ref();
resolver_->work_serializer_->Run( resolver_->work_serializer_->Run(
[this, status]() { [self = std::move(self), status = std::move(status)]() mutable {
resolver_->OnError(resolver_->lds_resource_name_, status); self->resolver_->OnError(self->resolver_->lds_resource_name_,
Unref(); std::move(status));
}, },
DEBUG_LOCATION); DEBUG_LOCATION);
} }
void OnResourceDoesNotExist() override { void OnResourceDoesNotExist() override {
Ref().release(); // ref held by lambda RefCountedPtr<ListenerWatcher> self = Ref();
resolver_->work_serializer_->Run( resolver_->work_serializer_->Run(
[this]() { [self = std::move(self)]() {
resolver_->OnResourceDoesNotExist( self->resolver_->OnResourceDoesNotExist(
absl::StrCat(resolver_->lds_resource_name_, absl::StrCat(self->resolver_->lds_resource_name_,
": xDS listener resource does not exist")); ": xDS listener resource does not exist"));
Unref();
}, },
DEBUG_LOCATION); DEBUG_LOCATION);
} }
@ -197,33 +193,33 @@ class XdsResolver : public Resolver {
explicit RouteConfigWatcher(RefCountedPtr<XdsResolver> resolver) explicit RouteConfigWatcher(RefCountedPtr<XdsResolver> resolver)
: resolver_(std::move(resolver)) {} : resolver_(std::move(resolver)) {}
void OnResourceChanged(XdsRouteConfigResource route_config) override { void OnResourceChanged(XdsRouteConfigResource route_config) override {
Ref().release(); // ref held by lambda RefCountedPtr<RouteConfigWatcher> self = Ref();
resolver_->work_serializer_->Run( resolver_->work_serializer_->Run(
// TODO(yashykt): When we move to C++14, capture route_config with [self = std::move(self),
// std::move route_config = std::move(route_config)]() mutable {
[this, route_config]() mutable { if (self != self->resolver_->route_config_watcher_) return;
resolver_->OnRouteConfigUpdate(std::move(route_config)); self->resolver_->OnRouteConfigUpdate(std::move(route_config));
Unref();
}, },
DEBUG_LOCATION); DEBUG_LOCATION);
} }
void OnError(absl::Status status) override { void OnError(absl::Status status) override {
Ref().release(); // ref held by lambda RefCountedPtr<RouteConfigWatcher> self = Ref();
resolver_->work_serializer_->Run( resolver_->work_serializer_->Run(
[this, status]() { [self = std::move(self), status = std::move(status)]() mutable {
resolver_->OnError(resolver_->route_config_name_, status); if (self != self->resolver_->route_config_watcher_) return;
Unref(); self->resolver_->OnError(self->resolver_->route_config_name_,
std::move(status));
}, },
DEBUG_LOCATION); DEBUG_LOCATION);
} }
void OnResourceDoesNotExist() override { void OnResourceDoesNotExist() override {
Ref().release(); // ref held by lambda RefCountedPtr<RouteConfigWatcher> self = Ref();
resolver_->work_serializer_->Run( resolver_->work_serializer_->Run(
[this]() { [self = std::move(self)]() {
resolver_->OnResourceDoesNotExist(absl::StrCat( if (self != self->resolver_->route_config_watcher_) return;
resolver_->route_config_name_, self->resolver_->OnResourceDoesNotExist(absl::StrCat(
self->resolver_->route_config_name_,
": xDS route configuration resource does not exist")); ": xDS route configuration resource does not exist"));
Unref();
}, },
DEBUG_LOCATION); DEBUG_LOCATION);
} }

Loading…
Cancel
Save