From 95ed18128683a4b985e3a07b77635bee6c7d737f Mon Sep 17 00:00:00 2001 From: Wayne Zhang Date: Thu, 16 Aug 2018 21:47:38 +0000 Subject: [PATCH] Not send request when existing GrpcSubscriptionImpl Signed-off-by: Wayne Zhang --- source/common/config/grpc_mux_impl.cc | 8 ++++++++ source/common/config/grpc_mux_impl.h | 8 ++++++-- source/common/config/grpc_subscription_impl.h | 1 + test/common/config/grpc_subscription_test_harness.h | 2 -- 4 files changed, 15 insertions(+), 4 deletions(-) diff --git a/source/common/config/grpc_mux_impl.cc b/source/common/config/grpc_mux_impl.cc index 77b9fc84dc345..75c889ce2d60b 100644 --- a/source/common/config/grpc_mux_impl.cc +++ b/source/common/config/grpc_mux_impl.cc @@ -28,6 +28,14 @@ GrpcMuxImpl::~GrpcMuxImpl() { } } +void GrpcMuxImpl::noMoreRequestSending() { + for (const auto& api_state : api_state_) { + for (auto watch : api_state.second.watches_) { + watch->send_update_ = 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 5f2c99c2e6168..7cf6a4dc4754e 100644 --- a/source/common/config/grpc_mux_impl.h +++ b/source/common/config/grpc_mux_impl.h @@ -30,6 +30,9 @@ class GrpcMuxImpl : public GrpcMux, MonotonicTimeSource& time_source = ProdMonotonicTimeSource::instance_); ~GrpcMuxImpl(); + // Not to send any request, the object is about to be deleted. + void noMoreRequestSending(); + void start() override; GrpcMuxWatchPtr subscribe(const std::string& type_url, const std::vector& resources, GrpcMuxCallbacks& callbacks) override; @@ -57,14 +60,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_(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_ && !resources_.empty()) { parent_.sendDiscoveryRequest(type_url_); } } @@ -75,6 +78,7 @@ class GrpcMuxImpl : public GrpcMux, GrpcMuxImpl& parent_; std::list::iterator entry_; bool inserted_; + bool send_update_; }; // Per muxed API state. diff --git a/source/common/config/grpc_subscription_impl.h b/source/common/config/grpc_subscription_impl.h index 6117b06b7cd10..4b430be9138a7 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_(node, std::move(async_client), dispatcher, service_method, random), grpc_mux_subscription_(grpc_mux_, stats) {} + ~GrpcSubscriptionImpl() { grpc_mux_.noMoreRequestSending(); } // 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 06e22e0ef28a1..b1d46dcc5806d 100644 --- a/test/common/config/grpc_subscription_test_harness.h +++ b/test/common/config/grpc_subscription_test_harness.h @@ -43,8 +43,6 @@ class GrpcSubscriptionTestHarness : public SubscriptionTestHarness { dispatcher_, random_, *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, "");