diff --git a/source/common/config/grpc_mux_impl.cc b/source/common/config/grpc_mux_impl.cc index 3481859da1734..6d4267828fd01 100644 --- a/source/common/config/grpc_mux_impl.cc +++ b/source/common/config/grpc_mux_impl.cc @@ -29,6 +29,14 @@ GrpcMuxImpl::~GrpcMuxImpl() { } } +void GrpcMuxImpl::disableSendUpdateAtWatcherDelete() { + for (const auto& api_state : api_state_) { + for (auto watch : api_state.second.watches_) { + watch->send_update_at_delete_ = false; + } + } +} + void GrpcMuxImpl::start() { establishNewStream(); } void GrpcMuxImpl::setRetryTimer() { diff --git a/source/common/config/grpc_mux_impl.h b/source/common/config/grpc_mux_impl.h index ef482b5b75f3b..61e9839858e14 100644 --- a/source/common/config/grpc_mux_impl.h +++ b/source/common/config/grpc_mux_impl.h @@ -29,6 +29,9 @@ class GrpcMuxImpl : public GrpcMux, Runtime::RandomGenerator& random); ~GrpcMuxImpl(); + // Not to send any update requests when watchers are removed. + void disableSendUpdateAtWatcherDelete(); + void start() override; GrpcMuxWatchPtr subscribe(const std::string& type_url, const std::vector& resources, GrpcMuxCallbacks& callbacks) override; @@ -56,14 +59,14 @@ class GrpcMuxImpl : public GrpcMux, GrpcMuxWatchImpl(const std::vector& resources, GrpcMuxCallbacks& callbacks, const std::string& type_url, GrpcMuxImpl& parent) : resources_(resources), callbacks_(callbacks), type_url_(type_url), parent_(parent), - inserted_(true) { + inserted_(true), send_update_at_delete_(true) { entry_ = parent.api_state_[type_url].watches_.emplace( parent.api_state_[type_url].watches_.begin(), this); } ~GrpcMuxWatchImpl() override { if (inserted_) { parent_.api_state_[type_url_].watches_.erase(entry_); - if (!resources_.empty()) { + if (send_update_at_delete_ && !resources_.empty()) { parent_.sendDiscoveryRequest(type_url_); } } @@ -74,6 +77,7 @@ class GrpcMuxImpl : public GrpcMux, GrpcMuxImpl& parent_; std::list::iterator entry_; bool inserted_; + bool send_update_at_delete_; }; // Per muxed API state. diff --git a/source/common/config/grpc_subscription_impl.h b/source/common/config/grpc_subscription_impl.h index 442a9b4fab02b..ecb8a934e0482 100644 --- a/source/common/config/grpc_subscription_impl.h +++ b/source/common/config/grpc_subscription_impl.h @@ -19,6 +19,7 @@ class GrpcSubscriptionImpl : public Config::Subscription { const Protobuf::MethodDescriptor& service_method, SubscriptionStats stats) : grpc_mux_(local_info, std::move(async_client), dispatcher, service_method, random), grpc_mux_subscription_(grpc_mux_, stats) {} + ~GrpcSubscriptionImpl() { grpc_mux_.disableSendUpdateAtWatcherDelete(); } // Config::Subscription void start(const std::vector& resources, diff --git a/test/common/config/grpc_subscription_test_harness.h b/test/common/config/grpc_subscription_test_harness.h index e28e076b09e37..9cb2690ba0d76 100644 --- a/test/common/config/grpc_subscription_test_harness.h +++ b/test/common/config/grpc_subscription_test_harness.h @@ -45,8 +45,6 @@ class GrpcSubscriptionTestHarness : public SubscriptionTestHarness { *method_descriptor_, stats_)); } - ~GrpcSubscriptionTestHarness() { EXPECT_CALL(async_stream_, sendMessage(_, false)); } - void expectSendMessage(const std::vector& cluster_names, const std::string& version) override { expectSendMessage(cluster_names, version, Grpc::Status::GrpcStatus::Ok, "");