diff --git a/CMakeLists.txt b/CMakeLists.txt
index 123f0048645..95a26f71fc6 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -1833,7 +1833,6 @@ add_library(grpc
src/core/client_channel/subchannel_stream_client.cc
src/core/ext/filters/backend_metrics/backend_metric_filter.cc
src/core/ext/filters/census/grpc_context.cc
- src/core/ext/filters/channel_idle/channel_idle_filter.cc
src/core/ext/filters/channel_idle/idle_filter_state.cc
src/core/ext/filters/channel_idle/legacy_channel_idle_filter.cc
src/core/ext/filters/deadline/deadline_filter.cc
@@ -2929,7 +2928,6 @@ add_library(grpc_unsecure
src/core/client_channel/subchannel_stream_client.cc
src/core/ext/filters/backend_metrics/backend_metric_filter.cc
src/core/ext/filters/census/grpc_context.cc
- src/core/ext/filters/channel_idle/channel_idle_filter.cc
src/core/ext/filters/channel_idle/idle_filter_state.cc
src/core/ext/filters/channel_idle/legacy_channel_idle_filter.cc
src/core/ext/filters/deadline/deadline_filter.cc
diff --git a/Makefile b/Makefile
index 1764d8939e9..d9fe0b00c6e 100644
--- a/Makefile
+++ b/Makefile
@@ -686,7 +686,6 @@ LIBGRPC_SRC = \
src/core/client_channel/subchannel_stream_client.cc \
src/core/ext/filters/backend_metrics/backend_metric_filter.cc \
src/core/ext/filters/census/grpc_context.cc \
- src/core/ext/filters/channel_idle/channel_idle_filter.cc \
src/core/ext/filters/channel_idle/idle_filter_state.cc \
src/core/ext/filters/channel_idle/legacy_channel_idle_filter.cc \
src/core/ext/filters/deadline/deadline_filter.cc \
diff --git a/Package.swift b/Package.swift
index 87cb3261dd2..b0ab8bee111 100644
--- a/Package.swift
+++ b/Package.swift
@@ -157,8 +157,6 @@ let package = Package(
"src/core/ext/filters/backend_metrics/backend_metric_filter.h",
"src/core/ext/filters/backend_metrics/backend_metric_provider.h",
"src/core/ext/filters/census/grpc_context.cc",
- "src/core/ext/filters/channel_idle/channel_idle_filter.cc",
- "src/core/ext/filters/channel_idle/channel_idle_filter.h",
"src/core/ext/filters/channel_idle/idle_filter_state.cc",
"src/core/ext/filters/channel_idle/idle_filter_state.h",
"src/core/ext/filters/channel_idle/legacy_channel_idle_filter.cc",
diff --git a/bazel/experiments.bzl b/bazel/experiments.bzl
index bb08b829070..b9be51d25b3 100644
--- a/bazel/experiments.bzl
+++ b/bazel/experiments.bzl
@@ -44,7 +44,6 @@ EXPERIMENT_ENABLES = {
"trace_record_callops": "trace_record_callops",
"unconstrained_max_quota_buffer_size": "unconstrained_max_quota_buffer_size",
"v3_backend_metric_filter": "v3_backend_metric_filter",
- "v3_channel_idle_filters": "v3_channel_idle_filters",
"work_serializer_clears_time_cache": "work_serializer_clears_time_cache",
"work_serializer_dispatch": "event_engine_client,work_serializer_dispatch",
}
diff --git a/build_autogenerated.yaml b/build_autogenerated.yaml
index 2fcd18e4eed..130752f1638 100644
--- a/build_autogenerated.yaml
+++ b/build_autogenerated.yaml
@@ -240,7 +240,6 @@ libs:
- src/core/client_channel/subchannel_stream_client.h
- src/core/ext/filters/backend_metrics/backend_metric_filter.h
- src/core/ext/filters/backend_metrics/backend_metric_provider.h
- - src/core/ext/filters/channel_idle/channel_idle_filter.h
- src/core/ext/filters/channel_idle/idle_filter_state.h
- src/core/ext/filters/channel_idle/legacy_channel_idle_filter.h
- src/core/ext/filters/deadline/deadline_filter.h
@@ -1263,7 +1262,6 @@ libs:
- src/core/client_channel/subchannel_stream_client.cc
- src/core/ext/filters/backend_metrics/backend_metric_filter.cc
- src/core/ext/filters/census/grpc_context.cc
- - src/core/ext/filters/channel_idle/channel_idle_filter.cc
- src/core/ext/filters/channel_idle/idle_filter_state.cc
- src/core/ext/filters/channel_idle/legacy_channel_idle_filter.cc
- src/core/ext/filters/deadline/deadline_filter.cc
@@ -2228,7 +2226,6 @@ libs:
- src/core/client_channel/subchannel_stream_client.h
- src/core/ext/filters/backend_metrics/backend_metric_filter.h
- src/core/ext/filters/backend_metrics/backend_metric_provider.h
- - src/core/ext/filters/channel_idle/channel_idle_filter.h
- src/core/ext/filters/channel_idle/idle_filter_state.h
- src/core/ext/filters/channel_idle/legacy_channel_idle_filter.h
- src/core/ext/filters/deadline/deadline_filter.h
@@ -2720,7 +2717,6 @@ libs:
- src/core/client_channel/subchannel_stream_client.cc
- src/core/ext/filters/backend_metrics/backend_metric_filter.cc
- src/core/ext/filters/census/grpc_context.cc
- - src/core/ext/filters/channel_idle/channel_idle_filter.cc
- src/core/ext/filters/channel_idle/idle_filter_state.cc
- src/core/ext/filters/channel_idle/legacy_channel_idle_filter.cc
- src/core/ext/filters/deadline/deadline_filter.cc
diff --git a/config.m4 b/config.m4
index 7d57c1c79b2..a99a765637c 100644
--- a/config.m4
+++ b/config.m4
@@ -61,7 +61,6 @@ if test "$PHP_GRPC" != "no"; then
src/core/client_channel/subchannel_stream_client.cc \
src/core/ext/filters/backend_metrics/backend_metric_filter.cc \
src/core/ext/filters/census/grpc_context.cc \
- src/core/ext/filters/channel_idle/channel_idle_filter.cc \
src/core/ext/filters/channel_idle/idle_filter_state.cc \
src/core/ext/filters/channel_idle/legacy_channel_idle_filter.cc \
src/core/ext/filters/deadline/deadline_filter.cc \
diff --git a/config.w32 b/config.w32
index dfad8c4270e..f2df20bdf9f 100644
--- a/config.w32
+++ b/config.w32
@@ -26,7 +26,6 @@ if (PHP_GRPC != "no") {
"src\\core\\client_channel\\subchannel_stream_client.cc " +
"src\\core\\ext\\filters\\backend_metrics\\backend_metric_filter.cc " +
"src\\core\\ext\\filters\\census\\grpc_context.cc " +
- "src\\core\\ext\\filters\\channel_idle\\channel_idle_filter.cc " +
"src\\core\\ext\\filters\\channel_idle\\idle_filter_state.cc " +
"src\\core\\ext\\filters\\channel_idle\\legacy_channel_idle_filter.cc " +
"src\\core\\ext\\filters\\deadline\\deadline_filter.cc " +
diff --git a/gRPC-C++.podspec b/gRPC-C++.podspec
index 72e1dd73382..4b51f0c3ffa 100644
--- a/gRPC-C++.podspec
+++ b/gRPC-C++.podspec
@@ -282,7 +282,6 @@ Pod::Spec.new do |s|
'src/core/client_channel/subchannel_stream_client.h',
'src/core/ext/filters/backend_metrics/backend_metric_filter.h',
'src/core/ext/filters/backend_metrics/backend_metric_provider.h',
- 'src/core/ext/filters/channel_idle/channel_idle_filter.h',
'src/core/ext/filters/channel_idle/idle_filter_state.h',
'src/core/ext/filters/channel_idle/legacy_channel_idle_filter.h',
'src/core/ext/filters/deadline/deadline_filter.h',
@@ -1571,7 +1570,6 @@ Pod::Spec.new do |s|
'src/core/client_channel/subchannel_stream_client.h',
'src/core/ext/filters/backend_metrics/backend_metric_filter.h',
'src/core/ext/filters/backend_metrics/backend_metric_provider.h',
- 'src/core/ext/filters/channel_idle/channel_idle_filter.h',
'src/core/ext/filters/channel_idle/idle_filter_state.h',
'src/core/ext/filters/channel_idle/legacy_channel_idle_filter.h',
'src/core/ext/filters/deadline/deadline_filter.h',
diff --git a/gRPC-Core.podspec b/gRPC-Core.podspec
index 551cd0a3d5d..df64c115264 100644
--- a/gRPC-Core.podspec
+++ b/gRPC-Core.podspec
@@ -273,8 +273,6 @@ Pod::Spec.new do |s|
'src/core/ext/filters/backend_metrics/backend_metric_filter.h',
'src/core/ext/filters/backend_metrics/backend_metric_provider.h',
'src/core/ext/filters/census/grpc_context.cc',
- 'src/core/ext/filters/channel_idle/channel_idle_filter.cc',
- 'src/core/ext/filters/channel_idle/channel_idle_filter.h',
'src/core/ext/filters/channel_idle/idle_filter_state.cc',
'src/core/ext/filters/channel_idle/idle_filter_state.h',
'src/core/ext/filters/channel_idle/legacy_channel_idle_filter.cc',
@@ -2373,7 +2371,6 @@ Pod::Spec.new do |s|
'src/core/client_channel/subchannel_stream_client.h',
'src/core/ext/filters/backend_metrics/backend_metric_filter.h',
'src/core/ext/filters/backend_metrics/backend_metric_provider.h',
- 'src/core/ext/filters/channel_idle/channel_idle_filter.h',
'src/core/ext/filters/channel_idle/idle_filter_state.h',
'src/core/ext/filters/channel_idle/legacy_channel_idle_filter.h',
'src/core/ext/filters/deadline/deadline_filter.h',
diff --git a/grpc.gemspec b/grpc.gemspec
index 68f49d4e223..9c74cb02c4f 100644
--- a/grpc.gemspec
+++ b/grpc.gemspec
@@ -163,8 +163,6 @@ Gem::Specification.new do |s|
s.files += %w( src/core/ext/filters/backend_metrics/backend_metric_filter.h )
s.files += %w( src/core/ext/filters/backend_metrics/backend_metric_provider.h )
s.files += %w( src/core/ext/filters/census/grpc_context.cc )
- s.files += %w( src/core/ext/filters/channel_idle/channel_idle_filter.cc )
- s.files += %w( src/core/ext/filters/channel_idle/channel_idle_filter.h )
s.files += %w( src/core/ext/filters/channel_idle/idle_filter_state.cc )
s.files += %w( src/core/ext/filters/channel_idle/idle_filter_state.h )
s.files += %w( src/core/ext/filters/channel_idle/legacy_channel_idle_filter.cc )
diff --git a/package.xml b/package.xml
index 6fa34c7119a..eeaa57e1ff4 100644
--- a/package.xml
+++ b/package.xml
@@ -145,8 +145,6 @@
-
-
diff --git a/src/core/BUILD b/src/core/BUILD
index b50b8bcae8c..1a2eaf03762 100644
--- a/src/core/BUILD
+++ b/src/core/BUILD
@@ -4419,11 +4419,9 @@ grpc_cc_library(
grpc_cc_library(
name = "grpc_channel_idle_filter",
srcs = [
- "ext/filters/channel_idle/channel_idle_filter.cc",
"ext/filters/channel_idle/legacy_channel_idle_filter.cc",
],
hdrs = [
- "ext/filters/channel_idle/channel_idle_filter.h",
"ext/filters/channel_idle/legacy_channel_idle_filter.h",
],
external_deps = [
diff --git a/src/core/ext/filters/channel_idle/channel_idle_filter.cc b/src/core/ext/filters/channel_idle/channel_idle_filter.cc
deleted file mode 100644
index 30155e5483c..00000000000
--- a/src/core/ext/filters/channel_idle/channel_idle_filter.cc
+++ /dev/null
@@ -1,313 +0,0 @@
-// Copyright 2022 gRPC authors.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-// http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-// TODO(ctiller): Add a unit test suite for these filters once it's practical to
-// mock transport operations.
-
-#include
-
-#include "src/core/ext/filters/channel_idle/channel_idle_filter.h"
-
-#include
-#include
-
-#include "absl/base/thread_annotations.h"
-#include "absl/meta/type_traits.h"
-#include "absl/random/random.h"
-#include "absl/types/optional.h"
-
-#include
-#include
-
-#include "src/core/lib/channel/channel_args.h"
-#include "src/core/lib/channel/promise_based_filter.h"
-#include "src/core/lib/config/core_configuration.h"
-#include "src/core/lib/debug/trace.h"
-#include "src/core/lib/experiments/experiments.h"
-#include "src/core/lib/gprpp/debug_location.h"
-#include "src/core/lib/gprpp/no_destruct.h"
-#include "src/core/lib/gprpp/orphanable.h"
-#include "src/core/lib/gprpp/per_cpu.h"
-#include "src/core/lib/gprpp/status_helper.h"
-#include "src/core/lib/gprpp/sync.h"
-#include "src/core/lib/iomgr/closure.h"
-#include "src/core/lib/iomgr/error.h"
-#include "src/core/lib/iomgr/exec_ctx.h"
-#include "src/core/lib/promise/exec_ctx_wakeup_scheduler.h"
-#include "src/core/lib/promise/loop.h"
-#include "src/core/lib/promise/poll.h"
-#include "src/core/lib/promise/promise.h"
-#include "src/core/lib/promise/sleep.h"
-#include "src/core/lib/promise/try_seq.h"
-#include "src/core/lib/surface/channel_stack_type.h"
-#include "src/core/lib/transport/http2_errors.h"
-#include "src/core/lib/transport/metadata_batch.h"
-
-namespace grpc_core {
-
-const NoInterceptor ChannelIdleFilter::Call::OnClientInitialMetadata;
-const NoInterceptor ChannelIdleFilter::Call::OnServerInitialMetadata;
-const NoInterceptor ChannelIdleFilter::Call::OnServerTrailingMetadata;
-const NoInterceptor ChannelIdleFilter::Call::OnClientToServerMessage;
-const NoInterceptor ChannelIdleFilter::Call::OnServerToClientMessage;
-
-namespace {
-
-constexpr Duration kDefaultIdleTimeout = Duration::Minutes(30);
-
-// If these settings change, make sure that we are not sending a GOAWAY for
-// inproc transport, since a GOAWAY to inproc ends up destroying the transport.
-const auto kDefaultMaxConnectionAge = Duration::Infinity();
-const auto kDefaultMaxConnectionAgeGrace = Duration::Infinity();
-const auto kDefaultMaxConnectionIdle = Duration::Infinity();
-const auto kMaxConnectionAgeJitter = 0.1;
-
-TraceFlag grpc_trace_client_idle_filter(false, "client_idle_filter");
-} // namespace
-
-#define GRPC_IDLE_FILTER_LOG(format, ...) \
- do { \
- if (GRPC_TRACE_FLAG_ENABLED(grpc_trace_client_idle_filter)) { \
- gpr_log(GPR_INFO, "(client idle filter) " format, ##__VA_ARGS__); \
- } \
- } while (0)
-
-namespace {
-
-Duration GetClientIdleTimeout(const ChannelArgs& args) {
- return args.GetDurationFromIntMillis(GRPC_ARG_CLIENT_IDLE_TIMEOUT_MS)
- .value_or(kDefaultIdleTimeout);
-}
-
-} // namespace
-
-struct MaxAgeFilter::Config {
- Duration max_connection_age;
- Duration max_connection_idle;
- Duration max_connection_age_grace;
-
- bool enable() const {
- return max_connection_age != Duration::Infinity() ||
- max_connection_idle != Duration::Infinity();
- }
-
- // A random jitter of +/-10% will be added to MAX_CONNECTION_AGE and
- // MAX_CONNECTION_IDLE to spread out reconnection storms.
- static Config FromChannelArgs(const ChannelArgs& args) {
- const Duration args_max_age =
- args.GetDurationFromIntMillis(GRPC_ARG_MAX_CONNECTION_AGE_MS)
- .value_or(kDefaultMaxConnectionAge);
- const Duration args_max_idle =
- args.GetDurationFromIntMillis(GRPC_ARG_MAX_CONNECTION_IDLE_MS)
- .value_or(kDefaultMaxConnectionIdle);
- const Duration args_max_age_grace =
- args.GetDurationFromIntMillis(GRPC_ARG_MAX_CONNECTION_AGE_GRACE_MS)
- .value_or(kDefaultMaxConnectionAgeGrace);
- // generate a random number between 1 - kMaxConnectionAgeJitter and
- // 1 + kMaxConnectionAgeJitter
- struct BitGen {
- Mutex mu;
- absl::BitGen bit_gen ABSL_GUARDED_BY(mu);
- double MakeUniformDouble(double min, double max) {
- MutexLock lock(&mu);
- return absl::Uniform(bit_gen, min, max);
- }
- };
- static NoDestruct> bit_gen(PerCpuOptions().SetMaxShards(8));
- const double multiplier = bit_gen->this_cpu().MakeUniformDouble(
- 1.0 - kMaxConnectionAgeJitter, 1.0 + kMaxConnectionAgeJitter);
- // GRPC_MILLIS_INF_FUTURE - 0.5 converts the value to float, so that result
- // will not be cast to int implicitly before the comparison.
- return Config{args_max_age * multiplier, args_max_idle * multiplier,
- args_max_age_grace};
- }
-};
-
-absl::StatusOr ClientIdleFilter::Create(
- const ChannelArgs& args, ChannelFilter::Args filter_args) {
- ClientIdleFilter filter(filter_args.channel_stack(),
- GetClientIdleTimeout(args));
- return absl::StatusOr(std::move(filter));
-}
-
-absl::StatusOr MaxAgeFilter::Create(
- const ChannelArgs& args, ChannelFilter::Args filter_args) {
- MaxAgeFilter filter(filter_args.channel_stack(),
- Config::FromChannelArgs(args));
- return absl::StatusOr(std::move(filter));
-}
-
-void MaxAgeFilter::Shutdown() {
- max_age_activity_.Reset();
- ChannelIdleFilter::Shutdown();
-}
-
-void MaxAgeFilter::PostInit() {
- struct StartupClosure {
- RefCountedPtr channel_stack;
- MaxAgeFilter* filter;
- grpc_closure closure;
- };
- auto run_startup = [](void* p, grpc_error_handle) {
- auto* startup = static_cast(p);
- // Trigger idle timer
- startup->filter->IncreaseCallCount();
- startup->filter->DecreaseCallCount();
- grpc_transport_op* op = grpc_make_transport_op(nullptr);
- op->start_connectivity_watch.reset(
- new ConnectivityWatcher(startup->filter));
- op->start_connectivity_watch_state = GRPC_CHANNEL_IDLE;
- grpc_channel_next_op(
- grpc_channel_stack_element(startup->channel_stack.get(), 0), op);
- delete startup;
- };
- auto* startup =
- new StartupClosure{this->channel_stack()->Ref(), this, grpc_closure{}};
- GRPC_CLOSURE_INIT(&startup->closure, run_startup, startup, nullptr);
- ExecCtx::Run(DEBUG_LOCATION, &startup->closure, absl::OkStatus());
-
- auto channel_stack = this->channel_stack()->Ref();
-
- // Start the max age timer
- if (max_connection_age_ != Duration::Infinity()) {
- max_age_activity_.Set(MakeActivity(
- TrySeq(
- // First sleep until the max connection age
- Sleep(Timestamp::Now() + max_connection_age_),
- // Then send a goaway.
- [this] {
- GRPC_CHANNEL_STACK_REF(this->channel_stack(),
- "max_age send_goaway");
- // Jump out of the activity to send the goaway.
- auto fn = [](void* arg, grpc_error_handle) {
- auto* channel_stack = static_cast(arg);
- grpc_transport_op* op = grpc_make_transport_op(nullptr);
- op->goaway_error = grpc_error_set_int(
- GRPC_ERROR_CREATE("max_age"),
- StatusIntProperty::kHttp2Error, GRPC_HTTP2_NO_ERROR);
- grpc_channel_element* elem =
- grpc_channel_stack_element(channel_stack, 0);
- elem->filter->start_transport_op(elem, op);
- GRPC_CHANNEL_STACK_UNREF(channel_stack, "max_age send_goaway");
- };
- ExecCtx::Run(
- DEBUG_LOCATION,
- GRPC_CLOSURE_CREATE(fn, this->channel_stack(), nullptr),
- absl::OkStatus());
- return Immediate(absl::OkStatus());
- },
- // Sleep for the grace period
- [this] {
- return Sleep(Timestamp::Now() + max_connection_age_grace_);
- }),
- ExecCtxWakeupScheduler(),
- [channel_stack, this](absl::Status status) {
- // OnDone -- close the connection if the promise completed
- // successfully.
- // (if it did not, it was cancelled)
- if (status.ok()) CloseChannel();
- },
- channel_stack->EventEngine()));
- }
-}
-
-bool ChannelIdleFilter::StartTransportOp(grpc_transport_op* op) {
- // Catch the disconnect_with_error transport op.
- if (!op->disconnect_with_error.ok()) Shutdown();
- // Pass the op to the next filter.
- return false;
-}
-
-void ChannelIdleFilter::Shutdown() {
- // IncreaseCallCount() introduces a phony call and prevent the timer from
- // being reset by other threads.
- IncreaseCallCount();
- activity_.Reset();
-}
-
-void ChannelIdleFilter::IncreaseCallCount() {
- idle_filter_state_->IncreaseCallCount();
-}
-
-void ChannelIdleFilter::DecreaseCallCount() {
- if (idle_filter_state_->DecreaseCallCount()) {
- // If there are no more calls in progress, start the idle timer.
- StartIdleTimer();
- }
-}
-
-void ChannelIdleFilter::StartIdleTimer() {
- GRPC_IDLE_FILTER_LOG("timer has started");
- auto idle_filter_state = idle_filter_state_;
- // Hold a ref to the channel stack for the timer callback.
- auto channel_stack = channel_stack_->Ref();
- auto timeout = client_idle_timeout_;
- auto promise = Loop([timeout, idle_filter_state]() {
- return TrySeq(Sleep(Timestamp::Now() + timeout),
- [idle_filter_state]() -> Poll> {
- if (idle_filter_state->CheckTimer()) {
- return Continue{};
- } else {
- return absl::OkStatus();
- }
- });
- });
- activity_.Set(MakeActivity(
- std::move(promise), ExecCtxWakeupScheduler{},
- [channel_stack, this](absl::Status status) {
- if (status.ok()) CloseChannel();
- },
- channel_stack->EventEngine()));
-}
-
-void ChannelIdleFilter::CloseChannel() {
- auto* op = grpc_make_transport_op(nullptr);
- op->disconnect_with_error = grpc_error_set_int(
- GRPC_ERROR_CREATE("enter idle"),
- StatusIntProperty::ChannelConnectivityState, GRPC_CHANNEL_IDLE);
- // Pass the transport op down to the channel stack.
- auto* elem = grpc_channel_stack_element(channel_stack_, 0);
- elem->filter->start_transport_op(elem, op);
-}
-
-const grpc_channel_filter ClientIdleFilter::kFilter =
- MakePromiseBasedFilter(
- "client_idle");
-const grpc_channel_filter MaxAgeFilter::kFilter =
- MakePromiseBasedFilter("max_age");
-
-void RegisterChannelIdleFilters(CoreConfiguration::Builder* builder) {
- GPR_ASSERT(MaxAgeFilter::kFilter.init_call != nullptr);
- if (!IsV3ChannelIdleFiltersEnabled()) return;
- builder->channel_init()
- ->RegisterFilter(GRPC_CLIENT_CHANNEL)
- .ExcludeFromMinimalStack()
- .If([](const ChannelArgs& channel_args) {
- return GetClientIdleTimeout(channel_args) != Duration::Infinity();
- });
- builder->channel_init()
- ->RegisterFilter(GRPC_SERVER_CHANNEL)
- .ExcludeFromMinimalStack()
- .If([](const ChannelArgs& channel_args) {
- return MaxAgeFilter::Config::FromChannelArgs(channel_args).enable();
- });
-}
-
-MaxAgeFilter::MaxAgeFilter(grpc_channel_stack* channel_stack,
- const Config& max_age_config)
- : ChannelIdleFilter(channel_stack, max_age_config.max_connection_idle),
- max_connection_age_(max_age_config.max_connection_age),
- max_connection_age_grace_(max_age_config.max_connection_age_grace) {}
-
-} // namespace grpc_core
diff --git a/src/core/ext/filters/channel_idle/channel_idle_filter.h b/src/core/ext/filters/channel_idle/channel_idle_filter.h
deleted file mode 100644
index f45d571c2cc..00000000000
--- a/src/core/ext/filters/channel_idle/channel_idle_filter.h
+++ /dev/null
@@ -1,154 +0,0 @@
-// Copyright 2022 gRPC authors.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-// http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-#ifndef GRPC_SRC_CORE_EXT_FILTERS_CHANNEL_IDLE_CHANNEL_IDLE_FILTER_H
-#define GRPC_SRC_CORE_EXT_FILTERS_CHANNEL_IDLE_CHANNEL_IDLE_FILTER_H
-
-#include
-
-#include
-
-#include "absl/status/status.h"
-#include "absl/status/statusor.h"
-
-#include
-
-#include "src/core/ext/filters/channel_idle/idle_filter_state.h"
-#include "src/core/lib/channel/channel_args.h"
-#include "src/core/lib/channel/channel_fwd.h"
-#include "src/core/lib/channel/channel_stack.h"
-#include "src/core/lib/channel/promise_based_filter.h"
-#include "src/core/lib/gprpp/orphanable.h"
-#include "src/core/lib/gprpp/ref_counted_ptr.h"
-#include "src/core/lib/gprpp/single_set_ptr.h"
-#include "src/core/lib/gprpp/time.h"
-#include "src/core/lib/promise/activity.h"
-#include "src/core/lib/promise/arena_promise.h"
-#include "src/core/lib/transport/connectivity_state.h"
-#include "src/core/lib/transport/transport.h"
-
-namespace grpc_core {
-
-class ChannelIdleFilter : public ImplementChannelFilter {
- public:
- ~ChannelIdleFilter() override = default;
-
- ChannelIdleFilter(const ChannelIdleFilter&) = delete;
- ChannelIdleFilter& operator=(const ChannelIdleFilter&) = delete;
- ChannelIdleFilter(ChannelIdleFilter&&) = default;
- ChannelIdleFilter& operator=(ChannelIdleFilter&&) = default;
-
- class Call {
- public:
- explicit Call(ChannelIdleFilter* filter) : filter_(filter) {
- filter_->IncreaseCallCount();
- }
- ~Call() { MaybeDecrement(); }
-
- static const NoInterceptor OnClientInitialMetadata;
- static const NoInterceptor OnServerInitialMetadata;
- static const NoInterceptor OnServerTrailingMetadata;
- static const NoInterceptor OnClientToServerMessage;
- static const NoInterceptor OnServerToClientMessage;
- void OnFinalize(const grpc_call_final_info*) { MaybeDecrement(); }
-
- private:
- void MaybeDecrement() {
- auto* filter = std::exchange(filter_, nullptr);
- if (filter != nullptr) filter->DecreaseCallCount();
- }
- ChannelIdleFilter* filter_;
- };
-
- bool StartTransportOp(grpc_transport_op* op) override;
-
- protected:
- using SingleSetActivityPtr =
- SingleSetPtr;
-
- ChannelIdleFilter(grpc_channel_stack* channel_stack,
- Duration client_idle_timeout)
- : channel_stack_(channel_stack),
- client_idle_timeout_(client_idle_timeout) {}
-
- grpc_channel_stack* channel_stack() { return channel_stack_; };
-
- virtual void Shutdown();
- void CloseChannel();
-
- void IncreaseCallCount();
- void DecreaseCallCount();
-
- private:
- void StartIdleTimer();
-
- // The channel stack to which we take refs for pending callbacks.
- grpc_channel_stack* channel_stack_;
- Duration client_idle_timeout_;
- std::shared_ptr idle_filter_state_{
- std::make_shared(false)};
-
- SingleSetActivityPtr activity_;
-};
-
-class ClientIdleFilter final : public ChannelIdleFilter {
- public:
- static const grpc_channel_filter kFilter;
-
- static absl::StatusOr Create(
- const ChannelArgs& args, ChannelFilter::Args filter_args);
-
- private:
- using ChannelIdleFilter::ChannelIdleFilter;
-};
-
-class MaxAgeFilter final : public ChannelIdleFilter {
- public:
- static const grpc_channel_filter kFilter;
- struct Config;
-
- static absl::StatusOr Create(const ChannelArgs& args,
- ChannelFilter::Args filter_args);
-
- void PostInit() override;
-
- private:
- class ConnectivityWatcher : public AsyncConnectivityStateWatcherInterface {
- public:
- explicit ConnectivityWatcher(MaxAgeFilter* filter)
- : channel_stack_(filter->channel_stack()->Ref()), filter_(filter) {}
- ~ConnectivityWatcher() override = default;
-
- void OnConnectivityStateChange(grpc_connectivity_state new_state,
- const absl::Status&) override {
- if (new_state == GRPC_CHANNEL_SHUTDOWN) filter_->Shutdown();
- }
-
- private:
- RefCountedPtr channel_stack_;
- MaxAgeFilter* filter_;
- };
-
- MaxAgeFilter(grpc_channel_stack* channel_stack, const Config& max_age_config);
-
- void Shutdown() override;
-
- SingleSetActivityPtr max_age_activity_;
- Duration max_connection_age_;
- Duration max_connection_age_grace_;
-};
-
-} // namespace grpc_core
-
-#endif // GRPC_SRC_CORE_EXT_FILTERS_CHANNEL_IDLE_CHANNEL_IDLE_FILTER_H
diff --git a/src/core/ext/filters/channel_idle/legacy_channel_idle_filter.cc b/src/core/ext/filters/channel_idle/legacy_channel_idle_filter.cc
index f9134a74df9..e693d73d1f2 100644
--- a/src/core/ext/filters/channel_idle/legacy_channel_idle_filter.cc
+++ b/src/core/ext/filters/channel_idle/legacy_channel_idle_filter.cc
@@ -295,7 +295,6 @@ const grpc_channel_filter LegacyMaxAgeFilter::kFilter =
"max_age");
void RegisterLegacyChannelIdleFilters(CoreConfiguration::Builder* builder) {
- if (IsV3ChannelIdleFiltersEnabled()) return;
builder->channel_init()
->RegisterFilter(GRPC_CLIENT_CHANNEL)
.ExcludeFromMinimalStack()
diff --git a/src/core/lib/experiments/experiments.cc b/src/core/lib/experiments/experiments.cc
index 808596cba0f..d2da6fbfb48 100644
--- a/src/core/lib/experiments/experiments.cc
+++ b/src/core/lib/experiments/experiments.cc
@@ -131,9 +131,6 @@ const char* const additional_constraints_unconstrained_max_quota_buffer_size =
const char* const description_v3_backend_metric_filter =
"Use the backend metric filter utilizing the v3 filter api";
const char* const additional_constraints_v3_backend_metric_filter = "{}";
-const char* const description_v3_channel_idle_filters =
- "Use the v3 filter API version of the idle filters.";
-const char* const additional_constraints_v3_channel_idle_filters = "{}";
const char* const description_work_serializer_clears_time_cache =
"Have the work serializer clear the time cache when it dispatches work.";
const char* const additional_constraints_work_serializer_clears_time_cache =
@@ -219,8 +216,6 @@ const ExperimentMetadata g_experiment_metadata[] = {
false, true},
{"v3_backend_metric_filter", description_v3_backend_metric_filter,
additional_constraints_v3_backend_metric_filter, nullptr, 0, false, true},
- {"v3_channel_idle_filters", description_v3_channel_idle_filters,
- additional_constraints_v3_channel_idle_filters, nullptr, 0, false, true},
{"work_serializer_clears_time_cache",
description_work_serializer_clears_time_cache,
additional_constraints_work_serializer_clears_time_cache, nullptr, 0, true,
@@ -341,9 +336,6 @@ const char* const additional_constraints_unconstrained_max_quota_buffer_size =
const char* const description_v3_backend_metric_filter =
"Use the backend metric filter utilizing the v3 filter api";
const char* const additional_constraints_v3_backend_metric_filter = "{}";
-const char* const description_v3_channel_idle_filters =
- "Use the v3 filter API version of the idle filters.";
-const char* const additional_constraints_v3_channel_idle_filters = "{}";
const char* const description_work_serializer_clears_time_cache =
"Have the work serializer clear the time cache when it dispatches work.";
const char* const additional_constraints_work_serializer_clears_time_cache =
@@ -429,8 +421,6 @@ const ExperimentMetadata g_experiment_metadata[] = {
false, true},
{"v3_backend_metric_filter", description_v3_backend_metric_filter,
additional_constraints_v3_backend_metric_filter, nullptr, 0, false, true},
- {"v3_channel_idle_filters", description_v3_channel_idle_filters,
- additional_constraints_v3_channel_idle_filters, nullptr, 0, false, true},
{"work_serializer_clears_time_cache",
description_work_serializer_clears_time_cache,
additional_constraints_work_serializer_clears_time_cache, nullptr, 0, true,
@@ -551,9 +541,6 @@ const char* const additional_constraints_unconstrained_max_quota_buffer_size =
const char* const description_v3_backend_metric_filter =
"Use the backend metric filter utilizing the v3 filter api";
const char* const additional_constraints_v3_backend_metric_filter = "{}";
-const char* const description_v3_channel_idle_filters =
- "Use the v3 filter API version of the idle filters.";
-const char* const additional_constraints_v3_channel_idle_filters = "{}";
const char* const description_work_serializer_clears_time_cache =
"Have the work serializer clear the time cache when it dispatches work.";
const char* const additional_constraints_work_serializer_clears_time_cache =
@@ -639,8 +626,6 @@ const ExperimentMetadata g_experiment_metadata[] = {
false, true},
{"v3_backend_metric_filter", description_v3_backend_metric_filter,
additional_constraints_v3_backend_metric_filter, nullptr, 0, false, true},
- {"v3_channel_idle_filters", description_v3_channel_idle_filters,
- additional_constraints_v3_channel_idle_filters, nullptr, 0, false, true},
{"work_serializer_clears_time_cache",
description_work_serializer_clears_time_cache,
additional_constraints_work_serializer_clears_time_cache, nullptr, 0, true,
diff --git a/src/core/lib/experiments/experiments.h b/src/core/lib/experiments/experiments.h
index 172b3db8e9a..1f76b92d44b 100644
--- a/src/core/lib/experiments/experiments.h
+++ b/src/core/lib/experiments/experiments.h
@@ -96,7 +96,6 @@ inline bool IsTcpRcvLowatEnabled() { return false; }
inline bool IsTraceRecordCallopsEnabled() { return false; }
inline bool IsUnconstrainedMaxQuotaBufferSizeEnabled() { return false; }
inline bool IsV3BackendMetricFilterEnabled() { return false; }
-inline bool IsV3ChannelIdleFiltersEnabled() { return false; }
#define GRPC_EXPERIMENT_IS_INCLUDED_WORK_SERIALIZER_CLEARS_TIME_CACHE
inline bool IsWorkSerializerClearsTimeCacheEnabled() { return true; }
inline bool IsWorkSerializerDispatchEnabled() { return false; }
@@ -142,7 +141,6 @@ inline bool IsTcpRcvLowatEnabled() { return false; }
inline bool IsTraceRecordCallopsEnabled() { return false; }
inline bool IsUnconstrainedMaxQuotaBufferSizeEnabled() { return false; }
inline bool IsV3BackendMetricFilterEnabled() { return false; }
-inline bool IsV3ChannelIdleFiltersEnabled() { return false; }
#define GRPC_EXPERIMENT_IS_INCLUDED_WORK_SERIALIZER_CLEARS_TIME_CACHE
inline bool IsWorkSerializerClearsTimeCacheEnabled() { return true; }
inline bool IsWorkSerializerDispatchEnabled() { return false; }
@@ -189,7 +187,6 @@ inline bool IsTcpRcvLowatEnabled() { return false; }
inline bool IsTraceRecordCallopsEnabled() { return false; }
inline bool IsUnconstrainedMaxQuotaBufferSizeEnabled() { return false; }
inline bool IsV3BackendMetricFilterEnabled() { return false; }
-inline bool IsV3ChannelIdleFiltersEnabled() { return false; }
#define GRPC_EXPERIMENT_IS_INCLUDED_WORK_SERIALIZER_CLEARS_TIME_CACHE
inline bool IsWorkSerializerClearsTimeCacheEnabled() { return true; }
#define GRPC_EXPERIMENT_IS_INCLUDED_WORK_SERIALIZER_DISPATCH
@@ -225,7 +222,6 @@ enum ExperimentIds {
kExperimentIdTraceRecordCallops,
kExperimentIdUnconstrainedMaxQuotaBufferSize,
kExperimentIdV3BackendMetricFilter,
- kExperimentIdV3ChannelIdleFilters,
kExperimentIdWorkSerializerClearsTimeCache,
kExperimentIdWorkSerializerDispatch,
kNumExperiments
@@ -338,10 +334,6 @@ inline bool IsUnconstrainedMaxQuotaBufferSizeEnabled() {
inline bool IsV3BackendMetricFilterEnabled() {
return IsExperimentEnabled(kExperimentIdV3BackendMetricFilter);
}
-#define GRPC_EXPERIMENT_IS_INCLUDED_V3_CHANNEL_IDLE_FILTERS
-inline bool IsV3ChannelIdleFiltersEnabled() {
- return IsExperimentEnabled(kExperimentIdV3ChannelIdleFilters);
-}
#define GRPC_EXPERIMENT_IS_INCLUDED_WORK_SERIALIZER_CLEARS_TIME_CACHE
inline bool IsWorkSerializerClearsTimeCacheEnabled() {
return IsExperimentEnabled(kExperimentIdWorkSerializerClearsTimeCache);
diff --git a/src/core/lib/experiments/experiments.yaml b/src/core/lib/experiments/experiments.yaml
index dd4bb55ca40..898e7f892ff 100644
--- a/src/core/lib/experiments/experiments.yaml
+++ b/src/core/lib/experiments/experiments.yaml
@@ -221,12 +221,6 @@
expiry: 2024/05/05
owner: ctiller@google.com
test_tags: []
-- name: v3_channel_idle_filters
- description:
- Use the v3 filter API version of the idle filters.
- expiry: 2024/07/04
- owner: ctiller@google.com
- test_tags: []
- name: work_serializer_clears_time_cache
description:
Have the work serializer clear the time cache when it dispatches work.
diff --git a/src/core/plugin_registry/grpc_plugin_registry.cc b/src/core/plugin_registry/grpc_plugin_registry.cc
index 60fd3496d3c..fd52bf9c8dc 100644
--- a/src/core/plugin_registry/grpc_plugin_registry.cc
+++ b/src/core/plugin_registry/grpc_plugin_registry.cc
@@ -42,7 +42,6 @@ extern void BuildClientChannelConfiguration(
extern void SecurityRegisterHandshakerFactories(
CoreConfiguration::Builder* builder);
extern void RegisterClientAuthorityFilter(CoreConfiguration::Builder* builder);
-extern void RegisterChannelIdleFilters(CoreConfiguration::Builder* builder);
extern void RegisterLegacyChannelIdleFilters(
CoreConfiguration::Builder* builder);
extern void RegisterDeadlineFilter(CoreConfiguration::Builder* builder);
@@ -107,7 +106,6 @@ void BuildCoreConfiguration(CoreConfiguration::Builder* builder) {
BuildClientChannelConfiguration(builder);
SecurityRegisterHandshakerFactories(builder);
RegisterClientAuthorityFilter(builder);
- RegisterChannelIdleFilters(builder);
RegisterLegacyChannelIdleFilters(builder);
RegisterConnectedChannel(builder);
RegisterGrpcLbPolicy(builder);
diff --git a/src/python/grpcio/grpc_core_dependencies.py b/src/python/grpcio/grpc_core_dependencies.py
index 3bd8cbd3b25..540ba147a25 100644
--- a/src/python/grpcio/grpc_core_dependencies.py
+++ b/src/python/grpcio/grpc_core_dependencies.py
@@ -35,7 +35,6 @@ CORE_SOURCE_FILES = [
'src/core/client_channel/subchannel_stream_client.cc',
'src/core/ext/filters/backend_metrics/backend_metric_filter.cc',
'src/core/ext/filters/census/grpc_context.cc',
- 'src/core/ext/filters/channel_idle/channel_idle_filter.cc',
'src/core/ext/filters/channel_idle/idle_filter_state.cc',
'src/core/ext/filters/channel_idle/legacy_channel_idle_filter.cc',
'src/core/ext/filters/deadline/deadline_filter.cc',
diff --git a/tools/doxygen/Doxyfile.c++.internal b/tools/doxygen/Doxyfile.c++.internal
index fbdabd35e74..5a2eb6013b1 100644
--- a/tools/doxygen/Doxyfile.c++.internal
+++ b/tools/doxygen/Doxyfile.c++.internal
@@ -1123,8 +1123,6 @@ src/core/ext/filters/backend_metrics/backend_metric_filter.cc \
src/core/ext/filters/backend_metrics/backend_metric_filter.h \
src/core/ext/filters/backend_metrics/backend_metric_provider.h \
src/core/ext/filters/census/grpc_context.cc \
-src/core/ext/filters/channel_idle/channel_idle_filter.cc \
-src/core/ext/filters/channel_idle/channel_idle_filter.h \
src/core/ext/filters/channel_idle/idle_filter_state.cc \
src/core/ext/filters/channel_idle/idle_filter_state.h \
src/core/ext/filters/channel_idle/legacy_channel_idle_filter.cc \
diff --git a/tools/doxygen/Doxyfile.core.internal b/tools/doxygen/Doxyfile.core.internal
index 0ad29a2f943..8c3baace34d 100644
--- a/tools/doxygen/Doxyfile.core.internal
+++ b/tools/doxygen/Doxyfile.core.internal
@@ -928,8 +928,6 @@ src/core/ext/filters/backend_metrics/backend_metric_filter.cc \
src/core/ext/filters/backend_metrics/backend_metric_filter.h \
src/core/ext/filters/backend_metrics/backend_metric_provider.h \
src/core/ext/filters/census/grpc_context.cc \
-src/core/ext/filters/channel_idle/channel_idle_filter.cc \
-src/core/ext/filters/channel_idle/channel_idle_filter.h \
src/core/ext/filters/channel_idle/idle_filter_state.cc \
src/core/ext/filters/channel_idle/idle_filter_state.h \
src/core/ext/filters/channel_idle/legacy_channel_idle_filter.cc \