Make channel idle filter more aggressive in cleaning up calls

If call objects leak we never declare a channel idle, which can lead to fd leaks in other processes.

PiperOrigin-RevId: 610613450
pull/35987/head
Craig Tiller 12 months ago committed by Copybara-Service
parent 8b4079f4dd
commit 571da7be78
  1. 1
      src/core/ext/filters/channel_idle/channel_idle_filter.cc
  2. 8
      src/core/ext/filters/channel_idle/channel_idle_filter.h

@ -61,7 +61,6 @@ const NoInterceptor ChannelIdleFilter::Call::OnServerInitialMetadata;
const NoInterceptor ChannelIdleFilter::Call::OnServerTrailingMetadata; const NoInterceptor ChannelIdleFilter::Call::OnServerTrailingMetadata;
const NoInterceptor ChannelIdleFilter::Call::OnClientToServerMessage; const NoInterceptor ChannelIdleFilter::Call::OnClientToServerMessage;
const NoInterceptor ChannelIdleFilter::Call::OnServerToClientMessage; const NoInterceptor ChannelIdleFilter::Call::OnServerToClientMessage;
const NoInterceptor ChannelIdleFilter::Call::OnFinalize;
namespace { namespace {

@ -54,16 +54,20 @@ class ChannelIdleFilter : public ImplementChannelFilter<ChannelIdleFilter> {
explicit Call(ChannelIdleFilter* filter) : filter_(filter) { explicit Call(ChannelIdleFilter* filter) : filter_(filter) {
filter_->IncreaseCallCount(); filter_->IncreaseCallCount();
} }
~Call() { filter_->DecreaseCallCount(); } ~Call() { MaybeDecrement(); }
static const NoInterceptor OnClientInitialMetadata; static const NoInterceptor OnClientInitialMetadata;
static const NoInterceptor OnServerInitialMetadata; static const NoInterceptor OnServerInitialMetadata;
static const NoInterceptor OnServerTrailingMetadata; static const NoInterceptor OnServerTrailingMetadata;
static const NoInterceptor OnClientToServerMessage; static const NoInterceptor OnClientToServerMessage;
static const NoInterceptor OnServerToClientMessage; static const NoInterceptor OnServerToClientMessage;
static const NoInterceptor OnFinalize; void OnFinalize(const grpc_call_final_info*) { MaybeDecrement(); }
private: private:
void MaybeDecrement() {
auto* filter = std::exchange(filter_, nullptr);
if (filter != nullptr) filter->DecreaseCallCount();
}
ChannelIdleFilter* filter_; ChannelIdleFilter* filter_;
}; };

Loading…
Cancel
Save