grpc 1.60.2 → 1.61.0.pre2

Sign up to get free protection for your applications and to get access to all the features.
Files changed (279) hide show
  1. checksums.yaml +4 -4
  2. data/Makefile +208 -165
  3. data/include/grpc/event_engine/event_engine.h +59 -12
  4. data/include/grpc/event_engine/internal/memory_allocator_impl.h +6 -0
  5. data/include/grpc/event_engine/internal/slice_cast.h +12 -0
  6. data/include/grpc/event_engine/memory_allocator.h +3 -1
  7. data/include/grpc/event_engine/slice.h +5 -0
  8. data/include/grpc/grpc_security.h +22 -1
  9. data/include/grpc/impl/call.h +29 -0
  10. data/include/grpc/impl/channel_arg_names.h +12 -1
  11. data/include/grpc/impl/slice_type.h +1 -1
  12. data/include/grpc/module.modulemap +1 -0
  13. data/src/core/ext/filters/backend_metrics/backend_metric_filter.cc +54 -7
  14. data/src/core/ext/filters/backend_metrics/backend_metric_filter.h +20 -6
  15. data/src/core/ext/filters/channel_idle/channel_idle_filter.cc +10 -13
  16. data/src/core/ext/filters/channel_idle/channel_idle_filter.h +18 -10
  17. data/src/core/ext/filters/channel_idle/legacy_channel_idle_filter.cc +326 -0
  18. data/src/core/ext/filters/channel_idle/legacy_channel_idle_filter.h +143 -0
  19. data/src/core/ext/filters/client_channel/backend_metric.cc +2 -2
  20. data/src/core/ext/filters/client_channel/client_channel.cc +32 -6
  21. data/src/core/ext/filters/client_channel/client_channel_internal.h +2 -0
  22. data/src/core/ext/filters/client_channel/global_subchannel_pool.cc +1 -1
  23. data/src/core/ext/filters/client_channel/lb_policy/address_filtering.cc +54 -21
  24. data/src/core/ext/filters/client_channel/lb_policy/address_filtering.h +3 -2
  25. data/src/core/ext/filters/client_channel/lb_policy/child_policy_handler.cc +2 -1
  26. data/src/core/ext/filters/client_channel/lb_policy/endpoint_list.cc +12 -15
  27. data/src/core/ext/filters/client_channel/lb_policy/endpoint_list.h +8 -5
  28. data/src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb.cc +139 -92
  29. data/src/core/ext/filters/client_channel/lb_policy/health_check_client.cc +9 -4
  30. data/src/core/ext/filters/client_channel/lb_policy/oob_backend_metric.cc +9 -4
  31. data/src/core/ext/filters/client_channel/lb_policy/outlier_detection/outlier_detection.cc +10 -11
  32. data/src/core/ext/filters/client_channel/lb_policy/pick_first/pick_first.cc +94 -93
  33. data/src/core/ext/filters/client_channel/lb_policy/priority/priority.cc +5 -3
  34. data/src/core/ext/filters/client_channel/lb_policy/ring_hash/ring_hash.cc +12 -15
  35. data/src/core/ext/filters/client_channel/lb_policy/rls/rls.cc +38 -16
  36. data/src/core/ext/filters/client_channel/lb_policy/round_robin/round_robin.cc +25 -28
  37. data/src/core/ext/filters/client_channel/lb_policy/subchannel_list.h +10 -10
  38. data/src/core/ext/filters/client_channel/lb_policy/weighted_round_robin/weighted_round_robin.cc +37 -35
  39. data/src/core/ext/filters/client_channel/lb_policy/weighted_target/weighted_target.cc +11 -9
  40. data/src/core/ext/filters/client_channel/lb_policy/xds/cds.cc +504 -461
  41. data/src/core/ext/filters/client_channel/lb_policy/xds/xds_cluster_impl.cc +232 -122
  42. data/src/core/ext/filters/client_channel/lb_policy/xds/xds_cluster_manager.cc +8 -6
  43. data/src/core/ext/filters/client_channel/lb_policy/xds/xds_override_host.cc +642 -251
  44. data/src/core/ext/filters/client_channel/lb_policy/xds/xds_override_host.h +2 -6
  45. data/src/core/ext/filters/client_channel/lb_policy/xds/xds_wrr_locality.cc +7 -8
  46. data/src/core/ext/filters/client_channel/resolver/dns/c_ares/dns_resolver_ares.cc +2 -1
  47. data/src/core/ext/filters/client_channel/resolver/dns/event_engine/event_engine_client_channel_resolver.cc +3 -1
  48. data/src/core/ext/filters/client_channel/resolver/fake/fake_resolver.cc +2 -2
  49. data/src/core/ext/filters/client_channel/resolver/google_c2p/google_c2p_resolver.cc +2 -2
  50. data/src/core/ext/filters/client_channel/resolver/polling_resolver.cc +6 -8
  51. data/src/core/ext/filters/client_channel/resolver/xds/xds_dependency_manager.cc +1031 -0
  52. data/src/core/ext/filters/client_channel/resolver/xds/xds_dependency_manager.h +277 -0
  53. data/src/core/ext/filters/client_channel/resolver/xds/xds_resolver.cc +128 -270
  54. data/src/core/ext/filters/client_channel/resolver/xds/{xds_resolver.h → xds_resolver_attributes.h} +5 -4
  55. data/src/core/ext/filters/client_channel/resolver/xds/xds_resolver_trace.cc +25 -0
  56. data/src/core/ext/filters/client_channel/resolver/xds/xds_resolver_trace.h +30 -0
  57. data/src/core/ext/filters/client_channel/retry_filter.cc +1 -0
  58. data/src/core/ext/filters/client_channel/service_config_channel_arg_filter.cc +35 -17
  59. data/src/core/ext/filters/deadline/deadline_filter.cc +12 -0
  60. data/src/core/ext/filters/fault_injection/fault_injection_filter.cc +17 -13
  61. data/src/core/ext/filters/fault_injection/fault_injection_filter.h +13 -4
  62. data/src/core/ext/filters/http/client/http_client_filter.cc +23 -32
  63. data/src/core/ext/filters/http/client/http_client_filter.h +10 -5
  64. data/src/core/ext/filters/http/client_authority_filter.cc +14 -14
  65. data/src/core/ext/filters/http/client_authority_filter.h +12 -4
  66. data/src/core/ext/filters/http/http_filters_plugin.cc +42 -20
  67. data/src/core/ext/filters/http/message_compress/compression_filter.cc +55 -80
  68. data/src/core/ext/filters/http/message_compress/compression_filter.h +54 -12
  69. data/src/core/ext/filters/http/message_compress/legacy_compression_filter.cc +325 -0
  70. data/src/core/ext/filters/http/message_compress/legacy_compression_filter.h +139 -0
  71. data/src/core/ext/filters/http/server/http_server_filter.cc +41 -41
  72. data/src/core/ext/filters/http/server/http_server_filter.h +11 -4
  73. data/src/core/ext/filters/message_size/message_size_filter.cc +56 -76
  74. data/src/core/ext/filters/message_size/message_size_filter.h +35 -23
  75. data/src/core/ext/filters/rbac/rbac_filter.cc +15 -11
  76. data/src/core/ext/filters/rbac/rbac_filter.h +11 -4
  77. data/src/core/ext/filters/server_config_selector/server_config_selector_filter.cc +25 -13
  78. data/src/core/ext/filters/stateful_session/stateful_session_filter.cc +47 -50
  79. data/src/core/ext/filters/stateful_session/stateful_session_filter.h +21 -4
  80. data/src/core/ext/transport/chttp2/alpn/alpn.cc +1 -1
  81. data/src/core/ext/transport/chttp2/client/chttp2_connector.cc +2 -2
  82. data/src/core/ext/transport/chttp2/server/chttp2_server.cc +11 -2
  83. data/src/core/ext/transport/chttp2/transport/chttp2_transport.cc +68 -145
  84. data/src/core/ext/transport/chttp2/transport/chttp2_transport.h +3 -3
  85. data/src/core/ext/transport/chttp2/transport/flow_control.cc +21 -82
  86. data/src/core/ext/transport/chttp2/transport/flow_control.h +1 -8
  87. data/src/core/ext/transport/chttp2/transport/frame.cc +506 -0
  88. data/src/core/ext/transport/chttp2/transport/frame.h +214 -0
  89. data/src/core/ext/transport/chttp2/transport/frame_rst_stream.cc +1 -1
  90. data/src/core/ext/transport/chttp2/transport/frame_settings.cc +33 -79
  91. data/src/core/ext/transport/chttp2/transport/frame_settings.h +4 -7
  92. data/src/core/ext/transport/chttp2/transport/hpack_parser.cc +27 -36
  93. data/src/core/ext/transport/chttp2/transport/hpack_parser.h +0 -2
  94. data/src/core/ext/transport/chttp2/transport/http2_settings.cc +122 -32
  95. data/src/core/ext/transport/chttp2/transport/http2_settings.h +142 -37
  96. data/src/core/ext/transport/chttp2/transport/internal.h +1 -22
  97. data/src/core/ext/transport/chttp2/transport/parsing.cc +23 -37
  98. data/src/core/ext/transport/chttp2/transport/writing.cc +26 -58
  99. data/src/core/ext/transport/inproc/inproc_transport.cc +172 -13
  100. data/src/core/ext/upb-gen/envoy/extensions/upstreams/http/v3/http_protocol_options.upb.h +712 -0
  101. data/src/core/ext/upb-gen/envoy/extensions/upstreams/http/v3/http_protocol_options.upb_minitable.c +151 -0
  102. data/src/core/ext/upb-gen/envoy/extensions/upstreams/http/v3/http_protocol_options.upb_minitable.h +33 -0
  103. data/src/core/ext/upbdefs-gen/envoy/extensions/upstreams/http/v3/http_protocol_options.upbdefs.c +133 -0
  104. data/src/core/ext/upbdefs-gen/envoy/extensions/upstreams/http/v3/http_protocol_options.upbdefs.h +50 -0
  105. data/src/core/ext/xds/certificate_provider_store.cc +2 -1
  106. data/src/core/ext/xds/certificate_provider_store.h +0 -5
  107. data/src/core/ext/xds/xds_api.cc +31 -18
  108. data/src/core/ext/xds/xds_api.h +2 -2
  109. data/src/core/ext/xds/xds_bootstrap.h +3 -0
  110. data/src/core/ext/xds/xds_certificate_provider.cc +88 -287
  111. data/src/core/ext/xds/xds_certificate_provider.h +44 -111
  112. data/src/core/ext/xds/xds_client.cc +420 -414
  113. data/src/core/ext/xds/xds_client.h +31 -22
  114. data/src/core/ext/xds/xds_client_grpc.cc +3 -1
  115. data/src/core/ext/xds/xds_cluster.cc +104 -11
  116. data/src/core/ext/xds/xds_cluster.h +9 -1
  117. data/src/core/ext/xds/xds_cluster_specifier_plugin.cc +9 -5
  118. data/src/core/ext/xds/xds_common_types.cc +14 -10
  119. data/src/core/ext/xds/xds_endpoint.cc +9 -4
  120. data/src/core/ext/xds/xds_endpoint.h +5 -1
  121. data/src/core/ext/xds/xds_health_status.cc +12 -2
  122. data/src/core/ext/xds/xds_health_status.h +4 -2
  123. data/src/core/ext/xds/xds_http_rbac_filter.cc +5 -3
  124. data/src/core/ext/xds/xds_listener.cc +14 -8
  125. data/src/core/ext/xds/xds_resource_type_impl.h +6 -4
  126. data/src/core/ext/xds/xds_route_config.cc +34 -22
  127. data/src/core/ext/xds/xds_route_config.h +1 -0
  128. data/src/core/ext/xds/xds_server_config_fetcher.cc +61 -57
  129. data/src/core/ext/xds/xds_transport.h +3 -0
  130. data/src/core/ext/xds/xds_transport_grpc.cc +47 -50
  131. data/src/core/ext/xds/xds_transport_grpc.h +4 -0
  132. data/src/core/lib/channel/call_tracer.cc +12 -0
  133. data/src/core/lib/channel/call_tracer.h +17 -3
  134. data/src/core/lib/channel/channel_args.cc +24 -14
  135. data/src/core/lib/channel/channel_args.h +74 -13
  136. data/src/core/lib/channel/channel_stack.cc +27 -0
  137. data/src/core/lib/channel/channel_stack.h +10 -10
  138. data/src/core/lib/channel/connected_channel.cc +64 -18
  139. data/src/core/lib/channel/promise_based_filter.h +1041 -1
  140. data/src/core/lib/channel/server_call_tracer_filter.cc +43 -35
  141. data/src/core/lib/compression/compression_internal.cc +0 -3
  142. data/src/core/lib/event_engine/ares_resolver.cc +35 -14
  143. data/src/core/lib/event_engine/ares_resolver.h +9 -10
  144. data/src/core/lib/event_engine/cf_engine/dns_service_resolver.cc +8 -1
  145. data/src/core/lib/event_engine/posix_engine/native_posix_dns_resolver.cc +132 -0
  146. data/src/core/lib/event_engine/posix_engine/native_posix_dns_resolver.h +61 -0
  147. data/src/core/lib/event_engine/posix_engine/posix_engine.cc +52 -36
  148. data/src/core/lib/event_engine/posix_engine/posix_engine.h +4 -9
  149. data/src/core/lib/event_engine/posix_engine/posix_engine_listener_utils.cc +11 -3
  150. data/src/core/lib/event_engine/posix_engine/tcp_socket_utils.cc +9 -2
  151. data/src/core/lib/event_engine/posix_engine/tcp_socket_utils.h +7 -0
  152. data/src/core/lib/event_engine/posix_engine/timer_manager.cc +17 -27
  153. data/src/core/lib/event_engine/posix_engine/timer_manager.h +0 -3
  154. data/src/core/lib/event_engine/ref_counted_dns_resolver_interface.h +55 -0
  155. data/src/core/lib/event_engine/windows/native_windows_dns_resolver.cc +114 -0
  156. data/src/core/lib/event_engine/windows/native_windows_dns_resolver.h +51 -0
  157. data/src/core/lib/event_engine/windows/windows_engine.cc +7 -7
  158. data/src/core/lib/experiments/config.cc +13 -0
  159. data/src/core/lib/experiments/config.h +3 -0
  160. data/src/core/lib/experiments/experiments.cc +245 -366
  161. data/src/core/lib/experiments/experiments.h +50 -156
  162. data/src/core/lib/gprpp/debug_location.h +13 -0
  163. data/src/core/lib/gprpp/dual_ref_counted.h +36 -7
  164. data/src/core/lib/gprpp/orphanable.h +27 -0
  165. data/src/core/lib/gprpp/ref_counted.h +63 -22
  166. data/src/core/lib/gprpp/ref_counted_ptr.h +70 -27
  167. data/src/core/lib/gprpp/ref_counted_string.h +13 -0
  168. data/src/core/lib/gprpp/status_helper.cc +1 -2
  169. data/src/core/lib/iomgr/combiner.cc +15 -51
  170. data/src/core/lib/iomgr/event_engine_shims/endpoint.cc +31 -0
  171. data/src/core/lib/iomgr/event_engine_shims/endpoint.h +16 -0
  172. data/src/core/lib/iomgr/tcp_client_posix.cc +4 -3
  173. data/src/core/lib/load_balancing/lb_policy.h +1 -1
  174. data/src/core/lib/promise/activity.cc +17 -2
  175. data/src/core/lib/promise/activity.h +5 -4
  176. data/src/core/lib/promise/all_ok.h +80 -0
  177. data/src/core/lib/promise/detail/join_state.h +2077 -0
  178. data/src/core/lib/promise/detail/promise_factory.h +1 -0
  179. data/src/core/lib/promise/detail/promise_like.h +8 -1
  180. data/src/core/lib/promise/detail/seq_state.h +3458 -150
  181. data/src/core/lib/promise/detail/status.h +42 -5
  182. data/src/core/lib/promise/for_each.h +13 -1
  183. data/src/core/lib/promise/if.h +4 -0
  184. data/src/core/lib/promise/latch.h +6 -3
  185. data/src/core/lib/promise/party.cc +33 -31
  186. data/src/core/lib/promise/party.h +142 -6
  187. data/src/core/lib/promise/poll.h +39 -13
  188. data/src/core/lib/promise/promise.h +4 -0
  189. data/src/core/lib/promise/seq.h +107 -7
  190. data/src/core/lib/promise/status_flag.h +196 -0
  191. data/src/core/lib/promise/try_join.h +132 -0
  192. data/src/core/lib/promise/try_seq.h +132 -10
  193. data/src/core/lib/resolver/endpoint_addresses.cc +0 -1
  194. data/src/core/lib/resolver/endpoint_addresses.h +48 -0
  195. data/src/core/lib/resource_quota/arena.h +2 -2
  196. data/src/core/lib/resource_quota/memory_quota.cc +57 -8
  197. data/src/core/lib/resource_quota/memory_quota.h +6 -0
  198. data/src/core/lib/security/authorization/grpc_server_authz_filter.cc +14 -11
  199. data/src/core/lib/security/authorization/grpc_server_authz_filter.h +14 -5
  200. data/src/core/lib/security/credentials/external/aws_external_account_credentials.cc +4 -0
  201. data/src/core/lib/security/credentials/external/aws_external_account_credentials.h +4 -0
  202. data/src/core/lib/security/credentials/external/external_account_credentials.cc +28 -20
  203. data/src/core/lib/security/credentials/external/external_account_credentials.h +4 -0
  204. data/src/core/lib/security/credentials/external/file_external_account_credentials.cc +4 -0
  205. data/src/core/lib/security/credentials/external/file_external_account_credentials.h +4 -0
  206. data/src/core/lib/security/credentials/external/url_external_account_credentials.cc +4 -0
  207. data/src/core/lib/security/credentials/external/url_external_account_credentials.h +4 -0
  208. data/src/core/lib/security/credentials/plugin/plugin_credentials.cc +2 -1
  209. data/src/core/lib/security/credentials/tls/grpc_tls_certificate_provider.h +0 -3
  210. data/src/core/lib/security/credentials/tls/grpc_tls_credentials_options.cc +12 -0
  211. data/src/core/lib/security/credentials/tls/grpc_tls_crl_provider.cc +22 -5
  212. data/src/core/lib/security/credentials/tls/grpc_tls_crl_provider.h +1 -5
  213. data/src/core/lib/security/credentials/tls/tls_credentials.cc +16 -0
  214. data/src/core/lib/security/credentials/xds/xds_credentials.cc +21 -28
  215. data/src/core/lib/security/credentials/xds/xds_credentials.h +2 -4
  216. data/src/core/lib/security/security_connector/tls/tls_security_connector.cc +4 -3
  217. data/src/core/lib/security/transport/auth_filters.h +71 -4
  218. data/src/core/lib/security/transport/client_auth_filter.cc +2 -4
  219. data/src/core/lib/security/transport/legacy_server_auth_filter.cc +244 -0
  220. data/src/core/lib/security/transport/server_auth_filter.cc +70 -90
  221. data/src/core/lib/slice/slice_buffer.h +3 -0
  222. data/src/core/lib/surface/builtins.cc +1 -1
  223. data/src/core/lib/surface/call.cc +683 -196
  224. data/src/core/lib/surface/call.h +26 -13
  225. data/src/core/lib/surface/call_trace.cc +42 -1
  226. data/src/core/lib/surface/channel.cc +0 -1
  227. data/src/core/lib/surface/channel.h +0 -6
  228. data/src/core/lib/surface/channel_init.h +26 -0
  229. data/src/core/lib/surface/init.cc +14 -8
  230. data/src/core/lib/surface/server.cc +256 -237
  231. data/src/core/lib/surface/server.h +26 -54
  232. data/src/core/lib/surface/version.cc +2 -2
  233. data/src/core/lib/surface/wait_for_cq_end_op.h +94 -0
  234. data/src/core/lib/transport/call_final_info.cc +38 -0
  235. data/src/core/lib/transport/call_final_info.h +54 -0
  236. data/src/core/lib/transport/connectivity_state.cc +3 -2
  237. data/src/core/lib/transport/connectivity_state.h +4 -0
  238. data/src/core/lib/transport/metadata_batch.h +4 -4
  239. data/src/core/lib/transport/transport.cc +70 -19
  240. data/src/core/lib/transport/transport.h +395 -25
  241. data/src/core/plugin_registry/grpc_plugin_registry.cc +3 -0
  242. data/src/core/plugin_registry/grpc_plugin_registry_extra.cc +0 -3
  243. data/src/core/tsi/alts/handshaker/alts_handshaker_client.cc +1 -1
  244. data/src/core/tsi/alts/handshaker/alts_tsi_handshaker.cc +1 -1
  245. data/src/core/tsi/alts/handshaker/transport_security_common_api.cc +1 -1
  246. data/src/core/tsi/ssl_transport_security.cc +65 -43
  247. data/src/ruby/ext/grpc/rb_channel_args.c +3 -1
  248. data/src/ruby/ext/grpc/rb_grpc.c +0 -1
  249. data/src/ruby/ext/grpc/rb_grpc.h +0 -2
  250. data/src/ruby/ext/grpc/rb_grpc_imports.generated.c +4 -0
  251. data/src/ruby/ext/grpc/rb_grpc_imports.generated.h +6 -0
  252. data/src/ruby/lib/grpc/version.rb +1 -1
  253. data/third_party/upb/upb/reflection/def_pool.h +2 -2
  254. data/third_party/zlib/adler32.c +5 -27
  255. data/third_party/zlib/compress.c +5 -16
  256. data/third_party/zlib/crc32.c +86 -162
  257. data/third_party/zlib/deflate.c +233 -336
  258. data/third_party/zlib/deflate.h +8 -8
  259. data/third_party/zlib/gzguts.h +11 -12
  260. data/third_party/zlib/infback.c +7 -23
  261. data/third_party/zlib/inffast.c +1 -4
  262. data/third_party/zlib/inffast.h +1 -1
  263. data/third_party/zlib/inflate.c +30 -99
  264. data/third_party/zlib/inftrees.c +6 -11
  265. data/third_party/zlib/inftrees.h +3 -3
  266. data/third_party/zlib/trees.c +224 -302
  267. data/third_party/zlib/uncompr.c +4 -12
  268. data/third_party/zlib/zconf.h +6 -2
  269. data/third_party/zlib/zlib.h +191 -188
  270. data/third_party/zlib/zutil.c +16 -44
  271. data/third_party/zlib/zutil.h +10 -10
  272. metadata +35 -13
  273. data/src/core/ext/filters/client_channel/lb_policy/xds/xds_cluster_resolver.cc +0 -1173
  274. data/src/core/lib/event_engine/memory_allocator.cc +0 -74
  275. data/src/core/lib/transport/pid_controller.cc +0 -51
  276. data/src/core/lib/transport/pid_controller.h +0 -116
  277. data/third_party/upb/upb/collections/array.h +0 -17
  278. data/third_party/upb/upb/collections/map.h +0 -17
  279. data/third_party/upb/upb/upb.hpp +0 -18
