grpc 1.60.2 → 1.61.0.pre2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
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_;