diff --git a/BUILD b/BUILD
index 9cb2aebaafb..14ed27907ce 100644
--- a/BUILD
+++ b/BUILD
@@ -2285,8 +2285,7 @@ grpc_cc_library(
"grpc_lb_policy_ring_hash",
"grpc_lb_policy_round_robin",
"grpc_lb_policy_weighted_target",
- "grpc_client_idle_filter",
- "grpc_max_age_filter",
+ "grpc_channel_idle_filter",
"grpc_message_size_filter",
"grpc_resolver_binder",
"grpc_resolver_dns_ares",
@@ -2582,10 +2581,10 @@ grpc_cc_library(
grpc_cc_library(
name = "idle_filter_state",
srcs = [
- "src/core/ext/filters/client_idle/idle_filter_state.cc",
+ "src/core/ext/filters/channel_idle/idle_filter_state.cc",
],
hdrs = [
- "src/core/ext/filters/client_idle/idle_filter_state.h",
+ "src/core/ext/filters/channel_idle/idle_filter_state.h",
],
language = "c++",
deps = [
@@ -2594,9 +2593,9 @@ grpc_cc_library(
)
grpc_cc_library(
- name = "grpc_client_idle_filter",
+ name = "grpc_channel_idle_filter",
srcs = [
- "src/core/ext/filters/client_idle/client_idle_filter.cc",
+ "src/core/ext/filters/channel_idle/channel_idle_filter.cc",
],
deps = [
"capture",
@@ -2606,27 +2605,12 @@ grpc_cc_library(
"grpc_base",
"idle_filter_state",
"loop",
+ "single_set_ptr",
"sleep",
"try_seq",
],
)
-grpc_cc_library(
- name = "grpc_max_age_filter",
- srcs = [
- "src/core/ext/filters/max_age/max_age_filter.cc",
- ],
- hdrs = [
- "src/core/ext/filters/max_age/max_age_filter.h",
- ],
- language = "c++",
- deps = [
- "config",
- "gpr_base",
- "grpc_base",
- ],
-)
-
grpc_cc_library(
name = "grpc_deadline_filter",
srcs = [
diff --git a/CMakeLists.txt b/CMakeLists.txt
index bbb791db903..1f9e408792b 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -1438,6 +1438,8 @@ endif()
add_library(grpc
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/client_channel/backend_metric.cc
src/core/ext/filters/client_channel/backup_poller.cc
src/core/ext/filters/client_channel/channel_connectivity.cc
@@ -1496,8 +1498,6 @@ add_library(grpc
src/core/ext/filters/client_channel/subchannel.cc
src/core/ext/filters/client_channel/subchannel_pool_interface.cc
src/core/ext/filters/client_channel/subchannel_stream_client.cc
- src/core/ext/filters/client_idle/client_idle_filter.cc
- src/core/ext/filters/client_idle/idle_filter_state.cc
src/core/ext/filters/deadline/deadline_filter.cc
src/core/ext/filters/fault_injection/fault_injection_filter.cc
src/core/ext/filters/fault_injection/service_config_parser.cc
@@ -1507,7 +1507,6 @@ add_library(grpc
src/core/ext/filters/http/message_compress/message_compress_filter.cc
src/core/ext/filters/http/message_compress/message_decompress_filter.cc
src/core/ext/filters/http/server/http_server_filter.cc
- src/core/ext/filters/max_age/max_age_filter.cc
src/core/ext/filters/message_size/message_size_filter.cc
src/core/ext/filters/rbac/rbac_filter.cc
src/core/ext/filters/rbac/rbac_service_config_parser.cc
@@ -2374,6 +2373,8 @@ endif()
add_library(grpc_unsecure
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/client_channel/backend_metric.cc
src/core/ext/filters/client_channel/backup_poller.cc
src/core/ext/filters/client_channel/channel_connectivity.cc
@@ -2426,8 +2427,6 @@ add_library(grpc_unsecure
src/core/ext/filters/client_channel/subchannel.cc
src/core/ext/filters/client_channel/subchannel_pool_interface.cc
src/core/ext/filters/client_channel/subchannel_stream_client.cc
- src/core/ext/filters/client_idle/client_idle_filter.cc
- src/core/ext/filters/client_idle/idle_filter_state.cc
src/core/ext/filters/deadline/deadline_filter.cc
src/core/ext/filters/fault_injection/fault_injection_filter.cc
src/core/ext/filters/fault_injection/service_config_parser.cc
@@ -2437,7 +2436,6 @@ add_library(grpc_unsecure
src/core/ext/filters/http/message_compress/message_compress_filter.cc
src/core/ext/filters/http/message_compress/message_decompress_filter.cc
src/core/ext/filters/http/server/http_server_filter.cc
- src/core/ext/filters/max_age/max_age_filter.cc
src/core/ext/filters/message_size/message_size_filter.cc
src/core/ext/transport/chttp2/alpn/alpn.cc
src/core/ext/transport/chttp2/client/chttp2_connector.cc
@@ -11932,7 +11930,7 @@ endif()
if(gRPC_BUILD_TESTS)
add_executable(idle_filter_state_test
- src/core/ext/filters/client_idle/idle_filter_state.cc
+ src/core/ext/filters/channel_idle/idle_filter_state.cc
test/core/client_idle/idle_filter_state_test.cc
third_party/googletest/googletest/src/gtest-all.cc
third_party/googletest/googlemock/src/gmock-all.cc
diff --git a/Makefile b/Makefile
index 9fa48e9769a..74ed9e61223 100644
--- a/Makefile
+++ b/Makefile
@@ -1023,6 +1023,8 @@ endif
# start of build recipe for library "grpc" (generated by makelib(lib) template function)
LIBGRPC_SRC = \
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/client_channel/backend_metric.cc \
src/core/ext/filters/client_channel/backup_poller.cc \
src/core/ext/filters/client_channel/channel_connectivity.cc \
@@ -1081,8 +1083,6 @@ LIBGRPC_SRC = \
src/core/ext/filters/client_channel/subchannel.cc \
src/core/ext/filters/client_channel/subchannel_pool_interface.cc \
src/core/ext/filters/client_channel/subchannel_stream_client.cc \
- src/core/ext/filters/client_idle/client_idle_filter.cc \
- src/core/ext/filters/client_idle/idle_filter_state.cc \
src/core/ext/filters/deadline/deadline_filter.cc \
src/core/ext/filters/fault_injection/fault_injection_filter.cc \
src/core/ext/filters/fault_injection/service_config_parser.cc \
@@ -1092,7 +1092,6 @@ LIBGRPC_SRC = \
src/core/ext/filters/http/message_compress/message_compress_filter.cc \
src/core/ext/filters/http/message_compress/message_decompress_filter.cc \
src/core/ext/filters/http/server/http_server_filter.cc \
- src/core/ext/filters/max_age/max_age_filter.cc \
src/core/ext/filters/message_size/message_size_filter.cc \
src/core/ext/filters/rbac/rbac_filter.cc \
src/core/ext/filters/rbac/rbac_service_config_parser.cc \
@@ -1808,6 +1807,8 @@ endif
# start of build recipe for library "grpc_unsecure" (generated by makelib(lib) template function)
LIBGRPC_UNSECURE_SRC = \
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/client_channel/backend_metric.cc \
src/core/ext/filters/client_channel/backup_poller.cc \
src/core/ext/filters/client_channel/channel_connectivity.cc \
@@ -1860,8 +1861,6 @@ LIBGRPC_UNSECURE_SRC = \
src/core/ext/filters/client_channel/subchannel.cc \
src/core/ext/filters/client_channel/subchannel_pool_interface.cc \
src/core/ext/filters/client_channel/subchannel_stream_client.cc \
- src/core/ext/filters/client_idle/client_idle_filter.cc \
- src/core/ext/filters/client_idle/idle_filter_state.cc \
src/core/ext/filters/deadline/deadline_filter.cc \
src/core/ext/filters/fault_injection/fault_injection_filter.cc \
src/core/ext/filters/fault_injection/service_config_parser.cc \
@@ -1871,7 +1870,6 @@ LIBGRPC_UNSECURE_SRC = \
src/core/ext/filters/http/message_compress/message_compress_filter.cc \
src/core/ext/filters/http/message_compress/message_decompress_filter.cc \
src/core/ext/filters/http/server/http_server_filter.cc \
- src/core/ext/filters/max_age/max_age_filter.cc \
src/core/ext/filters/message_size/message_size_filter.cc \
src/core/ext/transport/chttp2/alpn/alpn.cc \
src/core/ext/transport/chttp2/client/chttp2_connector.cc \
diff --git a/build_autogenerated.yaml b/build_autogenerated.yaml
index 29123cb0a6a..6f69dfd5076 100644
--- a/build_autogenerated.yaml
+++ b/build_autogenerated.yaml
@@ -312,6 +312,7 @@ libs:
- include/grpc/status.h
- include/grpc/support/workaround_list.h
headers:
+ - src/core/ext/filters/channel_idle/idle_filter_state.h
- src/core/ext/filters/client_channel/backend_metric.h
- src/core/ext/filters/client_channel/backup_poller.h
- src/core/ext/filters/client_channel/client_channel.h
@@ -355,7 +356,6 @@ libs:
- src/core/ext/filters/client_channel/subchannel_interface.h
- src/core/ext/filters/client_channel/subchannel_pool_interface.h
- src/core/ext/filters/client_channel/subchannel_stream_client.h
- - src/core/ext/filters/client_idle/idle_filter_state.h
- src/core/ext/filters/deadline/deadline_filter.h
- src/core/ext/filters/fault_injection/fault_injection_filter.h
- src/core/ext/filters/fault_injection/service_config_parser.h
@@ -364,7 +364,6 @@ libs:
- src/core/ext/filters/http/message_compress/message_compress_filter.h
- src/core/ext/filters/http/message_compress/message_decompress_filter.h
- src/core/ext/filters/http/server/http_server_filter.h
- - src/core/ext/filters/max_age/max_age_filter.h
- src/core/ext/filters/message_size/message_size_filter.h
- src/core/ext/filters/rbac/rbac_filter.h
- src/core/ext/filters/rbac/rbac_service_config_parser.h
@@ -736,6 +735,7 @@ libs:
- src/core/lib/gprpp/overload.h
- src/core/lib/gprpp/ref_counted.h
- src/core/lib/gprpp/ref_counted_ptr.h
+ - src/core/lib/gprpp/single_set_ptr.h
- src/core/lib/gprpp/table.h
- src/core/lib/gprpp/time.h
- src/core/lib/http/format_request.h
@@ -969,6 +969,8 @@ libs:
- third_party/xxhash/xxhash.h
src:
- 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/client_channel/backend_metric.cc
- src/core/ext/filters/client_channel/backup_poller.cc
- src/core/ext/filters/client_channel/channel_connectivity.cc
@@ -1027,8 +1029,6 @@ libs:
- src/core/ext/filters/client_channel/subchannel.cc
- src/core/ext/filters/client_channel/subchannel_pool_interface.cc
- src/core/ext/filters/client_channel/subchannel_stream_client.cc
- - src/core/ext/filters/client_idle/client_idle_filter.cc
- - src/core/ext/filters/client_idle/idle_filter_state.cc
- src/core/ext/filters/deadline/deadline_filter.cc
- src/core/ext/filters/fault_injection/fault_injection_filter.cc
- src/core/ext/filters/fault_injection/service_config_parser.cc
@@ -1038,7 +1038,6 @@ libs:
- src/core/ext/filters/http/message_compress/message_compress_filter.cc
- src/core/ext/filters/http/message_compress/message_decompress_filter.cc
- src/core/ext/filters/http/server/http_server_filter.cc
- - src/core/ext/filters/max_age/max_age_filter.cc
- src/core/ext/filters/message_size/message_size_filter.cc
- src/core/ext/filters/rbac/rbac_filter.cc
- src/core/ext/filters/rbac/rbac_service_config_parser.cc
@@ -1783,6 +1782,7 @@ libs:
- include/grpc/status.h
- include/grpc/support/workaround_list.h
headers:
+ - src/core/ext/filters/channel_idle/idle_filter_state.h
- src/core/ext/filters/client_channel/backend_metric.h
- src/core/ext/filters/client_channel/backup_poller.h
- src/core/ext/filters/client_channel/client_channel.h
@@ -1823,7 +1823,6 @@ libs:
- src/core/ext/filters/client_channel/subchannel_interface.h
- src/core/ext/filters/client_channel/subchannel_pool_interface.h
- src/core/ext/filters/client_channel/subchannel_stream_client.h
- - src/core/ext/filters/client_idle/idle_filter_state.h
- src/core/ext/filters/deadline/deadline_filter.h
- src/core/ext/filters/fault_injection/fault_injection_filter.h
- src/core/ext/filters/fault_injection/service_config_parser.h
@@ -1832,7 +1831,6 @@ libs:
- src/core/ext/filters/http/message_compress/message_compress_filter.h
- src/core/ext/filters/http/message_compress/message_decompress_filter.h
- src/core/ext/filters/http/server/http_server_filter.h
- - src/core/ext/filters/max_age/max_age_filter.h
- src/core/ext/filters/message_size/message_size_filter.h
- src/core/ext/transport/chttp2/alpn/alpn.h
- src/core/ext/transport/chttp2/client/chttp2_connector.h
@@ -1916,6 +1914,7 @@ libs:
- src/core/lib/gprpp/overload.h
- src/core/lib/gprpp/ref_counted.h
- src/core/lib/gprpp/ref_counted_ptr.h
+ - src/core/lib/gprpp/single_set_ptr.h
- src/core/lib/gprpp/table.h
- src/core/lib/gprpp/time.h
- src/core/lib/http/format_request.h
@@ -2093,6 +2092,8 @@ libs:
- third_party/xxhash/xxhash.h
src:
- 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/client_channel/backend_metric.cc
- src/core/ext/filters/client_channel/backup_poller.cc
- src/core/ext/filters/client_channel/channel_connectivity.cc
@@ -2145,8 +2146,6 @@ libs:
- src/core/ext/filters/client_channel/subchannel.cc
- src/core/ext/filters/client_channel/subchannel_pool_interface.cc
- src/core/ext/filters/client_channel/subchannel_stream_client.cc
- - src/core/ext/filters/client_idle/client_idle_filter.cc
- - src/core/ext/filters/client_idle/idle_filter_state.cc
- src/core/ext/filters/deadline/deadline_filter.cc
- src/core/ext/filters/fault_injection/fault_injection_filter.cc
- src/core/ext/filters/fault_injection/service_config_parser.cc
@@ -2156,7 +2155,6 @@ libs:
- src/core/ext/filters/http/message_compress/message_compress_filter.cc
- src/core/ext/filters/http/message_compress/message_decompress_filter.cc
- src/core/ext/filters/http/server/http_server_filter.cc
- - src/core/ext/filters/max_age/max_age_filter.cc
- src/core/ext/filters/message_size/message_size_filter.cc
- src/core/ext/transport/chttp2/alpn/alpn.cc
- src/core/ext/transport/chttp2/client/chttp2_connector.cc
@@ -6213,9 +6211,9 @@ targets:
build: test
language: c++
headers:
- - src/core/ext/filters/client_idle/idle_filter_state.h
+ - src/core/ext/filters/channel_idle/idle_filter_state.h
src:
- - src/core/ext/filters/client_idle/idle_filter_state.cc
+ - src/core/ext/filters/channel_idle/idle_filter_state.cc
- test/core/client_idle/idle_filter_state_test.cc
deps: []
uses_polling: false
diff --git a/config.m4 b/config.m4
index 4a40af5382c..e88b4a7713b 100644
--- a/config.m4
+++ b/config.m4
@@ -41,6 +41,8 @@ if test "$PHP_GRPC" != "no"; then
PHP_NEW_EXTENSION(grpc,
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/client_channel/backend_metric.cc \
src/core/ext/filters/client_channel/backup_poller.cc \
src/core/ext/filters/client_channel/channel_connectivity.cc \
@@ -99,8 +101,6 @@ if test "$PHP_GRPC" != "no"; then
src/core/ext/filters/client_channel/subchannel.cc \
src/core/ext/filters/client_channel/subchannel_pool_interface.cc \
src/core/ext/filters/client_channel/subchannel_stream_client.cc \
- src/core/ext/filters/client_idle/client_idle_filter.cc \
- src/core/ext/filters/client_idle/idle_filter_state.cc \
src/core/ext/filters/deadline/deadline_filter.cc \
src/core/ext/filters/fault_injection/fault_injection_filter.cc \
src/core/ext/filters/fault_injection/service_config_parser.cc \
@@ -110,7 +110,6 @@ if test "$PHP_GRPC" != "no"; then
src/core/ext/filters/http/message_compress/message_compress_filter.cc \
src/core/ext/filters/http/message_compress/message_decompress_filter.cc \
src/core/ext/filters/http/server/http_server_filter.cc \
- src/core/ext/filters/max_age/max_age_filter.cc \
src/core/ext/filters/message_size/message_size_filter.cc \
src/core/ext/filters/rbac/rbac_filter.cc \
src/core/ext/filters/rbac/rbac_service_config_parser.cc \
@@ -1167,6 +1166,7 @@ if test "$PHP_GRPC" != "no"; then
-DGRPC_XDS_USER_AGENT_VERSION_SUFFIX='"\"1.46.0dev\""')
PHP_ADD_BUILD_DIR($ext_builddir/src/core/ext/filters/census)
+ PHP_ADD_BUILD_DIR($ext_builddir/src/core/ext/filters/channel_idle)
PHP_ADD_BUILD_DIR($ext_builddir/src/core/ext/filters/client_channel)
PHP_ADD_BUILD_DIR($ext_builddir/src/core/ext/filters/client_channel/health)
PHP_ADD_BUILD_DIR($ext_builddir/src/core/ext/filters/client_channel/lb_policy)
@@ -1187,14 +1187,12 @@ if test "$PHP_GRPC" != "no"; then
PHP_ADD_BUILD_DIR($ext_builddir/src/core/ext/filters/client_channel/resolver/google_c2p)
PHP_ADD_BUILD_DIR($ext_builddir/src/core/ext/filters/client_channel/resolver/sockaddr)
PHP_ADD_BUILD_DIR($ext_builddir/src/core/ext/filters/client_channel/resolver/xds)
- PHP_ADD_BUILD_DIR($ext_builddir/src/core/ext/filters/client_idle)
PHP_ADD_BUILD_DIR($ext_builddir/src/core/ext/filters/deadline)
PHP_ADD_BUILD_DIR($ext_builddir/src/core/ext/filters/fault_injection)
PHP_ADD_BUILD_DIR($ext_builddir/src/core/ext/filters/http)
PHP_ADD_BUILD_DIR($ext_builddir/src/core/ext/filters/http/client)
PHP_ADD_BUILD_DIR($ext_builddir/src/core/ext/filters/http/message_compress)
PHP_ADD_BUILD_DIR($ext_builddir/src/core/ext/filters/http/server)
- PHP_ADD_BUILD_DIR($ext_builddir/src/core/ext/filters/max_age)
PHP_ADD_BUILD_DIR($ext_builddir/src/core/ext/filters/message_size)
PHP_ADD_BUILD_DIR($ext_builddir/src/core/ext/filters/rbac)
PHP_ADD_BUILD_DIR($ext_builddir/src/core/ext/filters/server_config_selector)
diff --git a/config.w32 b/config.w32
index 990db857c7f..7ebeebc8b55 100644
--- a/config.w32
+++ b/config.w32
@@ -7,6 +7,8 @@ if (PHP_GRPC != "no") {
EXTENSION("grpc",
"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\\client_channel\\backend_metric.cc " +
"src\\core\\ext\\filters\\client_channel\\backup_poller.cc " +
"src\\core\\ext\\filters\\client_channel\\channel_connectivity.cc " +
@@ -65,8 +67,6 @@ if (PHP_GRPC != "no") {
"src\\core\\ext\\filters\\client_channel\\subchannel.cc " +
"src\\core\\ext\\filters\\client_channel\\subchannel_pool_interface.cc " +
"src\\core\\ext\\filters\\client_channel\\subchannel_stream_client.cc " +
- "src\\core\\ext\\filters\\client_idle\\client_idle_filter.cc " +
- "src\\core\\ext\\filters\\client_idle\\idle_filter_state.cc " +
"src\\core\\ext\\filters\\deadline\\deadline_filter.cc " +
"src\\core\\ext\\filters\\fault_injection\\fault_injection_filter.cc " +
"src\\core\\ext\\filters\\fault_injection\\service_config_parser.cc " +
@@ -76,7 +76,6 @@ if (PHP_GRPC != "no") {
"src\\core\\ext\\filters\\http\\message_compress\\message_compress_filter.cc " +
"src\\core\\ext\\filters\\http\\message_compress\\message_decompress_filter.cc " +
"src\\core\\ext\\filters\\http\\server\\http_server_filter.cc " +
- "src\\core\\ext\\filters\\max_age\\max_age_filter.cc " +
"src\\core\\ext\\filters\\message_size\\message_size_filter.cc " +
"src\\core\\ext\\filters\\rbac\\rbac_filter.cc " +
"src\\core\\ext\\filters\\rbac\\rbac_service_config_parser.cc " +
@@ -1165,6 +1164,7 @@ if (PHP_GRPC != "no") {
FSO.CreateFolder(base_dir+"\\ext\\grpc\\src\\core\\ext");
FSO.CreateFolder(base_dir+"\\ext\\grpc\\src\\core\\ext\\filters");
FSO.CreateFolder(base_dir+"\\ext\\grpc\\src\\core\\ext\\filters\\census");
+ FSO.CreateFolder(base_dir+"\\ext\\grpc\\src\\core\\ext\\filters\\channel_idle");
FSO.CreateFolder(base_dir+"\\ext\\grpc\\src\\core\\ext\\filters\\client_channel");
FSO.CreateFolder(base_dir+"\\ext\\grpc\\src\\core\\ext\\filters\\client_channel\\health");
FSO.CreateFolder(base_dir+"\\ext\\grpc\\src\\core\\ext\\filters\\client_channel\\lb_policy");
@@ -1185,14 +1185,12 @@ if (PHP_GRPC != "no") {
FSO.CreateFolder(base_dir+"\\ext\\grpc\\src\\core\\ext\\filters\\client_channel\\resolver\\google_c2p");
FSO.CreateFolder(base_dir+"\\ext\\grpc\\src\\core\\ext\\filters\\client_channel\\resolver\\sockaddr");
FSO.CreateFolder(base_dir+"\\ext\\grpc\\src\\core\\ext\\filters\\client_channel\\resolver\\xds");
- FSO.CreateFolder(base_dir+"\\ext\\grpc\\src\\core\\ext\\filters\\client_idle");
FSO.CreateFolder(base_dir+"\\ext\\grpc\\src\\core\\ext\\filters\\deadline");
FSO.CreateFolder(base_dir+"\\ext\\grpc\\src\\core\\ext\\filters\\fault_injection");
FSO.CreateFolder(base_dir+"\\ext\\grpc\\src\\core\\ext\\filters\\http");
FSO.CreateFolder(base_dir+"\\ext\\grpc\\src\\core\\ext\\filters\\http\\client");
FSO.CreateFolder(base_dir+"\\ext\\grpc\\src\\core\\ext\\filters\\http\\message_compress");
FSO.CreateFolder(base_dir+"\\ext\\grpc\\src\\core\\ext\\filters\\http\\server");
- FSO.CreateFolder(base_dir+"\\ext\\grpc\\src\\core\\ext\\filters\\max_age");
FSO.CreateFolder(base_dir+"\\ext\\grpc\\src\\core\\ext\\filters\\message_size");
FSO.CreateFolder(base_dir+"\\ext\\grpc\\src\\core\\ext\\filters\\rbac");
FSO.CreateFolder(base_dir+"\\ext\\grpc\\src\\core\\ext\\filters\\server_config_selector");
diff --git a/gRPC-C++.podspec b/gRPC-C++.podspec
index 224de8efaeb..886e73765a5 100644
--- a/gRPC-C++.podspec
+++ b/gRPC-C++.podspec
@@ -214,7 +214,8 @@ Pod::Spec.new do |s|
ss.dependency 'abseil/types/variant', abseil_version
ss.dependency 'abseil/utility/utility', abseil_version
- ss.source_files = 'src/core/ext/filters/client_channel/backend_metric.h',
+ ss.source_files = 'src/core/ext/filters/channel_idle/idle_filter_state.h',
+ 'src/core/ext/filters/client_channel/backend_metric.h',
'src/core/ext/filters/client_channel/backup_poller.h',
'src/core/ext/filters/client_channel/client_channel.h',
'src/core/ext/filters/client_channel/client_channel_channelz.h',
@@ -257,7 +258,6 @@ Pod::Spec.new do |s|
'src/core/ext/filters/client_channel/subchannel_interface.h',
'src/core/ext/filters/client_channel/subchannel_pool_interface.h',
'src/core/ext/filters/client_channel/subchannel_stream_client.h',
- 'src/core/ext/filters/client_idle/idle_filter_state.h',
'src/core/ext/filters/deadline/deadline_filter.h',
'src/core/ext/filters/fault_injection/fault_injection_filter.h',
'src/core/ext/filters/fault_injection/service_config_parser.h',
@@ -266,7 +266,6 @@ Pod::Spec.new do |s|
'src/core/ext/filters/http/message_compress/message_compress_filter.h',
'src/core/ext/filters/http/message_compress/message_decompress_filter.h',
'src/core/ext/filters/http/server/http_server_filter.h',
- 'src/core/ext/filters/max_age/max_age_filter.h',
'src/core/ext/filters/message_size/message_size_filter.h',
'src/core/ext/filters/rbac/rbac_filter.h',
'src/core/ext/filters/rbac/rbac_service_config_parser.h',
@@ -698,6 +697,7 @@ Pod::Spec.new do |s|
'src/core/lib/gprpp/overload.h',
'src/core/lib/gprpp/ref_counted.h',
'src/core/lib/gprpp/ref_counted_ptr.h',
+ 'src/core/lib/gprpp/single_set_ptr.h',
'src/core/lib/gprpp/stat.h',
'src/core/lib/gprpp/status_helper.h',
'src/core/lib/gprpp/sync.h',
@@ -1041,7 +1041,8 @@ Pod::Spec.new do |s|
'third_party/upb/upb/upb_internal.h',
'third_party/xxhash/xxhash.h'
- ss.private_header_files = 'src/core/ext/filters/client_channel/backend_metric.h',
+ ss.private_header_files = 'src/core/ext/filters/channel_idle/idle_filter_state.h',
+ 'src/core/ext/filters/client_channel/backend_metric.h',
'src/core/ext/filters/client_channel/backup_poller.h',
'src/core/ext/filters/client_channel/client_channel.h',
'src/core/ext/filters/client_channel/client_channel_channelz.h',
@@ -1084,7 +1085,6 @@ Pod::Spec.new do |s|
'src/core/ext/filters/client_channel/subchannel_interface.h',
'src/core/ext/filters/client_channel/subchannel_pool_interface.h',
'src/core/ext/filters/client_channel/subchannel_stream_client.h',
- 'src/core/ext/filters/client_idle/idle_filter_state.h',
'src/core/ext/filters/deadline/deadline_filter.h',
'src/core/ext/filters/fault_injection/fault_injection_filter.h',
'src/core/ext/filters/fault_injection/service_config_parser.h',
@@ -1093,7 +1093,6 @@ Pod::Spec.new do |s|
'src/core/ext/filters/http/message_compress/message_compress_filter.h',
'src/core/ext/filters/http/message_compress/message_decompress_filter.h',
'src/core/ext/filters/http/server/http_server_filter.h',
- 'src/core/ext/filters/max_age/max_age_filter.h',
'src/core/ext/filters/message_size/message_size_filter.h',
'src/core/ext/filters/rbac/rbac_filter.h',
'src/core/ext/filters/rbac/rbac_service_config_parser.h',
@@ -1507,6 +1506,7 @@ Pod::Spec.new do |s|
'src/core/lib/gprpp/overload.h',
'src/core/lib/gprpp/ref_counted.h',
'src/core/lib/gprpp/ref_counted_ptr.h',
+ 'src/core/lib/gprpp/single_set_ptr.h',
'src/core/lib/gprpp/stat.h',
'src/core/lib/gprpp/status_helper.h',
'src/core/lib/gprpp/sync.h',
diff --git a/gRPC-Core.podspec b/gRPC-Core.podspec
index 0a860019718..49818aba660 100644
--- a/gRPC-Core.podspec
+++ b/gRPC-Core.podspec
@@ -192,6 +192,9 @@ Pod::Spec.new do |s|
ss.compiler_flags = '-DBORINGSSL_PREFIX=GRPC -Wno-unreachable-code -Wno-shorten-64-to-32'
ss.source_files = '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/idle_filter_state.h',
'src/core/ext/filters/client_channel/backend_metric.cc',
'src/core/ext/filters/client_channel/backend_metric.h',
'src/core/ext/filters/client_channel/backup_poller.cc',
@@ -293,9 +296,6 @@ Pod::Spec.new do |s|
'src/core/ext/filters/client_channel/subchannel_pool_interface.h',
'src/core/ext/filters/client_channel/subchannel_stream_client.cc',
'src/core/ext/filters/client_channel/subchannel_stream_client.h',
- 'src/core/ext/filters/client_idle/client_idle_filter.cc',
- 'src/core/ext/filters/client_idle/idle_filter_state.cc',
- 'src/core/ext/filters/client_idle/idle_filter_state.h',
'src/core/ext/filters/deadline/deadline_filter.cc',
'src/core/ext/filters/deadline/deadline_filter.h',
'src/core/ext/filters/fault_injection/fault_injection_filter.cc',
@@ -313,8 +313,6 @@ Pod::Spec.new do |s|
'src/core/ext/filters/http/message_compress/message_decompress_filter.h',
'src/core/ext/filters/http/server/http_server_filter.cc',
'src/core/ext/filters/http/server/http_server_filter.h',
- 'src/core/ext/filters/max_age/max_age_filter.cc',
- 'src/core/ext/filters/max_age/max_age_filter.h',
'src/core/ext/filters/message_size/message_size_filter.cc',
'src/core/ext/filters/message_size/message_size_filter.h',
'src/core/ext/filters/rbac/rbac_filter.cc',
@@ -1101,6 +1099,7 @@ Pod::Spec.new do |s|
'src/core/lib/gprpp/overload.h',
'src/core/lib/gprpp/ref_counted.h',
'src/core/lib/gprpp/ref_counted_ptr.h',
+ 'src/core/lib/gprpp/single_set_ptr.h',
'src/core/lib/gprpp/stat.h',
'src/core/lib/gprpp/stat_posix.cc',
'src/core/lib/gprpp/stat_windows.cc',
@@ -1663,7 +1662,8 @@ Pod::Spec.new do |s|
'third_party/upb/upb/upb.hpp',
'third_party/upb/upb/upb_internal.h',
'third_party/xxhash/xxhash.h'
- ss.private_header_files = 'src/core/ext/filters/client_channel/backend_metric.h',
+ ss.private_header_files = 'src/core/ext/filters/channel_idle/idle_filter_state.h',
+ 'src/core/ext/filters/client_channel/backend_metric.h',
'src/core/ext/filters/client_channel/backup_poller.h',
'src/core/ext/filters/client_channel/client_channel.h',
'src/core/ext/filters/client_channel/client_channel_channelz.h',
@@ -1706,7 +1706,6 @@ Pod::Spec.new do |s|
'src/core/ext/filters/client_channel/subchannel_interface.h',
'src/core/ext/filters/client_channel/subchannel_pool_interface.h',
'src/core/ext/filters/client_channel/subchannel_stream_client.h',
- 'src/core/ext/filters/client_idle/idle_filter_state.h',
'src/core/ext/filters/deadline/deadline_filter.h',
'src/core/ext/filters/fault_injection/fault_injection_filter.h',
'src/core/ext/filters/fault_injection/service_config_parser.h',
@@ -1715,7 +1714,6 @@ Pod::Spec.new do |s|
'src/core/ext/filters/http/message_compress/message_compress_filter.h',
'src/core/ext/filters/http/message_compress/message_decompress_filter.h',
'src/core/ext/filters/http/server/http_server_filter.h',
- 'src/core/ext/filters/max_age/max_age_filter.h',
'src/core/ext/filters/message_size/message_size_filter.h',
'src/core/ext/filters/rbac/rbac_filter.h',
'src/core/ext/filters/rbac/rbac_service_config_parser.h',
@@ -2109,6 +2107,7 @@ Pod::Spec.new do |s|
'src/core/lib/gprpp/overload.h',
'src/core/lib/gprpp/ref_counted.h',
'src/core/lib/gprpp/ref_counted_ptr.h',
+ 'src/core/lib/gprpp/single_set_ptr.h',
'src/core/lib/gprpp/stat.h',
'src/core/lib/gprpp/status_helper.h',
'src/core/lib/gprpp/sync.h',
diff --git a/grpc.gemspec b/grpc.gemspec
index 2465cae2653..577937faf46 100644
--- a/grpc.gemspec
+++ b/grpc.gemspec
@@ -111,6 +111,9 @@ Gem::Specification.new do |s|
s.files += %w( include/grpc/support/time.h )
s.files += %w( include/grpc/support/workaround_list.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/idle_filter_state.cc )
+ s.files += %w( src/core/ext/filters/channel_idle/idle_filter_state.h )
s.files += %w( src/core/ext/filters/client_channel/backend_metric.cc )
s.files += %w( src/core/ext/filters/client_channel/backend_metric.h )
s.files += %w( src/core/ext/filters/client_channel/backup_poller.cc )
@@ -212,9 +215,6 @@ Gem::Specification.new do |s|
s.files += %w( src/core/ext/filters/client_channel/subchannel_pool_interface.h )
s.files += %w( src/core/ext/filters/client_channel/subchannel_stream_client.cc )
s.files += %w( src/core/ext/filters/client_channel/subchannel_stream_client.h )
- s.files += %w( src/core/ext/filters/client_idle/client_idle_filter.cc )
- s.files += %w( src/core/ext/filters/client_idle/idle_filter_state.cc )
- s.files += %w( src/core/ext/filters/client_idle/idle_filter_state.h )
s.files += %w( src/core/ext/filters/deadline/deadline_filter.cc )
s.files += %w( src/core/ext/filters/deadline/deadline_filter.h )
s.files += %w( src/core/ext/filters/fault_injection/fault_injection_filter.cc )
@@ -232,8 +232,6 @@ Gem::Specification.new do |s|
s.files += %w( src/core/ext/filters/http/message_compress/message_decompress_filter.h )
s.files += %w( src/core/ext/filters/http/server/http_server_filter.cc )
s.files += %w( src/core/ext/filters/http/server/http_server_filter.h )
- s.files += %w( src/core/ext/filters/max_age/max_age_filter.cc )
- s.files += %w( src/core/ext/filters/max_age/max_age_filter.h )
s.files += %w( src/core/ext/filters/message_size/message_size_filter.cc )
s.files += %w( src/core/ext/filters/message_size/message_size_filter.h )
s.files += %w( src/core/ext/filters/rbac/rbac_filter.cc )
@@ -1020,6 +1018,7 @@ Gem::Specification.new do |s|
s.files += %w( src/core/lib/gprpp/overload.h )
s.files += %w( src/core/lib/gprpp/ref_counted.h )
s.files += %w( src/core/lib/gprpp/ref_counted_ptr.h )
+ s.files += %w( src/core/lib/gprpp/single_set_ptr.h )
s.files += %w( src/core/lib/gprpp/stat.h )
s.files += %w( src/core/lib/gprpp/stat_posix.cc )
s.files += %w( src/core/lib/gprpp/stat_windows.cc )
diff --git a/grpc.gyp b/grpc.gyp
index 3a796ce45b8..6dc581143e7 100644
--- a/grpc.gyp
+++ b/grpc.gyp
@@ -371,6 +371,8 @@
],
'sources': [
'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/client_channel/backend_metric.cc',
'src/core/ext/filters/client_channel/backup_poller.cc',
'src/core/ext/filters/client_channel/channel_connectivity.cc',
@@ -429,8 +431,6 @@
'src/core/ext/filters/client_channel/subchannel.cc',
'src/core/ext/filters/client_channel/subchannel_pool_interface.cc',
'src/core/ext/filters/client_channel/subchannel_stream_client.cc',
- 'src/core/ext/filters/client_idle/client_idle_filter.cc',
- 'src/core/ext/filters/client_idle/idle_filter_state.cc',
'src/core/ext/filters/deadline/deadline_filter.cc',
'src/core/ext/filters/fault_injection/fault_injection_filter.cc',
'src/core/ext/filters/fault_injection/service_config_parser.cc',
@@ -440,7 +440,6 @@
'src/core/ext/filters/http/message_compress/message_compress_filter.cc',
'src/core/ext/filters/http/message_compress/message_decompress_filter.cc',
'src/core/ext/filters/http/server/http_server_filter.cc',
- 'src/core/ext/filters/max_age/max_age_filter.cc',
'src/core/ext/filters/message_size/message_size_filter.cc',
'src/core/ext/filters/rbac/rbac_filter.cc',
'src/core/ext/filters/rbac/rbac_service_config_parser.cc',
@@ -1127,6 +1126,8 @@
],
'sources': [
'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/client_channel/backend_metric.cc',
'src/core/ext/filters/client_channel/backup_poller.cc',
'src/core/ext/filters/client_channel/channel_connectivity.cc',
@@ -1179,8 +1180,6 @@
'src/core/ext/filters/client_channel/subchannel.cc',
'src/core/ext/filters/client_channel/subchannel_pool_interface.cc',
'src/core/ext/filters/client_channel/subchannel_stream_client.cc',
- 'src/core/ext/filters/client_idle/client_idle_filter.cc',
- 'src/core/ext/filters/client_idle/idle_filter_state.cc',
'src/core/ext/filters/deadline/deadline_filter.cc',
'src/core/ext/filters/fault_injection/fault_injection_filter.cc',
'src/core/ext/filters/fault_injection/service_config_parser.cc',
@@ -1190,7 +1189,6 @@
'src/core/ext/filters/http/message_compress/message_compress_filter.cc',
'src/core/ext/filters/http/message_compress/message_decompress_filter.cc',
'src/core/ext/filters/http/server/http_server_filter.cc',
- 'src/core/ext/filters/max_age/max_age_filter.cc',
'src/core/ext/filters/message_size/message_size_filter.cc',
'src/core/ext/transport/chttp2/alpn/alpn.cc',
'src/core/ext/transport/chttp2/client/chttp2_connector.cc',
diff --git a/package.xml b/package.xml
index 32f6916f712..863af74dbb4 100644
--- a/package.xml
+++ b/package.xml
@@ -91,6 +91,9 @@
+
+
+
@@ -192,9 +195,6 @@
-
-
-
@@ -212,8 +212,6 @@
-
-
@@ -1000,6 +998,7 @@
+
diff --git a/src/core/ext/filters/channel_idle/channel_idle_filter.cc b/src/core/ext/filters/channel_idle/channel_idle_filter.cc
new file mode 100644
index 00000000000..a52169a695d
--- /dev/null
+++ b/src/core/ext/filters/channel_idle/channel_idle_filter.cc
@@ -0,0 +1,406 @@
+// 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
+#include
+
+#include
+#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_stack_builder.h"
+#include "src/core/lib/channel/promise_based_filter.h"
+#include "src/core/lib/config/core_configuration.h"
+#include "src/core/lib/gprpp/capture.h"
+#include "src/core/lib/gprpp/single_set_ptr.h"
+#include "src/core/lib/iomgr/timer.h"
+#include "src/core/lib/promise/exec_ctx_wakeup_scheduler.h"
+#include "src/core/lib/promise/loop.h"
+#include "src/core/lib/promise/sleep.h"
+#include "src/core/lib/promise/try_seq.h"
+#include "src/core/lib/transport/http2_errors.h"
+
+// TODO(juanlishen): The idle filter was disabled in client channel by default
+// due to b/143502997. Now the bug is fixed enable the filter by default.
+#define DEFAULT_IDLE_TIMEOUT_MS INT_MAX
+// The user input idle timeout smaller than this would be capped to it.
+#define MIN_IDLE_TIMEOUT_MS (1 /*second*/ * 1000)
+
+// 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.
+#define DEFAULT_MAX_CONNECTION_AGE_MS INT_MAX
+#define DEFAULT_MAX_CONNECTION_AGE_GRACE_MS INT_MAX
+#define DEFAULT_MAX_CONNECTION_IDLE_MS INT_MAX
+#define MAX_CONNECTION_AGE_JITTER 0.1
+
+#define MAX_CONNECTION_AGE_INTEGER_OPTIONS \
+ { DEFAULT_MAX_CONNECTION_AGE_MS, 1, INT_MAX }
+#define MAX_CONNECTION_IDLE_INTEGER_OPTIONS \
+ { DEFAULT_MAX_CONNECTION_IDLE_MS, 1, INT_MAX }
+
+namespace grpc_core {
+
+TraceFlag grpc_trace_client_idle_filter(false, "client_idle_filter");
+
+#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 {
+
+using SingleSetActivityPtr =
+ SingleSetPtr;
+
+Duration GetClientIdleTimeout(const grpc_channel_args* args) {
+ int ms = std::max(
+ grpc_channel_arg_get_integer(
+ grpc_channel_args_find(args, GRPC_ARG_CLIENT_IDLE_TIMEOUT_MS),
+ {DEFAULT_IDLE_TIMEOUT_MS, 0, INT_MAX}),
+ MIN_IDLE_TIMEOUT_MS);
+ return ms == INT_MAX ? Duration::Infinity() : Duration::Milliseconds(ms);
+}
+
+struct MaxAgeConfig {
+ 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 to spread out
+ connection storms. Note that the MAX_CONNECTION_AGE option without jitter
+ would not create connection storms by itself, but if there happened to be a
+ connection storm it could cause it to repeat at a fixed period. */
+MaxAgeConfig GetMaxAgeConfig(const grpc_channel_args* args) {
+ const int args_max_age = grpc_channel_arg_get_integer(
+ grpc_channel_args_find(args, GRPC_ARG_MAX_CONNECTION_AGE_MS),
+ MAX_CONNECTION_AGE_INTEGER_OPTIONS);
+ const int args_max_idle = grpc_channel_arg_get_integer(
+ grpc_channel_args_find(args, GRPC_ARG_MAX_CONNECTION_IDLE_MS),
+ MAX_CONNECTION_IDLE_INTEGER_OPTIONS);
+ const int args_max_age_grace = grpc_channel_arg_get_integer(
+ grpc_channel_args_find(args, GRPC_ARG_MAX_CONNECTION_AGE_GRACE_MS),
+ {DEFAULT_MAX_CONNECTION_AGE_GRACE_MS, 0, INT_MAX});
+ /* generate a random number between 1 - MAX_CONNECTION_AGE_JITTER and
+ 1 + MAX_CONNECTION_AGE_JITTER */
+ const double multiplier =
+ rand() * MAX_CONNECTION_AGE_JITTER * 2.0 / RAND_MAX + 1.0 -
+ MAX_CONNECTION_AGE_JITTER;
+ /* 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 MaxAgeConfig{
+ args_max_age == INT_MAX
+ ? Duration::Infinity()
+ : Duration::FromSecondsAsDouble(multiplier * args_max_age / 1000.0),
+ args_max_idle == INT_MAX ? Duration::Infinity()
+ : Duration::Milliseconds(args_max_idle),
+ Duration::Milliseconds(args_max_age_grace)};
+}
+
+class ChannelIdleFilter : public ChannelFilter {
+ public:
+ ~ChannelIdleFilter() override = default;
+
+ ChannelIdleFilter(const ChannelIdleFilter&) = delete;
+ ChannelIdleFilter& operator=(const ChannelIdleFilter&) = delete;
+ ChannelIdleFilter(ChannelIdleFilter&&) = default;
+ ChannelIdleFilter& operator=(ChannelIdleFilter&&) = default;
+
+ // Construct a promise for one call.
+ ArenaPromise MakeCallPromise(
+ CallArgs call_args, NextPromiseFactory next_promise_factory) override;
+
+ bool StartTransportOp(grpc_transport_op* op) override;
+
+ protected:
+ 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();
+
+ struct CallCountDecreaser {
+ void operator()(ChannelIdleFilter* filter) const {
+ filter->DecreaseCallCount();
+ }
+ };
+
+ // 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 absl::StatusOr Create(
+ const grpc_channel_args* args, ChannelFilter::Args filter_args);
+
+ private:
+ using ChannelIdleFilter::ChannelIdleFilter;
+};
+
+class MaxAgeFilter final : public ChannelIdleFilter {
+ public:
+ static absl::StatusOr Create(const grpc_channel_args* args,
+ ChannelFilter::Args filter_args);
+
+ void Start();
+
+ 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 MaxAgeConfig& 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) {}
+
+ void Shutdown() override;
+
+ SingleSetActivityPtr max_age_activity_;
+ Duration max_connection_age_;
+ Duration max_connection_age_grace_;
+};
+
+absl::StatusOr ClientIdleFilter::Create(
+ const grpc_channel_args* args, ChannelFilter::Args filter_args) {
+ ClientIdleFilter filter(filter_args.channel_stack(),
+ GetClientIdleTimeout(args));
+ return absl::StatusOr(std::move(filter));
+}
+
+absl::StatusOr MaxAgeFilter::Create(
+ const grpc_channel_args* args, ChannelFilter::Args filter_args) {
+ const auto config = GetMaxAgeConfig(args);
+ MaxAgeFilter filter(filter_args.channel_stack(), config);
+ return absl::StatusOr(std::move(filter));
+}
+
+void MaxAgeFilter::Shutdown() {
+ max_age_activity_.Reset();
+ ChannelIdleFilter::Shutdown();
+}
+
+void MaxAgeFilter::Start() {
+ // Trigger idle timer immediately
+ IncreaseCallCount();
+ DecreaseCallCount();
+
+ struct StartupClosure {
+ RefCountedPtr channel_stack;
+ MaxAgeFilter* filter;
+ grpc_closure closure;
+ };
+ auto run_startup = [](void* p, grpc_error_handle) {
+ auto* startup = static_cast(p);
+ 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, GRPC_ERROR_NONE);
+
+ 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(ExecCtx::Get()->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_FROM_STATIC_STRING("max_age"),
+ GRPC_ERROR_INT_HTTP2_ERROR, 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),
+ GRPC_ERROR_NONE);
+ return Immediate(absl::OkStatus());
+ },
+ // Sleep for the grace period
+ [this] {
+ return Sleep(ExecCtx::Get()->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();
+ }));
+ }
+}
+
+// Construct a promise for one call.
+ArenaPromise ChannelIdleFilter::MakeCallPromise(
+ CallArgs call_args, NextPromiseFactory next_promise_factory) {
+ using Decrementer = std::unique_ptr;
+ IncreaseCallCount();
+ return ArenaPromise(
+ Capture([](Decrementer*, ArenaPromise* next)
+ -> Poll { return (*next)(); },
+ Decrementer(this), next_promise_factory(std::move(call_args))));
+}
+
+bool ChannelIdleFilter::StartTransportOp(grpc_transport_op* op) {
+ // Catch the disconnect_with_error transport op.
+ if (op->disconnect_with_error != GRPC_ERROR_NONE) 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(ExecCtx::Get()->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();
+ }));
+}
+
+void ChannelIdleFilter::CloseChannel() {
+ auto* op = grpc_make_transport_op(nullptr);
+ op->disconnect_with_error = grpc_error_set_int(
+ GRPC_ERROR_CREATE_FROM_STATIC_STRING("enter idle"),
+ GRPC_ERROR_INT_CHANNEL_CONNECTIVITY_STATE, 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 grpc_client_idle_filter =
+ MakePromiseBasedFilter(
+ "client_idle");
+const grpc_channel_filter grpc_max_age_filter =
+ MakePromiseBasedFilter("max_age");
+
+} // namespace
+
+void RegisterChannelIdleFilters(CoreConfiguration::Builder* builder) {
+ builder->channel_init()->RegisterStage(
+ GRPC_CLIENT_CHANNEL, GRPC_CHANNEL_INIT_BUILTIN_PRIORITY,
+ [](ChannelStackBuilder* builder) {
+ const grpc_channel_args* channel_args = builder->channel_args();
+ if (!grpc_channel_args_want_minimal_stack(channel_args) &&
+ GetClientIdleTimeout(channel_args) != Duration::Infinity()) {
+ builder->PrependFilter(&grpc_client_idle_filter, nullptr);
+ }
+ return true;
+ });
+ builder->channel_init()->RegisterStage(
+ GRPC_SERVER_CHANNEL, GRPC_CHANNEL_INIT_BUILTIN_PRIORITY,
+ [](ChannelStackBuilder* builder) {
+ const grpc_channel_args* channel_args = builder->channel_args();
+ if (!grpc_channel_args_want_minimal_stack(channel_args) &&
+ GetMaxAgeConfig(channel_args).enable()) {
+ builder->PrependFilter(
+ &grpc_max_age_filter,
+ [](grpc_channel_stack*, grpc_channel_element* elem) {
+ static_cast(elem->channel_data)->Start();
+ });
+ }
+ return true;
+ });
+}
+} // namespace grpc_core
diff --git a/src/core/ext/filters/client_idle/idle_filter_state.cc b/src/core/ext/filters/channel_idle/idle_filter_state.cc
similarity index 98%
rename from src/core/ext/filters/client_idle/idle_filter_state.cc
rename to src/core/ext/filters/channel_idle/idle_filter_state.cc
index cd0689721e1..72b5448a1e5 100644
--- a/src/core/ext/filters/client_idle/idle_filter_state.cc
+++ b/src/core/ext/filters/channel_idle/idle_filter_state.cc
@@ -14,7 +14,7 @@
#include
-#include "src/core/ext/filters/client_idle/idle_filter_state.h"
+#include "src/core/ext/filters/channel_idle/idle_filter_state.h"
#include
diff --git a/src/core/ext/filters/client_idle/idle_filter_state.h b/src/core/ext/filters/channel_idle/idle_filter_state.h
similarity index 92%
rename from src/core/ext/filters/client_idle/idle_filter_state.h
rename to src/core/ext/filters/channel_idle/idle_filter_state.h
index 3c3a1952164..f70c3c853be 100644
--- a/src/core/ext/filters/client_idle/idle_filter_state.h
+++ b/src/core/ext/filters/channel_idle/idle_filter_state.h
@@ -12,8 +12,8 @@
// See the License for the specific language governing permissions and
// limitations under the License.
-#ifndef GRPC_CORE_EXT_FILTERS_CLIENT_IDLE_IDLE_FILTER_STATE_H
-#define GRPC_CORE_EXT_FILTERS_CLIENT_IDLE_IDLE_FILTER_STATE_H
+#ifndef GRPC_CORE_EXT_FILTERS_CHANNEL_IDLE_IDLE_FILTER_STATE_H
+#define GRPC_CORE_EXT_FILTERS_CHANNEL_IDLE_IDLE_FILTER_STATE_H
#include
@@ -63,4 +63,4 @@ class IdleFilterState {
} // namespace grpc_core
-#endif // GRPC_CORE_EXT_FILTERS_CLIENT_IDLE_IDLE_FILTER_STATE_H
+#endif // GRPC_CORE_EXT_FILTERS_CHANNEL_IDLE_IDLE_FILTER_STATE_H
diff --git a/src/core/ext/filters/client_idle/client_idle_filter.cc b/src/core/ext/filters/client_idle/client_idle_filter.cc
deleted file mode 100644
index 9c1c7b3ae34..00000000000
--- a/src/core/ext/filters/client_idle/client_idle_filter.cc
+++ /dev/null
@@ -1,199 +0,0 @@
-/*
- *
- * Copyright 2019 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.
- *
- */
-
-#include
-
-#include
-
-#include
-
-#include "src/core/ext/filters/client_idle/idle_filter_state.h"
-#include "src/core/lib/channel/channel_args.h"
-#include "src/core/lib/channel/channel_stack_builder.h"
-#include "src/core/lib/channel/promise_based_filter.h"
-#include "src/core/lib/config/core_configuration.h"
-#include "src/core/lib/gprpp/capture.h"
-#include "src/core/lib/iomgr/timer.h"
-#include "src/core/lib/promise/exec_ctx_wakeup_scheduler.h"
-#include "src/core/lib/promise/loop.h"
-#include "src/core/lib/promise/sleep.h"
-#include "src/core/lib/promise/try_seq.h"
-#include "src/core/lib/transport/http2_errors.h"
-
-// TODO(juanlishen): The idle filter is disabled in client channel by default
-// due to b/143502997. Try to fix the bug and enable the filter by default.
-#define DEFAULT_IDLE_TIMEOUT_MS INT_MAX
-// The user input idle timeout smaller than this would be capped to it.
-#define MIN_IDLE_TIMEOUT_MS (1 /*second*/ * 1000)
-
-namespace grpc_core {
-
-TraceFlag grpc_trace_client_idle_filter(false, "client_idle_filter");
-
-#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 grpc_channel_args* args) {
- auto millis = std::max(
- grpc_channel_arg_get_integer(
- grpc_channel_args_find(args, GRPC_ARG_CLIENT_IDLE_TIMEOUT_MS),
- {DEFAULT_IDLE_TIMEOUT_MS, 0, INT_MAX}),
- MIN_IDLE_TIMEOUT_MS);
- if (millis == INT_MAX) return Duration::Infinity();
- return Duration::Milliseconds(millis);
-}
-
-class ClientIdleFilter : public ChannelFilter {
- public:
- static absl::StatusOr Create(
- const grpc_channel_args* args, ChannelFilter::Args filter_args);
- ~ClientIdleFilter() override = default;
-
- ClientIdleFilter(const ClientIdleFilter&) = delete;
- ClientIdleFilter& operator=(const ClientIdleFilter&) = delete;
- ClientIdleFilter(ClientIdleFilter&&) = default;
- ClientIdleFilter& operator=(ClientIdleFilter&&) = default;
-
- // Construct a promise for one call.
- ArenaPromise MakeCallPromise(
- CallArgs call_args, NextPromiseFactory next_promise_factory) override;
-
- bool StartTransportOp(grpc_transport_op* op) override;
-
- private:
- ClientIdleFilter(grpc_channel_stack* channel_stack,
- Duration client_idle_timeout)
- : channel_stack_(channel_stack),
- client_idle_timeout_(client_idle_timeout) {}
-
- void StartIdleTimer();
-
- void IncreaseCallCount();
- void DecreaseCallCount();
-
- struct CallCountDecreaser {
- void operator()(ClientIdleFilter* filter) const {
- filter->DecreaseCallCount();
- }
- };
-
- // 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)};
-
- ActivityPtr activity_;
-};
-
-absl::StatusOr ClientIdleFilter::Create(
- const grpc_channel_args* args, ChannelFilter::Args filter_args) {
- ClientIdleFilter filter(filter_args.channel_stack(),
- GetClientIdleTimeout(args));
- return absl::StatusOr(std::move(filter));
-}
-
-// Construct a promise for one call.
-ArenaPromise ClientIdleFilter::MakeCallPromise(
- CallArgs call_args, NextPromiseFactory next_promise_factory) {
- using Decrementer = std::unique_ptr;
- IncreaseCallCount();
- return ArenaPromise(
- Capture([](Decrementer*, ArenaPromise* next)
- -> Poll { return (*next)(); },
- Decrementer(this), next_promise_factory(std::move(call_args))));
-}
-
-bool ClientIdleFilter::StartTransportOp(grpc_transport_op* op) {
- // Catch the disconnect_with_error transport op.
- if (op->disconnect_with_error != GRPC_ERROR_NONE) {
- // IncreaseCallCount() introduces a phony call and prevent the timer from
- // being reset by other threads.
- IncreaseCallCount();
- activity_.reset();
- }
- // Pass the op to the next filter.
- return false;
-}
-
-void ClientIdleFilter::IncreaseCallCount() {
- idle_filter_state_->IncreaseCallCount();
-}
-
-void ClientIdleFilter::DecreaseCallCount() {
- if (idle_filter_state_->DecreaseCallCount()) {
- // If there are no more calls in progress, start the idle timer.
- StartIdleTimer();
- }
-}
-
-void ClientIdleFilter::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(ExecCtx::Get()->Now() + timeout),
- [idle_filter_state]() -> Poll> {
- if (idle_filter_state->CheckTimer()) {
- return Continue{};
- } else {
- return absl::OkStatus();
- }
- });
- });
- activity_ = MakeActivity(
- std::move(promise), ExecCtxWakeupScheduler{},
- [channel_stack](absl::Status status) {
- if (!status.ok()) return;
- auto* op = grpc_make_transport_op(nullptr);
- op->disconnect_with_error = grpc_error_set_int(
- GRPC_ERROR_CREATE_FROM_STATIC_STRING("enter idle"),
- GRPC_ERROR_INT_CHANNEL_CONNECTIVITY_STATE, GRPC_CHANNEL_IDLE);
- // Pass the transport op down to the channel stack.
- auto* elem = grpc_channel_stack_element(channel_stack.get(), 0);
- elem->filter->start_transport_op(elem, op);
- });
-}
-
-const grpc_channel_filter grpc_client_idle_filter =
- MakePromiseBasedFilter(
- "client_idle");
-
-} // namespace
-
-void RegisterClientIdleFilter(CoreConfiguration::Builder* builder) {
- builder->channel_init()->RegisterStage(
- GRPC_CLIENT_CHANNEL, GRPC_CHANNEL_INIT_BUILTIN_PRIORITY,
- [](ChannelStackBuilder* builder) {
- const grpc_channel_args* channel_args = builder->channel_args();
- if (!grpc_channel_args_want_minimal_stack(channel_args) &&
- GetClientIdleTimeout(channel_args) != Duration::Infinity()) {
- builder->PrependFilter(&grpc_client_idle_filter, nullptr);
- }
- return true;
- });
-}
-} // namespace grpc_core
diff --git a/src/core/ext/filters/max_age/max_age_filter.cc b/src/core/ext/filters/max_age/max_age_filter.cc
deleted file mode 100644
index 2b70aac5b5a..00000000000
--- a/src/core/ext/filters/max_age/max_age_filter.cc
+++ /dev/null
@@ -1,566 +0,0 @@
-/*
- *
- * Copyright 2017 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.
- *
- */
-
-#include
-
-#include "src/core/ext/filters/max_age/max_age_filter.h"
-
-#include
-#include
-
-#include "src/core/lib/channel/channel_args.h"
-#include "src/core/lib/channel/channel_stack_builder.h"
-#include "src/core/lib/config/core_configuration.h"
-#include "src/core/lib/iomgr/timer.h"
-#include "src/core/lib/transport/http2_errors.h"
-
-/* 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.
- */
-#define DEFAULT_MAX_CONNECTION_AGE_MS INT_MAX
-#define DEFAULT_MAX_CONNECTION_AGE_GRACE_MS INT_MAX
-#define DEFAULT_MAX_CONNECTION_IDLE_MS INT_MAX
-#define MAX_CONNECTION_AGE_JITTER 0.1
-
-#define MAX_CONNECTION_AGE_INTEGER_OPTIONS \
- { DEFAULT_MAX_CONNECTION_AGE_MS, 1, INT_MAX }
-#define MAX_CONNECTION_IDLE_INTEGER_OPTIONS \
- { DEFAULT_MAX_CONNECTION_IDLE_MS, 1, INT_MAX }
-
-/* States for idle_state in channel_data */
-#define MAX_IDLE_STATE_INIT ((gpr_atm)0)
-#define MAX_IDLE_STATE_SEEN_EXIT_IDLE ((gpr_atm)1)
-#define MAX_IDLE_STATE_SEEN_ENTER_IDLE ((gpr_atm)2)
-#define MAX_IDLE_STATE_TIMER_SET ((gpr_atm)3)
-
-namespace {
-struct channel_data {
- /* The channel stack to which we take refs for pending callbacks. */
- grpc_channel_stack* channel_stack;
- /* Guards access to max_age_timer, max_age_timer_pending, max_age_grace_timer
- and max_age_grace_timer_pending */
- grpc_core::Mutex max_age_timer_mu;
- /* True if the max_age timer callback is currently pending */
- bool max_age_timer_pending ABSL_GUARDED_BY(max_age_timer_mu) = false;
- /* True if the max_age_grace timer callback is currently pending */
- bool max_age_grace_timer_pending ABSL_GUARDED_BY(max_age_timer_mu) = false;
- /* The timer for checking if the channel has reached its max age */
- grpc_timer max_age_timer ABSL_GUARDED_BY(max_age_timer_mu);
- /* The timer for checking if the max-aged channel has uesed up the grace
- period */
- grpc_timer max_age_grace_timer ABSL_GUARDED_BY(max_age_timer_mu);
- /* The timer for checking if the channel's idle duration reaches
- max_connection_idle */
- grpc_timer max_idle_timer;
- /* Allowed max time a channel may have no outstanding rpcs */
- grpc_core::Duration max_connection_idle;
- /* Allowed max time a channel may exist */
- grpc_core::Duration max_connection_age;
- /* Allowed grace period after the channel reaches its max age */
- grpc_core::Duration max_connection_age_grace;
- /* Closure to run when the channel's idle duration reaches max_connection_idle
- and should be closed gracefully */
- grpc_closure max_idle_timer_cb;
- /* Closure to run when the channel reaches its max age and should be closed
- gracefully */
- grpc_closure close_max_age_channel;
- /* Closure to run the channel uses up its max age grace time and should be
- closed forcibly */
- grpc_closure force_close_max_age_channel;
- /* Closure to run when the init fo channel stack is done and the max_idle
- timer should be started */
- grpc_closure start_max_idle_timer_after_init;
- /* Closure to run when the init fo channel stack is done and the max_age timer
- should be started */
- grpc_closure start_max_age_timer_after_init;
- /* Closure to run when the goaway op is finished and the max_age_timer */
- grpc_closure start_max_age_grace_timer_after_goaway_op;
- /* Number of active calls */
- gpr_atm call_count;
- /* TODO(zyc): C++lize this state machine */
- /* 'idle_state' holds the states of max_idle_timer and channel idleness.
- It can contain one of the following values:
- +--------------------------------+----------------+---------+
- | idle_state | max_idle_timer | channel |
- +--------------------------------+----------------+---------+
- | MAX_IDLE_STATE_INIT | unset | busy |
- | MAX_IDLE_STATE_TIMER_SET | set, valid | idle |
- | MAX_IDLE_STATE_SEEN_EXIT_IDLE | set, invalid | busy |
- | MAX_IDLE_STATE_SEEN_ENTER_IDLE | set, invalid | idle |
- +--------------------------------+----------------+---------+
-
- MAX_IDLE_STATE_INIT: The initial and final state of 'idle_state'. The
- channel has 1 or 1+ active calls, and the timer is not set. Note that
- we may put a virtual call to hold this state at channel initialization or
- shutdown, so that the channel won't enter other states.
-
- MAX_IDLE_STATE_TIMER_SET: The state after the timer is set and no calls
- have arrived after the timer is set. The channel must have 0 active call in
- this state. If the timer is fired in this state, we will close the channel
- due to idleness.
-
- MAX_IDLE_STATE_SEEN_EXIT_IDLE: The state after the timer is set and at
- least one call has arrived after the timer is set. The channel must have 1
- or 1+ active calls in this state. If the timer is fired in this state, we
- won't reschudle it.
-
- MAX_IDLE_STATE_SEEN_ENTER_IDLE: The state after the timer is set and the at
- least one call has arrived after the timer is set, BUT the channel
- currently has 0 active calls. If the timer is fired in this state, we will
- reschudle it.
-
- max_idle_timer will not be cancelled (unless the channel is shutting down).
- If the timer callback is called when the max_idle_timer is valid (i.e.
- idle_state is MAX_IDLE_STATE_TIMER_SET), the channel will be closed due to
- idleness, otherwise the channel won't be changed.
-
- State transitions:
- MAX_IDLE_STATE_INIT <-------3------ MAX_IDLE_STATE_SEEN_EXIT_IDLE
- ^ | ^ ^ |
- | | | | |
- 1 2 +-----------4------------+ 6 7
- | | | | |
- | v | | v
- MAX_IDLE_STATE_TIMER_SET <----5------ MAX_IDLE_STATE_SEEN_ENTER_IDLE
-
- For 1, 3, 5 : See max_idle_timer_cb() function
- For 2, 7 : See decrease_call_count() function
- For 4, 6 : See increase_call_count() function */
- gpr_atm idle_state;
- /* Time when the channel finished its last outstanding call, in
- * grpc_core::Timestamp */
- gpr_atm last_enter_idle_time_millis;
-};
-} // namespace
-
-/* Increase the nubmer of active calls. Before the increasement, if there are no
- calls, the max_idle_timer should be cancelled. */
-static void increase_call_count(channel_data* chand) {
- /* Exit idle */
- if (gpr_atm_full_fetch_add(&chand->call_count, 1) == 0) {
- while (true) {
- gpr_atm idle_state = gpr_atm_acq_load(&chand->idle_state);
- switch (idle_state) {
- case MAX_IDLE_STATE_TIMER_SET:
- /* max_idle_timer_cb may have already set idle_state to
- MAX_IDLE_STATE_INIT, in this case, we don't need to set it to
- MAX_IDLE_STATE_SEEN_EXIT_IDLE */
- gpr_atm_rel_cas(&chand->idle_state, MAX_IDLE_STATE_TIMER_SET,
- MAX_IDLE_STATE_SEEN_EXIT_IDLE);
- return;
- case MAX_IDLE_STATE_SEEN_ENTER_IDLE:
- gpr_atm_rel_store(&chand->idle_state, MAX_IDLE_STATE_SEEN_EXIT_IDLE);
- return;
- default:
- /* try again */
- break;
- }
- }
- }
-}
-
-/* Decrease the nubmer of active calls. After the decrement, if there are no
- calls, the max_idle_timer should be started. */
-static void decrease_call_count(channel_data* chand) {
- /* Enter idle */
- if (gpr_atm_full_fetch_add(&chand->call_count, -1) == 1) {
- gpr_atm_no_barrier_store(&chand->last_enter_idle_time_millis,
- (gpr_atm)grpc_core::ExecCtx::Get()
- ->Now()
- .milliseconds_after_process_epoch());
- while (true) {
- gpr_atm idle_state = gpr_atm_acq_load(&chand->idle_state);
- switch (idle_state) {
- case MAX_IDLE_STATE_INIT:
- GRPC_CHANNEL_STACK_REF(chand->channel_stack,
- "max_age max_idle_timer");
- grpc_timer_init(
- &chand->max_idle_timer,
- grpc_core::ExecCtx::Get()->Now() + chand->max_connection_idle,
- &chand->max_idle_timer_cb);
- gpr_atm_rel_store(&chand->idle_state, MAX_IDLE_STATE_TIMER_SET);
- return;
- case MAX_IDLE_STATE_SEEN_EXIT_IDLE:
- if (gpr_atm_rel_cas(&chand->idle_state, MAX_IDLE_STATE_SEEN_EXIT_IDLE,
- MAX_IDLE_STATE_SEEN_ENTER_IDLE)) {
- return;
- }
- break;
- default:
- /* try again */
- break;
- }
- }
- }
-}
-
-static void start_max_idle_timer_after_init(void* arg,
- grpc_error_handle /*error*/) {
- channel_data* chand = static_cast(arg);
- /* Decrease call_count. If there are no active calls at this time,
- max_idle_timer will start here. If the number of active calls is not 0,
- max_idle_timer will start after all the active calls end. */
- decrease_call_count(chand);
- GRPC_CHANNEL_STACK_UNREF(chand->channel_stack,
- "max_age start_max_idle_timer_after_init");
-}
-
-namespace grpc_core {
-
-class ConnectivityWatcher : public AsyncConnectivityStateWatcherInterface {
- public:
- explicit ConnectivityWatcher(channel_data* chand) : chand_(chand) {
- GRPC_CHANNEL_STACK_REF(chand_->channel_stack, "max_age conn_watch");
- }
-
- ~ConnectivityWatcher() override {
- GRPC_CHANNEL_STACK_UNREF(chand_->channel_stack, "max_age conn_watch");
- }
-
- private:
- void OnConnectivityStateChange(grpc_connectivity_state new_state,
- const absl::Status& /* status */) override {
- if (new_state != GRPC_CHANNEL_SHUTDOWN) return;
- {
- MutexLock lock(&chand_->max_age_timer_mu);
- if (chand_->max_age_timer_pending) {
- grpc_timer_cancel(&chand_->max_age_timer);
- chand_->max_age_timer_pending = false;
- }
- if (chand_->max_age_grace_timer_pending) {
- grpc_timer_cancel(&chand_->max_age_grace_timer);
- chand_->max_age_grace_timer_pending = false;
- }
- }
- /* If there are no active calls, this increasement will cancel
- max_idle_timer, and prevent max_idle_timer from being started in the
- future. */
- increase_call_count(chand_);
- if (gpr_atm_acq_load(&chand_->idle_state) ==
- MAX_IDLE_STATE_SEEN_EXIT_IDLE) {
- grpc_timer_cancel(&chand_->max_idle_timer);
- }
- }
-
- channel_data* chand_;
-};
-
-} // namespace grpc_core
-
-static void start_max_age_timer_after_init(void* arg,
- grpc_error_handle /*error*/) {
- channel_data* chand = static_cast(arg);
- {
- grpc_core::MutexLock lock(&chand->max_age_timer_mu);
- chand->max_age_timer_pending = true;
- GRPC_CHANNEL_STACK_REF(chand->channel_stack, "max_age max_age_timer");
- grpc_timer_init(
- &chand->max_age_timer,
- grpc_core::ExecCtx::Get()->Now() + chand->max_connection_age,
- &chand->close_max_age_channel);
- }
- grpc_transport_op* op = grpc_make_transport_op(nullptr);
- op->start_connectivity_watch.reset(new grpc_core::ConnectivityWatcher(chand));
- op->start_connectivity_watch_state = GRPC_CHANNEL_IDLE;
- grpc_channel_next_op(grpc_channel_stack_element(chand->channel_stack, 0), op);
- GRPC_CHANNEL_STACK_UNREF(chand->channel_stack,
- "max_age start_max_age_timer_after_init");
-}
-
-static void start_max_age_grace_timer_after_goaway_op(
- void* arg, grpc_error_handle /*error*/) {
- channel_data* chand = static_cast(arg);
- {
- grpc_core::MutexLock lock(&chand->max_age_timer_mu);
- chand->max_age_grace_timer_pending = true;
- GRPC_CHANNEL_STACK_REF(chand->channel_stack, "max_age max_age_grace_timer");
- grpc_timer_init(
- &chand->max_age_grace_timer,
- grpc_core::ExecCtx::Get()->Now() + chand->max_connection_age_grace,
- &chand->force_close_max_age_channel);
- }
- GRPC_CHANNEL_STACK_UNREF(chand->channel_stack,
- "max_age start_max_age_grace_timer_after_goaway_op");
-}
-
-static void close_max_idle_channel(channel_data* chand) {
- /* Prevent the max idle timer from being set again */
- gpr_atm_no_barrier_fetch_add(&chand->call_count, 1);
- grpc_transport_op* op = grpc_make_transport_op(nullptr);
- op->goaway_error =
- grpc_error_set_int(GRPC_ERROR_CREATE_FROM_STATIC_STRING("max_idle"),
- GRPC_ERROR_INT_HTTP2_ERROR, GRPC_HTTP2_NO_ERROR);
- grpc_channel_element* elem =
- grpc_channel_stack_element(chand->channel_stack, 0);
- elem->filter->start_transport_op(elem, op);
-}
-
-static void max_idle_timer_cb(void* arg, grpc_error_handle error) {
- channel_data* chand = static_cast(arg);
- if (error == GRPC_ERROR_NONE) {
- bool try_again = true;
- while (try_again) {
- gpr_atm idle_state = gpr_atm_acq_load(&chand->idle_state);
- switch (idle_state) {
- case MAX_IDLE_STATE_TIMER_SET:
- close_max_idle_channel(chand);
- /* This MAX_IDLE_STATE_INIT is a final state, we don't have to check
- * if idle_state has been changed */
- gpr_atm_rel_store(&chand->idle_state, MAX_IDLE_STATE_INIT);
- try_again = false;
- break;
- case MAX_IDLE_STATE_SEEN_EXIT_IDLE:
- if (gpr_atm_rel_cas(&chand->idle_state, MAX_IDLE_STATE_SEEN_EXIT_IDLE,
- MAX_IDLE_STATE_INIT)) {
- try_again = false;
- }
- break;
- case MAX_IDLE_STATE_SEEN_ENTER_IDLE:
- GRPC_CHANNEL_STACK_REF(chand->channel_stack,
- "max_age max_idle_timer");
- grpc_timer_init(
- &chand->max_idle_timer,
- grpc_core::Timestamp::FromMillisecondsAfterProcessEpoch(
- gpr_atm_no_barrier_load(
- &chand->last_enter_idle_time_millis)) +
- chand->max_connection_idle,
- &chand->max_idle_timer_cb);
- /* idle_state may have already been set to
- MAX_IDLE_STATE_SEEN_EXIT_IDLE by increase_call_count(), in this
- case, we don't need to set it to MAX_IDLE_STATE_TIMER_SET */
- gpr_atm_rel_cas(&chand->idle_state, MAX_IDLE_STATE_SEEN_ENTER_IDLE,
- MAX_IDLE_STATE_TIMER_SET);
- try_again = false;
- break;
- default:
- /* try again */
- break;
- }
- }
- }
- GRPC_CHANNEL_STACK_UNREF(chand->channel_stack, "max_age max_idle_timer");
-}
-
-static void close_max_age_channel(void* arg, grpc_error_handle error) {
- channel_data* chand = static_cast(arg);
- {
- grpc_core::MutexLock lock(&chand->max_age_timer_mu);
- chand->max_age_timer_pending = false;
- }
- if (error == GRPC_ERROR_NONE) {
- GRPC_CHANNEL_STACK_REF(chand->channel_stack,
- "max_age start_max_age_grace_timer_after_goaway_op");
- grpc_transport_op* op = grpc_make_transport_op(
- &chand->start_max_age_grace_timer_after_goaway_op);
- op->goaway_error =
- grpc_error_set_int(GRPC_ERROR_CREATE_FROM_STATIC_STRING("max_age"),
- GRPC_ERROR_INT_HTTP2_ERROR, GRPC_HTTP2_NO_ERROR);
- grpc_channel_element* elem =
- grpc_channel_stack_element(chand->channel_stack, 0);
- elem->filter->start_transport_op(elem, op);
- } else if (error != GRPC_ERROR_CANCELLED) {
- GRPC_LOG_IF_ERROR("close_max_age_channel", error);
- }
- GRPC_CHANNEL_STACK_UNREF(chand->channel_stack, "max_age max_age_timer");
-}
-
-static void force_close_max_age_channel(void* arg, grpc_error_handle error) {
- channel_data* chand = static_cast(arg);
- {
- grpc_core::MutexLock lock(&chand->max_age_timer_mu);
- chand->max_age_grace_timer_pending = false;
- }
- if (error == GRPC_ERROR_NONE) {
- grpc_transport_op* op = grpc_make_transport_op(nullptr);
- op->disconnect_with_error =
- GRPC_ERROR_CREATE_FROM_STATIC_STRING("Channel reaches max age");
- grpc_channel_element* elem =
- grpc_channel_stack_element(chand->channel_stack, 0);
- elem->filter->start_transport_op(elem, op);
- } else if (error != GRPC_ERROR_CANCELLED) {
- GRPC_LOG_IF_ERROR("force_close_max_age_channel", error);
- }
- GRPC_CHANNEL_STACK_UNREF(chand->channel_stack, "max_age max_age_grace_timer");
-}
-
-/* A random jitter of +/-10% will be added to MAX_CONNECTION_AGE to spread out
- connection storms. Note that the MAX_CONNECTION_AGE option without jitter
- would not create connection storms by itself, but if there happened to be a
- connection storm it could cause it to repeat at a fixed period. */
-static grpc_core::Duration
-add_random_max_connection_age_jitter_and_convert_to_duration(int value) {
- /* generate a random number between 1 - MAX_CONNECTION_AGE_JITTER and
- 1 + MAX_CONNECTION_AGE_JITTER */
- double multiplier = rand() * MAX_CONNECTION_AGE_JITTER * 2.0 / RAND_MAX +
- 1.0 - MAX_CONNECTION_AGE_JITTER;
- double result = multiplier * value;
- /* INT_MAX - 0.5 converts the value to float, so that result will not be
- cast to int implicitly before the comparison. */
- return result > (static_cast(
- grpc_core::Duration::Infinity().millis())) -
- 0.5
- ? grpc_core::Duration::Infinity()
- : grpc_core::Duration::Milliseconds(result);
-}
-
-/* Constructor for call_data. */
-static grpc_error_handle max_age_init_call_elem(
- grpc_call_element* elem, const grpc_call_element_args* /*args*/) {
- channel_data* chand = static_cast(elem->channel_data);
- increase_call_count(chand);
- return GRPC_ERROR_NONE;
-}
-
-/* Destructor for call_data. */
-static void max_age_destroy_call_elem(
- grpc_call_element* elem, const grpc_call_final_info* /*final_info*/,
- grpc_closure* /*ignored*/) {
- channel_data* chand = static_cast(elem->channel_data);
- decrease_call_count(chand);
-}
-
-/* Constructor for channel_data. */
-static grpc_error_handle max_age_init_channel_elem(
- grpc_channel_element* elem, grpc_channel_element_args* args) {
- channel_data* chand = static_cast(elem->channel_data);
- new (chand) channel_data();
- chand->channel_stack = args->channel_stack;
- chand->max_connection_age =
- add_random_max_connection_age_jitter_and_convert_to_duration(
- DEFAULT_MAX_CONNECTION_AGE_MS);
- chand->max_connection_age_grace =
- DEFAULT_MAX_CONNECTION_AGE_GRACE_MS == INT_MAX
- ? grpc_core::Duration::Infinity()
- : grpc_core::Duration::Milliseconds(
- DEFAULT_MAX_CONNECTION_AGE_GRACE_MS);
- chand->max_connection_idle =
- DEFAULT_MAX_CONNECTION_IDLE_MS == INT_MAX
- ? grpc_core::Duration::Infinity()
- : grpc_core::Duration::Milliseconds(DEFAULT_MAX_CONNECTION_IDLE_MS);
- chand->idle_state = MAX_IDLE_STATE_INIT;
- gpr_atm_no_barrier_store(&chand->last_enter_idle_time_millis, GPR_ATM_MIN);
- for (size_t i = 0; i < args->channel_args->num_args; ++i) {
- if (0 == strcmp(args->channel_args->args[i].key,
- GRPC_ARG_MAX_CONNECTION_AGE_MS)) {
- const int value = grpc_channel_arg_get_integer(
- &args->channel_args->args[i], MAX_CONNECTION_AGE_INTEGER_OPTIONS);
- chand->max_connection_age =
- add_random_max_connection_age_jitter_and_convert_to_duration(value);
- } else if (0 == strcmp(args->channel_args->args[i].key,
- GRPC_ARG_MAX_CONNECTION_AGE_GRACE_MS)) {
- const int value = grpc_channel_arg_get_integer(
- &args->channel_args->args[i],
- {DEFAULT_MAX_CONNECTION_AGE_GRACE_MS, 0, INT_MAX});
- chand->max_connection_age_grace =
- value == INT_MAX ? grpc_core::Duration::Infinity()
- : grpc_core::Duration::Milliseconds(value);
- } else if (0 == strcmp(args->channel_args->args[i].key,
- GRPC_ARG_MAX_CONNECTION_IDLE_MS)) {
- const int value = grpc_channel_arg_get_integer(
- &args->channel_args->args[i], MAX_CONNECTION_IDLE_INTEGER_OPTIONS);
- chand->max_connection_idle =
- value == INT_MAX ? grpc_core::Duration::Infinity()
- : grpc_core::Duration::Milliseconds(value);
- }
- }
- GRPC_CLOSURE_INIT(&chand->max_idle_timer_cb, max_idle_timer_cb, chand,
- grpc_schedule_on_exec_ctx);
- GRPC_CLOSURE_INIT(&chand->close_max_age_channel, close_max_age_channel, chand,
- grpc_schedule_on_exec_ctx);
- GRPC_CLOSURE_INIT(&chand->force_close_max_age_channel,
- force_close_max_age_channel, chand,
- grpc_schedule_on_exec_ctx);
- GRPC_CLOSURE_INIT(&chand->start_max_idle_timer_after_init,
- start_max_idle_timer_after_init, chand,
- grpc_schedule_on_exec_ctx);
- GRPC_CLOSURE_INIT(&chand->start_max_age_timer_after_init,
- start_max_age_timer_after_init, chand,
- grpc_schedule_on_exec_ctx);
- GRPC_CLOSURE_INIT(&chand->start_max_age_grace_timer_after_goaway_op,
- start_max_age_grace_timer_after_goaway_op, chand,
- grpc_schedule_on_exec_ctx);
-
- if (chand->max_connection_age != grpc_core::Duration::Infinity()) {
- /* When the channel reaches its max age, we send down an op with
- goaway_error set. However, we can't send down any ops until after the
- channel stack is fully initialized. If we start the timer here, we have
- no guarantee that the timer won't pop before channel stack initialization
- is finished. To avoid that problem, we create a closure to start the
- timer, and we schedule that closure to be run after call stack
- initialization is done. */
- GRPC_CHANNEL_STACK_REF(chand->channel_stack,
- "max_age start_max_age_timer_after_init");
- grpc_core::ExecCtx::Run(DEBUG_LOCATION,
- &chand->start_max_age_timer_after_init,
- GRPC_ERROR_NONE);
- }
-
- /* Initialize the number of calls as 1, so that the max_idle_timer will not
- start until start_max_idle_timer_after_init is invoked. */
- gpr_atm_rel_store(&chand->call_count, 1);
- if (chand->max_connection_idle != grpc_core::Duration::Infinity()) {
- GRPC_CHANNEL_STACK_REF(chand->channel_stack,
- "max_age start_max_idle_timer_after_init");
- grpc_core::ExecCtx::Run(DEBUG_LOCATION,
- &chand->start_max_idle_timer_after_init,
- GRPC_ERROR_NONE);
- }
- return GRPC_ERROR_NONE;
-}
-
-/* Destructor for channel_data. */
-static void max_age_destroy_channel_elem(grpc_channel_element* elem) {
- channel_data* chand = static_cast(elem->channel_data);
- chand->~channel_data();
-}
-
-const grpc_channel_filter grpc_max_age_filter = {
- grpc_call_next_op,
- nullptr,
- grpc_channel_next_op,
- 0, /* sizeof_call_data */
- max_age_init_call_elem,
- grpc_call_stack_ignore_set_pollset_or_pollset_set,
- max_age_destroy_call_elem,
- sizeof(channel_data),
- max_age_init_channel_elem,
- max_age_destroy_channel_elem,
- grpc_channel_next_get_info,
- "max_age"};
-
-namespace grpc_core {
-void RegisterMaxAgeFilter(CoreConfiguration::Builder* builder) {
- builder->channel_init()->RegisterStage(
- GRPC_SERVER_CHANNEL, GRPC_CHANNEL_INIT_BUILTIN_PRIORITY,
- [](ChannelStackBuilder* builder) {
- const grpc_channel_args* channel_args = builder->channel_args();
- bool enable = grpc_channel_arg_get_integer(
- grpc_channel_args_find(
- channel_args, GRPC_ARG_MAX_CONNECTION_AGE_MS),
- MAX_CONNECTION_AGE_INTEGER_OPTIONS) != INT_MAX ||
- grpc_channel_arg_get_integer(
- grpc_channel_args_find(
- channel_args, GRPC_ARG_MAX_CONNECTION_IDLE_MS),
- MAX_CONNECTION_IDLE_INTEGER_OPTIONS) != INT_MAX;
- if (enable) {
- builder->PrependFilter(&grpc_max_age_filter, nullptr);
- }
- return true;
- });
-}
-} // namespace grpc_core
diff --git a/src/core/ext/filters/max_age/max_age_filter.h b/src/core/ext/filters/max_age/max_age_filter.h
deleted file mode 100644
index 989322244f7..00000000000
--- a/src/core/ext/filters/max_age/max_age_filter.h
+++ /dev/null
@@ -1,26 +0,0 @@
-//
-// Copyright 2017 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_CORE_EXT_FILTERS_MAX_AGE_MAX_AGE_FILTER_H
-#define GRPC_CORE_EXT_FILTERS_MAX_AGE_MAX_AGE_FILTER_H
-
-#include
-
-#include "src/core/lib/channel/channel_stack.h"
-
-extern const grpc_channel_filter grpc_max_age_filter;
-
-#endif /* GRPC_CORE_EXT_FILTERS_MAX_AGE_MAX_AGE_FILTER_H */
diff --git a/src/core/lib/gprpp/single_set_ptr.h b/src/core/lib/gprpp/single_set_ptr.h
index 8a53a428af8..1b26d099b56 100644
--- a/src/core/lib/gprpp/single_set_ptr.h
+++ b/src/core/lib/gprpp/single_set_ptr.h
@@ -28,14 +28,16 @@ template >
class SingleSetPtr {
public:
SingleSetPtr() = default;
+ explicit SingleSetPtr(T* p) : p_{p} {}
+ explicit SingleSetPtr(std::unique_ptr p) : p_{p.release()} {}
~SingleSetPtr() { Delete(p_.load(std::memory_order_relaxed)); }
SingleSetPtr(const SingleSetPtr&) = delete;
SingleSetPtr& operator=(const SingleSetPtr&) = delete;
SingleSetPtr(SingleSetPtr&& other) noexcept
- : p_(other.p_.exchange(sentinel())) {}
+ : p_(other.p_.exchange(nullptr)) {}
SingleSetPtr& operator=(SingleSetPtr&& other) noexcept {
- Set(other.p_.exchange(sentinel(), std::memory_order_acq_rel));
+ Set(other.p_.exchange(nullptr, std::memory_order_acq_rel));
return *this;
}
@@ -47,22 +49,25 @@ class SingleSetPtr {
if (!p_.compare_exchange_strong(expected, ptr, std::memory_order_acq_rel,
std::memory_order_acquire)) {
Delete(ptr);
- return expected == sentinel() ? nullptr : expected;
+ return expected;
}
return ptr;
}
- // Clear the pointer. Cannot be set again.
- void Reset() { Delete(p_.exchange(sentinel(), std::memory_order_acq_rel)); }
+ // Set the pointer from a compatible unique_ptr - with the same caveats as
+ // above.
+ T* Set(std::unique_ptr ptr) { return Set(ptr.release()); }
+
+ // Clear the pointer.
+ void Reset() { Delete(p_.exchange(nullptr, std::memory_order_acq_rel)); }
bool is_set() const {
T* p = p_.load(std::memory_order_acquire);
- return p != nullptr && p != sentinel();
+ return p != nullptr;
}
T* operator->() const {
T* p = p_.load(std::memory_order_acquire);
- GPR_DEBUG_ASSERT(p != sentinel());
GPR_DEBUG_ASSERT(p != nullptr);
return p;
}
@@ -70,9 +75,8 @@ class SingleSetPtr {
T& operator*() const { return *operator->(); }
private:
- static T* sentinel() { return reinterpret_cast(1); }
static void Delete(T* p) {
- if (p == sentinel() || p == nullptr) return;
+ if (p == nullptr) return;
Deleter()(p);
}
std::atomic p_{nullptr};
diff --git a/src/core/plugin_registry/grpc_plugin_registry.cc b/src/core/plugin_registry/grpc_plugin_registry.cc
index aafcd98362e..95026cd673e 100644
--- a/src/core/plugin_registry/grpc_plugin_registry.cc
+++ b/src/core/plugin_registry/grpc_plugin_registry.cc
@@ -80,12 +80,11 @@ extern void BuildClientChannelConfiguration(
extern void SecurityRegisterHandshakerFactories(
CoreConfiguration::Builder* builder);
extern void RegisterClientAuthorityFilter(CoreConfiguration::Builder* builder);
-extern void RegisterClientIdleFilter(CoreConfiguration::Builder* builder);
+extern void RegisterChannelIdleFilters(CoreConfiguration::Builder* builder);
extern void RegisterDeadlineFilter(CoreConfiguration::Builder* builder);
extern void RegisterGrpcLbLoadReportingFilter(
CoreConfiguration::Builder* builder);
extern void RegisterHttpFilters(CoreConfiguration::Builder* builder);
-extern void RegisterMaxAgeFilter(CoreConfiguration::Builder* builder);
extern void RegisterMessageSizeFilter(CoreConfiguration::Builder* builder);
extern void RegisterSecurityFilters(CoreConfiguration::Builder* builder);
extern void RegisterServiceConfigChannelArgFilter(
@@ -105,10 +104,9 @@ void BuildCoreConfiguration(CoreConfiguration::Builder* builder) {
BuildClientChannelConfiguration(builder);
SecurityRegisterHandshakerFactories(builder);
RegisterClientAuthorityFilter(builder);
- RegisterClientIdleFilter(builder);
+ RegisterChannelIdleFilters(builder);
RegisterGrpcLbLoadReportingFilter(builder);
RegisterHttpFilters(builder);
- RegisterMaxAgeFilter(builder);
RegisterDeadlineFilter(builder);
RegisterMessageSizeFilter(builder);
RegisterServiceConfigChannelArgFilter(builder);
diff --git a/src/python/grpcio/grpc_core_dependencies.py b/src/python/grpcio/grpc_core_dependencies.py
index f1d0e689883..09dffdf730c 100644
--- a/src/python/grpcio/grpc_core_dependencies.py
+++ b/src/python/grpcio/grpc_core_dependencies.py
@@ -16,6 +16,8 @@
CORE_SOURCE_FILES = [
'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/client_channel/backend_metric.cc',
'src/core/ext/filters/client_channel/backup_poller.cc',
'src/core/ext/filters/client_channel/channel_connectivity.cc',
@@ -74,8 +76,6 @@ CORE_SOURCE_FILES = [
'src/core/ext/filters/client_channel/subchannel.cc',
'src/core/ext/filters/client_channel/subchannel_pool_interface.cc',
'src/core/ext/filters/client_channel/subchannel_stream_client.cc',
- 'src/core/ext/filters/client_idle/client_idle_filter.cc',
- 'src/core/ext/filters/client_idle/idle_filter_state.cc',
'src/core/ext/filters/deadline/deadline_filter.cc',
'src/core/ext/filters/fault_injection/fault_injection_filter.cc',
'src/core/ext/filters/fault_injection/service_config_parser.cc',
@@ -85,7 +85,6 @@ CORE_SOURCE_FILES = [
'src/core/ext/filters/http/message_compress/message_compress_filter.cc',
'src/core/ext/filters/http/message_compress/message_decompress_filter.cc',
'src/core/ext/filters/http/server/http_server_filter.cc',
- 'src/core/ext/filters/max_age/max_age_filter.cc',
'src/core/ext/filters/message_size/message_size_filter.cc',
'src/core/ext/filters/rbac/rbac_filter.cc',
'src/core/ext/filters/rbac/rbac_service_config_parser.cc',
diff --git a/test/core/client_idle/idle_filter_state_test.cc b/test/core/client_idle/idle_filter_state_test.cc
index 2911b683d74..823bb31b8a9 100644
--- a/test/core/client_idle/idle_filter_state_test.cc
+++ b/test/core/client_idle/idle_filter_state_test.cc
@@ -12,7 +12,7 @@
// See the License for the specific language governing permissions and
// limitations under the License.
-#include "src/core/ext/filters/client_idle/idle_filter_state.h"
+#include "src/core/ext/filters/channel_idle/idle_filter_state.h"
#include
diff --git a/tools/doxygen/Doxyfile.c++.internal b/tools/doxygen/Doxyfile.c++.internal
index a5e2f88fc1d..dfbbec8bc6b 100644
--- a/tools/doxygen/Doxyfile.c++.internal
+++ b/tools/doxygen/Doxyfile.c++.internal
@@ -1053,6 +1053,9 @@ include/grpcpp/support/time.h \
include/grpcpp/support/validate_service_config.h \
include/grpcpp/xds_server_builder.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/idle_filter_state.cc \
+src/core/ext/filters/channel_idle/idle_filter_state.h \
src/core/ext/filters/client_channel/backend_metric.cc \
src/core/ext/filters/client_channel/backend_metric.h \
src/core/ext/filters/client_channel/backup_poller.cc \
@@ -1154,9 +1157,6 @@ src/core/ext/filters/client_channel/subchannel_pool_interface.cc \
src/core/ext/filters/client_channel/subchannel_pool_interface.h \
src/core/ext/filters/client_channel/subchannel_stream_client.cc \
src/core/ext/filters/client_channel/subchannel_stream_client.h \
-src/core/ext/filters/client_idle/client_idle_filter.cc \
-src/core/ext/filters/client_idle/idle_filter_state.cc \
-src/core/ext/filters/client_idle/idle_filter_state.h \
src/core/ext/filters/deadline/deadline_filter.cc \
src/core/ext/filters/deadline/deadline_filter.h \
src/core/ext/filters/fault_injection/fault_injection_filter.cc \
@@ -1174,8 +1174,6 @@ src/core/ext/filters/http/message_compress/message_decompress_filter.cc \
src/core/ext/filters/http/message_compress/message_decompress_filter.h \
src/core/ext/filters/http/server/http_server_filter.cc \
src/core/ext/filters/http/server/http_server_filter.h \
-src/core/ext/filters/max_age/max_age_filter.cc \
-src/core/ext/filters/max_age/max_age_filter.h \
src/core/ext/filters/message_size/message_size_filter.cc \
src/core/ext/filters/message_size/message_size_filter.h \
src/core/ext/filters/rbac/rbac_filter.cc \
@@ -2000,6 +1998,7 @@ src/core/lib/gprpp/orphanable.h \
src/core/lib/gprpp/overload.h \
src/core/lib/gprpp/ref_counted.h \
src/core/lib/gprpp/ref_counted_ptr.h \
+src/core/lib/gprpp/single_set_ptr.h \
src/core/lib/gprpp/stat.h \
src/core/lib/gprpp/stat_posix.cc \
src/core/lib/gprpp/stat_windows.cc \
diff --git a/tools/doxygen/Doxyfile.core.internal b/tools/doxygen/Doxyfile.core.internal
index 4303727d5fe..a613979aaa1 100644
--- a/tools/doxygen/Doxyfile.core.internal
+++ b/tools/doxygen/Doxyfile.core.internal
@@ -872,6 +872,9 @@ include/grpc/support/workaround_list.h \
src/core/README.md \
src/core/ext/README.md \
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/idle_filter_state.h \
src/core/ext/filters/client_channel/README.md \
src/core/ext/filters/client_channel/backend_metric.cc \
src/core/ext/filters/client_channel/backend_metric.h \
@@ -978,9 +981,6 @@ src/core/ext/filters/client_channel/subchannel_pool_interface.cc \
src/core/ext/filters/client_channel/subchannel_pool_interface.h \
src/core/ext/filters/client_channel/subchannel_stream_client.cc \
src/core/ext/filters/client_channel/subchannel_stream_client.h \
-src/core/ext/filters/client_idle/client_idle_filter.cc \
-src/core/ext/filters/client_idle/idle_filter_state.cc \
-src/core/ext/filters/client_idle/idle_filter_state.h \
src/core/ext/filters/deadline/deadline_filter.cc \
src/core/ext/filters/deadline/deadline_filter.h \
src/core/ext/filters/fault_injection/fault_injection_filter.cc \
@@ -998,8 +998,6 @@ src/core/ext/filters/http/message_compress/message_decompress_filter.cc \
src/core/ext/filters/http/message_compress/message_decompress_filter.h \
src/core/ext/filters/http/server/http_server_filter.cc \
src/core/ext/filters/http/server/http_server_filter.h \
-src/core/ext/filters/max_age/max_age_filter.cc \
-src/core/ext/filters/max_age/max_age_filter.h \
src/core/ext/filters/message_size/message_size_filter.cc \
src/core/ext/filters/message_size/message_size_filter.h \
src/core/ext/filters/rbac/rbac_filter.cc \
@@ -1794,6 +1792,7 @@ src/core/lib/gprpp/orphanable.h \
src/core/lib/gprpp/overload.h \
src/core/lib/gprpp/ref_counted.h \
src/core/lib/gprpp/ref_counted_ptr.h \
+src/core/lib/gprpp/single_set_ptr.h \
src/core/lib/gprpp/stat.h \
src/core/lib/gprpp/stat_posix.cc \
src/core/lib/gprpp/stat_windows.cc \