@@ -79,7 +79,7 @@ namespace experimental {
79
79
  ///
80
80
  ///
81
81
  /// Blocking EventEngine Callbacks
82
- /// -----------------------------
82
+ /// ------------------------------
83
83
  ///
84
84
  /// Doing blocking work in EventEngine callbacks is generally not advisable.
85
85
  /// While gRPC's default EventEngine implementations have some capacity to scale
@@ -90,6 +90,15 @@ namespace experimental {
90
90
  /// *Best Practice* : Occasional blocking work may be fine, but we do not
91
91
  /// recommend running a mostly blocking workload in EventEngine threads.
92
92
  ///
93
+ ///
94
+ /// Thread-safety guarantees
95
+ /// ------------------------
96
+ ///
97
+ /// All EventEngine methods are guaranteed to be thread-safe, no external
98
+ /// synchronization is required to call any EventEngine method. Please note that
99
+ /// this does not apply to application callbacks, which may be run concurrently;
100
+ /// application state synchronization must be managed by the application.
101
+ ///
93
102
  ////////////////////////////////////////////////////////////////////////////////
94
103
  class EventEngine : public std::enable_shared_from_this<EventEngine> {
95
104
  public:
@@ -246,6 +255,45 @@ class EventEngine : public std::enable_shared_from_this<EventEngine> {
246
255
  /// values are expected to remain valid for the life of the Endpoint.
247
256
  virtual const ResolvedAddress& GetPeerAddress() const = 0;
248
257
  virtual const ResolvedAddress& GetLocalAddress() const = 0;
258
+
259
+ /// A method which allows users to query whether an Endpoint implementation
260
+ /// supports a specified extension. The name of the extension is provided
261
+ /// as an input.
262
+ ///
263
+ /// An extension could be any type with a unique string id. Each extension
264
+ /// may support additional capabilities and if the Endpoint implementation
265
+ /// supports the queried extension, it should return a valid pointer to the
266
+ /// extension type.
267
+ ///
268
+ /// E.g., use case of an EventEngine::Endpoint supporting a custom
269
+ /// extension.
270
+ ///
271
+ /// class CustomEndpointExtension {
272
+ /// public:
273
+ /// static constexpr std::string name = "my.namespace.extension_name";
274
+ /// void Process() { ... }
275
+ /// }
276
+ ///
277
+ ///
278
+ /// class CustomEndpoint :
279
+ /// public EventEngine::Endpoint, CustomEndpointExtension {
280
+ /// public:
281
+ /// void* QueryExtension(absl::string_view id) override {
282
+ /// if (id == CustomEndpointExtension::name) {
283
+ /// return static_cast<CustomEndpointExtension*>(this);
284
+ /// }
285
+ /// return nullptr;
286
+ /// }
287
+ /// ...
288
+ /// }
289
+ ///
290
+ /// auto ext_ =
291
+ /// static_cast<CustomEndpointExtension*>(
292
+ /// endpoint->QueryExtension(CustomrEndpointExtension::name));
293
+ /// if (ext_ != nullptr) { ext_->Process(); }
294
+ ///
295
+ ///
296
+ virtual void* QueryExtension(absl::string_view /*id*/) { return nullptr; }
249
297
  };
250
298
 
251
299
  /// Called when a new connection is established.
@@ -405,8 +453,8 @@ class EventEngine : public std::enable_shared_from_this<EventEngine> {
405
453
 
406
454
  /// Asynchronously executes a task as soon as possible.
407
455
  ///
408
- /// \a Closures scheduled with \a Run cannot be cancelled. The \a closure will
409
- /// not be deleted after it has been run, ownership remains with the caller.
456
+ /// \a Closures passed to \a Run cannot be cancelled. The \a closure will not
457
+ /// be deleted after it has been run, ownership remains with the caller.
410
458
  ///
411
459
  /// Implementations must not execute the closure in the calling thread before
412
460
  /// \a Run returns. For example, if the caller must release a lock before the
@@ -415,9 +463,9 @@ class EventEngine : public std::enable_shared_from_this<EventEngine> {
415
463
  virtual void Run(Closure* closure) = 0;
416
464
  /// Asynchronously executes a task as soon as possible.
417
465
  ///
418
- /// \a Closures scheduled with \a Run cannot be cancelled. Unlike the
419
- /// overloaded \a Closure alternative, the absl::AnyInvocable version's \a
420
- /// closure will be deleted by the EventEngine after the closure has been run.
466
+ /// \a Closures passed to \a Run cannot be cancelled. Unlike the overloaded \a
467
+ /// Closure alternative, the absl::AnyInvocable version's \a closure will be
468
+ /// deleted by the EventEngine after the closure has been run.
421
469
  ///
422
470
  /// This version of \a Run may be less performant than the \a Closure version
423
471
  /// in some scenarios. This overload is useful in situations where performance
@@ -453,13 +501,12 @@ class EventEngine : public std::enable_shared_from_this<EventEngine> {
453
501
  absl::AnyInvocable<void()> closure) = 0;
454
502
  /// Request cancellation of a task.
455
503
  ///
456
- /// If the associated closure has already been scheduled to run, it will not
457
- /// be cancelled, and this function will return false.
504
+ /// If the associated closure cannot be cancelled for any reason, this
505
+ /// function will return false.
458
506
  ///
459
- /// If the associated closure has not been scheduled to run, it will be
460
- /// cancelled, and this method will return true. The associated
461
- /// absl::AnyInvocable or \a Closure* will not be called. If the closure type
462
- /// was an absl::AnyInvocable, it will be destroyed before the method returns.
507
+ /// If the associated closure can be cancelled, the associated callback will
508
+ /// never be run, and this method will return true. If the callback type was
509
+ /// an absl::AnyInvocable, it will be destroyed before the method returns.
463
510
  virtual bool Cancel(TaskHandle handle) = 0;
464
511
  };
465
512
 
@@ -50,6 +50,12 @@ class MemoryAllocatorImpl
50
50
  /// request.max() inclusively.
51
51
  virtual size_t Reserve(MemoryRequest request) = 0;
52
52
 
53
+ /// Allocate a slice, using MemoryRequest to size the number of returned
54
+ /// bytes. For a variable length request, check the returned slice length to
55
+ /// verify how much memory was allocated. Takes care of reserving memory for
56
+ /// any relevant control structures also.
57
+ virtual grpc_slice MakeSlice(MemoryRequest request) = 0;
58
+
53
59
  /// Release some bytes that were previously reserved.
54
60
  /// If more bytes are released than were reserved, we will have undefined
55
61
  /// behavior.
@@ -60,6 +60,18 @@ Result& SliceCast(T& value, SliceCastable<Result, T> = {}) {
60
60
  return reinterpret_cast<Result&>(value);
61
61
  }
62
62
 
63
+ // Cast to `Result&&` from `T&&` without any runtime checks.
64
+ // This is only valid if `sizeof(Result) == sizeof(T)`, and if `Result`, `T` are
65
+ // opted in as compatible via `SliceCastable`.
66
+ template <typename Result, typename T>
67
+ Result&& SliceCast(T&& value, SliceCastable<Result, T> = {}) {
68
+ // Insist upon sizes being equal to catch mismatches.
69
+ // We assume if sizes are opted in and sizes are equal then yes, these two
70
+ // types are expected to be layout compatible and actually appear to be.
71
+ static_assert(sizeof(Result) == sizeof(T), "size mismatch");
72
+ return reinterpret_cast<Result&&>(value);
73
+ }
74
+
63
75
  } // namespace internal
64
76
  } // namespace experimental
65
77
  } // namespace grpc_event_engine
@@ -134,7 +134,9 @@ class MemoryAllocator {
134
134
  /// bytes. For a variable length request, check the returned slice length to
135
135
  /// verify how much memory was allocated. Takes care of reserving memory for
136
136
  /// any relevant control structures also.
137
- grpc_slice MakeSlice(MemoryRequest request);
137
+ grpc_slice MakeSlice(MemoryRequest request) {
138
+ return allocator_->MakeSlice(request);
139
+ }
138
140
 
139
141
  /// A C++ allocator for containers of T.
140
142
  template <typename T>
@@ -169,6 +169,11 @@ struct CopyConstructors {
169
169
  return Out(grpc_slice_from_copied_buffer(p, len));
170
170
  }
171
171
 
172
+ static Out FromCopiedBuffer(const uint8_t* p, size_t len) {
173
+ return Out(
174
+ grpc_slice_from_copied_buffer(reinterpret_cast<const char*>(p), len));
175
+ }
176
+
172
177
  template <typename Buffer>
173
178
  static Out FromCopiedBuffer(const Buffer& buffer) {
174
179
  return FromCopiedBuffer(reinterpret_cast<const char*>(buffer.data()),
@@ -815,6 +815,24 @@ GRPCAPI void grpc_tls_certificate_provider_release(
815
815
  */
816
816
  GRPCAPI grpc_tls_credentials_options* grpc_tls_credentials_options_create(void);
817
817
 
818
+ /**
819
+ * EXPERIMENTAL API - Subject to change
820
+ *
821
+ * Sets the minimum TLS version that will be negotiated during the TLS
822
+ * handshake. If not set, the underlying SSL library will set it to TLS v1.2.
823
+ */
824
+ GRPCAPI void grpc_tls_credentials_options_set_min_tls_version(
825
+ grpc_tls_credentials_options* options, grpc_tls_version min_tls_version);
826
+
827
+ /**
828
+ * EXPERIMENTAL API - Subject to change
829
+ *
830
+ * Sets the maximum TLS version that will be negotiated during the TLS
831
+ * handshake. If not set, the underlying SSL library will set it to TLS v1.3.
832
+ */
833
+ GRPCAPI void grpc_tls_credentials_options_set_max_tls_version(
834
+ grpc_tls_credentials_options* options, grpc_tls_version max_tls_version);
835
+
818
836
  /**
819
837
  * EXPERIMENTAL API - Subject to change
820
838
  *
@@ -894,7 +912,10 @@ GRPCAPI void grpc_tls_credentials_options_set_identity_cert_name(
894
912
  GRPCAPI void grpc_tls_credentials_options_set_cert_request_type(
895
913
  grpc_tls_credentials_options* options,
896
914
  grpc_ssl_client_certificate_request_type type);
897
- /**
915
+
916
+ /** Deprecated in favor of grpc_tls_credentials_options_set_crl_provider. The
917
+ * crl provider interface provides a significantly more flexible approach to
918
+ * using CRLs. See gRFC A69 for details.
898
919
  * EXPERIMENTAL API - Subject to change
899
920
  *
900
921
  * If set, gRPC will read all hashed x.509 CRL files in the directory and
@@ -0,0 +1,29 @@
1
+ // Copyright 2023 The gRPC Authors
2
+ //
3
+ // Licensed under the Apache License, Version 2.0 (the "License");
4
+ // you may not use this file except in compliance with the License.
5
+ // You may obtain a copy of the License at
6
+ //
7
+ // http://www.apache.org/licenses/LICENSE-2.0
8
+ //
9
+ // Unless required by applicable law or agreed to in writing, software
10
+ // distributed under the License is distributed on an "AS IS" BASIS,
11
+ // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12
+ // See the License for the specific language governing permissions and
13
+ // limitations under the License.
14
+
15
+ #ifndef GRPC_IMPL_CALL_H
16
+ #define GRPC_IMPL_CALL_H
17
+
18
+ #include <grpc/support/port_platform.h>
19
+
20
+ #include "absl/functional/any_invocable.h"
21
+
22
+ #include <grpc/grpc.h>
23
+
24
+ // Run a callback in the call's EventEngine.
25
+ // Internal-only
26
+ void grpc_call_run_in_event_engine(const grpc_call* call,
27
+ absl::AnyInvocable<void()> cb);
28
+
29
+ #endif /* GRPC_IMPL_CALL_H */
@@ -15,7 +15,7 @@
15
15
  #ifndef GRPC_IMPL_CHANNEL_ARG_NAMES_H
16
16
  #define GRPC_IMPL_CHANNEL_ARG_NAMES_H
17
17
 
18
- // IWYU pragma: private, include "third_party/grpc/include/grpc/grpc.h"
18
+ // IWYU pragma: private, include <grpc/grpc.h>
19
19
  // IWYU pragma: friend "src/.*"
20
20
  // IWYU pragma: friend "test/.*"
21
21
 
@@ -106,6 +106,12 @@
106
106
  */
107
107
  #define GRPC_ARG_HTTP2_MIN_RECV_PING_INTERVAL_WITHOUT_DATA_MS \
108
108
  "grpc.http2.min_ping_interval_without_data_ms"
109
+ /** Maximum time to allow a request to be:
110
+ (1) received by the server, but
111
+ (2) not requested by a RequestCall (in the completion queue based API)
112
+ before the request is cancelled */
113
+ #define GRPC_ARG_SERVER_MAX_UNREQUESTED_TIME_IN_SERVER_SECONDS \
114
+ "grpc.server_max_unrequested_time_in_server"
109
115
  /** Channel arg to override the http2 :scheme header */
110
116
  #define GRPC_ARG_HTTP2_SCHEME "grpc.http2_scheme"
111
117
  /** How many pings can the client send before needing to send a
@@ -384,6 +390,11 @@
384
390
  * Defaults to 250ms. */
385
391
  #define GRPC_ARG_HAPPY_EYEBALLS_CONNECTION_ATTEMPT_DELAY_MS \
386
392
  "grpc.happy_eyeballs_connection_attempt_delay_ms"
393
+ /** It accepts a MemoryAllocatorFactory as input and If specified, it forces
394
+ * the default event engine to use memory allocators created using the provided
395
+ * factory. */
396
+ #define GRPC_ARG_EVENT_ENGINE_USE_MEMORY_ALLOCATOR_FACTORY \
397
+ "grpc.event_engine_use_memory_allocator_factory"
387
398
  /** \} */
388
399
 
389
400
  #endif /* GRPC_IMPL_CHANNEL_ARG_NAMES_H */
@@ -74,7 +74,7 @@ struct grpc_slice {
74
74
  } data;
75
75
  };
76
76
 
77
- #define GRPC_SLICE_BUFFER_INLINE_ELEMENTS 8
77
+ #define GRPC_SLICE_BUFFER_INLINE_ELEMENTS 7
78
78
 
79
79
  /** Represents an expandable array of slices, to be interpreted as a
80
80
  single item. */
@@ -13,6 +13,7 @@ header "byte_buffer.h"
13
13
  header "grpc_posix.h"
14
14
  header "grpc_security.h"
15
15
  header "grpc_security_constants.h"
16
+ header "impl/call.h"
16
17
  header "impl/channel_arg_names.h"
17
18
  header "impl/codegen/atm.h"
18
19
  header "impl/codegen/byte_buffer.h"
@@ -26,7 +26,7 @@
26
26
 
27
27
  #include "absl/strings/string_view.h"
28
28
  #include "upb/base/string_view.h"
29
- #include "upb/upb.hpp"
29
+ #include "upb/mem/arena.hpp"
30
30
  #include "xds/data/orca/v3/orca_load_report.upb.h"
31
31
 
32
32
  #include <grpc/impl/channel_arg_names.h>
@@ -37,6 +37,7 @@
37
37
  #include "src/core/lib/channel/context.h"
38
38
  #include "src/core/lib/config/core_configuration.h"
39
39
  #include "src/core/lib/debug/trace.h"
40
+ #include "src/core/lib/experiments/experiments.h"
40
41
  #include "src/core/lib/promise/context.h"
41
42
  #include "src/core/lib/promise/map.h"
42
43
  #include "src/core/lib/slice/slice.h"
@@ -47,8 +48,15 @@ namespace grpc_core {
47
48
 
48
49
  TraceFlag grpc_backend_metric_filter_trace(false, "backend_metric_filter");
49
50
 
50
- absl::optional<std::string> BackendMetricFilter::MaybeSerializeBackendMetrics(
51
- BackendMetricProvider* provider) const {
51
+ const NoInterceptor BackendMetricFilter::Call::OnClientInitialMetadata;
52
+ const NoInterceptor BackendMetricFilter::Call::OnServerInitialMetadata;
53
+ const NoInterceptor BackendMetricFilter::Call::OnClientToServerMessage;
54
+ const NoInterceptor BackendMetricFilter::Call::OnServerToClientMessage;
55
+ const NoInterceptor BackendMetricFilter::Call::OnFinalize;
56
+
57
+ namespace {
58
+ absl::optional<std::string> MaybeSerializeBackendMetrics(
59
+ BackendMetricProvider* provider) {
52
60
  if (provider == nullptr) return absl::nullopt;
53
61
  BackendMetricData data = provider->GetBackendMetricData();
54
62
  upb::Arena arena;
@@ -107,17 +115,27 @@ absl::optional<std::string> BackendMetricFilter::MaybeSerializeBackendMetrics(
107
115
  xds_data_orca_v3_OrcaLoadReport_serialize(response, arena.ptr(), &len);
108
116
  return std::string(buf, len);
109
117
  }
118
+ } // namespace
119
+
120
+ const grpc_channel_filter LegacyBackendMetricFilter::kFilter =
121
+ MakePromiseBasedFilter<LegacyBackendMetricFilter, FilterEndpoint::kServer>(
122
+ "backend_metric");
110
123
 
111
124
  const grpc_channel_filter BackendMetricFilter::kFilter =
112
125
  MakePromiseBasedFilter<BackendMetricFilter, FilterEndpoint::kServer>(
113
126
  "backend_metric");
114
127
 
128
+ absl::StatusOr<LegacyBackendMetricFilter> LegacyBackendMetricFilter::Create(
129
+ const ChannelArgs&, ChannelFilter::Args) {
130
+ return LegacyBackendMetricFilter();
131
+ }
132
+
115
133
  absl::StatusOr<BackendMetricFilter> BackendMetricFilter::Create(
116
134
  const ChannelArgs&, ChannelFilter::Args) {
117
135
  return BackendMetricFilter();
118
136
  }
119
137
 
120
- ArenaPromise<ServerMetadataHandle> BackendMetricFilter::MakeCallPromise(
138
+ ArenaPromise<ServerMetadataHandle> LegacyBackendMetricFilter::MakeCallPromise(
121
139
  CallArgs call_args, NextPromiseFactory next_promise_factory) {
122
140
  return ArenaPromise<ServerMetadataHandle>(Map(
123
141
  next_promise_factory(std::move(call_args)),
@@ -148,10 +166,39 @@ ArenaPromise<ServerMetadataHandle> BackendMetricFilter::MakeCallPromise(
148
166
  }));
149
167
  }
150
168
 
169
+ void BackendMetricFilter::Call::OnServerTrailingMetadata(ServerMetadata& md) {
170
+ auto* ctx = &GetContext<
171
+ grpc_call_context_element>()[GRPC_CONTEXT_BACKEND_METRIC_PROVIDER];
172
+ if (ctx == nullptr) {
173
+ if (GRPC_TRACE_FLAG_ENABLED(grpc_backend_metric_filter_trace)) {
174
+ gpr_log(GPR_INFO, "[%p] No BackendMetricProvider.", this);
175
+ }
176
+ return;
177
+ }
178
+ absl::optional<std::string> serialized = MaybeSerializeBackendMetrics(
179
+ reinterpret_cast<BackendMetricProvider*>(ctx->value));
180
+ if (serialized.has_value() && !serialized->empty()) {
181
+ if (GRPC_TRACE_FLAG_ENABLED(grpc_backend_metric_filter_trace)) {
182
+ gpr_log(GPR_INFO, "[%p] Backend metrics serialized. size: %" PRIuPTR,
183
+ this, serialized->size());
184
+ }
185
+ md.Set(EndpointLoadMetricsBinMetadata(),
186
+ Slice::FromCopiedString(std::move(*serialized)));
187
+ } else if (GRPC_TRACE_FLAG_ENABLED(grpc_backend_metric_filter_trace)) {
188
+ gpr_log(GPR_INFO, "[%p] No backend metrics.", this);
189
+ }
190
+ }
191
+
151
192
  void RegisterBackendMetricFilter(CoreConfiguration::Builder* builder) {
152
- builder->channel_init()
153
- ->RegisterFilter(GRPC_SERVER_CHANNEL, &BackendMetricFilter::kFilter)
154
- .IfHasChannelArg(GRPC_ARG_SERVER_CALL_METRIC_RECORDING);
193
+ if (IsV3BackendMetricFilterEnabled()) {
194
+ builder->channel_init()
195
+ ->RegisterFilter<BackendMetricFilter>(GRPC_SERVER_CHANNEL)
196
+ .IfHasChannelArg(GRPC_ARG_SERVER_CALL_METRIC_RECORDING);
197
+ } else {
198
+ builder->channel_init()
199
+ ->RegisterFilter<LegacyBackendMetricFilter>(GRPC_SERVER_CHANNEL)
200
+ .IfHasChannelArg(GRPC_ARG_SERVER_CALL_METRIC_RECORDING);
201
+ }
155
202
  }
156
203
 
157
204
  } // namespace grpc_core
@@ -31,20 +31,34 @@
31
31
 
32
32
  namespace grpc_core {
33
33
 
34
- class BackendMetricFilter : public ChannelFilter {
34
+ class LegacyBackendMetricFilter : public ChannelFilter {
35
35
  public:
36
36
  static const grpc_channel_filter kFilter;
37
37
 
38
- static absl::StatusOr<BackendMetricFilter> Create(const ChannelArgs& args,
39
- ChannelFilter::Args);
38
+ static absl::StatusOr<LegacyBackendMetricFilter> Create(
39
+ const ChannelArgs& args, ChannelFilter::Args);
40
40
 
41
41
  // Construct a promise for one call.
42
42
  ArenaPromise<ServerMetadataHandle> MakeCallPromise(
43
43
  CallArgs call_args, NextPromiseFactory next_promise_factory) override;
44
+ };
45
+
46
+ class BackendMetricFilter : public ImplementChannelFilter<BackendMetricFilter> {
47
+ public:
48
+ static const grpc_channel_filter kFilter;
49
+
50
+ static absl::StatusOr<BackendMetricFilter> Create(const ChannelArgs& args,
51
+ ChannelFilter::Args);
44
52
 
45
- private:
46
- absl::optional<std::string> MaybeSerializeBackendMetrics(
47
- BackendMetricProvider* provider) const;
53
+ class Call {
54
+ public:
55
+ static const NoInterceptor OnClientInitialMetadata;
56
+ static const NoInterceptor OnServerInitialMetadata;
57
+ void OnServerTrailingMetadata(ServerMetadata& md);
58
+ static const NoInterceptor OnClientToServerMessage;
59
+ static const NoInterceptor OnServerToClientMessage;
60
+ static const NoInterceptor OnFinalize;
61
+ };
48
62
  };
49
63
 
50
64
  } // namespace grpc_core
@@ -56,6 +56,13 @@
56
56
 
57
57
  namespace grpc_core {
58
58
 
59
+ const NoInterceptor ChannelIdleFilter::Call::OnClientInitialMetadata;
60
+ const NoInterceptor ChannelIdleFilter::Call::OnServerInitialMetadata;
61
+ const NoInterceptor ChannelIdleFilter::Call::OnServerTrailingMetadata;
62
+ const NoInterceptor ChannelIdleFilter::Call::OnClientToServerMessage;
63
+ const NoInterceptor ChannelIdleFilter::Call::OnServerToClientMessage;
64
+ const NoInterceptor ChannelIdleFilter::Call::OnFinalize;
65
+
59
66
  namespace {
60
67
 
61
68
  // TODO(roth): This can go back to being a constant when the experiment
@@ -221,17 +228,6 @@ void MaxAgeFilter::PostInit() {
221
228
  }
222
229
  }
223
230
 
224
- // Construct a promise for one call.
225
- ArenaPromise<ServerMetadataHandle> ChannelIdleFilter::MakeCallPromise(
226
- CallArgs call_args, NextPromiseFactory next_promise_factory) {
227
- using Decrementer = std::unique_ptr<ChannelIdleFilter, CallCountDecreaser>;
228
- IncreaseCallCount();
229
- return ArenaPromise<ServerMetadataHandle>(
230
- [decrementer = Decrementer(this),
231
- next = next_promise_factory(std::move(call_args))]() mutable
232
- -> Poll<ServerMetadataHandle> { return next(); });
233
- }
234
-
235
231
  bool ChannelIdleFilter::StartTransportOp(grpc_transport_op* op) {
236
232
  // Catch the disconnect_with_error transport op.
237
233
  if (!op->disconnect_with_error.ok()) Shutdown();
@@ -298,14 +294,15 @@ const grpc_channel_filter MaxAgeFilter::kFilter =
298
294
  MakePromiseBasedFilter<MaxAgeFilter, FilterEndpoint::kServer>("max_age");
299
295
 
300
296
  void RegisterChannelIdleFilters(CoreConfiguration::Builder* builder) {
297
+ if (!IsV3ChannelIdleFiltersEnabled()) return;
301
298
  builder->channel_init()
302
- ->RegisterFilter(GRPC_CLIENT_CHANNEL, &ClientIdleFilter::kFilter)
299
+ ->RegisterFilter<ClientIdleFilter>(GRPC_CLIENT_CHANNEL)
303
300
  .ExcludeFromMinimalStack()
304
301
  .If([](const ChannelArgs& channel_args) {
305
302
  return GetClientIdleTimeout(channel_args) != Duration::Infinity();
306
303
  });
307
304
  builder->channel_init()
308
- ->RegisterFilter(GRPC_SERVER_CHANNEL, &MaxAgeFilter::kFilter)
305
+ ->RegisterFilter<MaxAgeFilter>(GRPC_SERVER_CHANNEL)
309
306
  .ExcludeFromMinimalStack()
310
307
  .If([](const ChannelArgs& channel_args) {
311
308
  return MaxAgeFilter::Config::FromChannelArgs(channel_args).enable();
@@ -40,7 +40,7 @@
40
40
 
41
41
  namespace grpc_core {
42
42
 
43
- class ChannelIdleFilter : public ChannelFilter {
43
+ class ChannelIdleFilter : public ImplementChannelFilter<ChannelIdleFilter> {
44
44
  public:
45
45
  ~ChannelIdleFilter() override = default;
46
46
 
@@ -49,9 +49,23 @@ class ChannelIdleFilter : public ChannelFilter {
49
49
  ChannelIdleFilter(ChannelIdleFilter&&) = default;
50
50
  ChannelIdleFilter& operator=(ChannelIdleFilter&&) = default;
51
51
 
52
- // Construct a promise for one call.
53
- ArenaPromise<ServerMetadataHandle> MakeCallPromise(
54
- CallArgs call_args, NextPromiseFactory next_promise_factory) override;
52
+ class Call {
53
+ public:
54
+ explicit Call(ChannelIdleFilter* filter) : filter_(filter) {
55
+ filter_->IncreaseCallCount();
56
+ }
57
+ ~Call() { filter_->DecreaseCallCount(); }
58
+
59
+ static const NoInterceptor OnClientInitialMetadata;
60
+ static const NoInterceptor OnServerInitialMetadata;
61
+ static const NoInterceptor OnServerTrailingMetadata;
62
+ static const NoInterceptor OnClientToServerMessage;
63
+ static const NoInterceptor OnServerToClientMessage;
64
+ static const NoInterceptor OnFinalize;
65
+
66
+ private:
67
+ ChannelIdleFilter* filter_;
68
+ };
55
69
 
56
70
  bool StartTransportOp(grpc_transport_op* op) override;
57
71
 
@@ -75,12 +89,6 @@ class ChannelIdleFilter : public ChannelFilter {
75
89
  private:
76
90
  void StartIdleTimer();
77
91
 
78
- struct CallCountDecreaser {
79
- void operator()(ChannelIdleFilter* filter) const {
80
- filter->DecreaseCallCount();
81
- }
82
- };
83
-
84
92
  // The channel stack to which we take refs for pending callbacks.
85
93
  grpc_channel_stack* channel_stack_;
86
94
  Duration client_idle_timeout_;