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 11 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::OnClientToServerMessage;
const NoInterceptor ChannelIdleFilter::Call::OnServerToClientMessage;
const NoInterceptor ChannelIdleFilter::Call::OnFinalize;
namespace {

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

Loading…
Cancel
Save