grpc 1.78.0 → 1.80.0.pre1

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 (431) hide show
  1. checksums.yaml +4 -4
  2. data/Makefile +22 -8
  3. data/include/grpc/credentials.h +47 -37
  4. data/include/grpc/credentials_cpp.h +39 -0
  5. data/include/grpc/event_engine/event_engine.h +8 -3
  6. data/include/grpc/grpc.h +4 -0
  7. data/include/grpc/impl/call.h +9 -0
  8. data/include/grpc/impl/channel_arg_names.h +7 -0
  9. data/include/grpc/module.modulemap +2 -0
  10. data/include/grpc/private_key_signer.h +104 -0
  11. data/include/grpc/support/port_platform.h +6 -0
  12. data/src/core/call/call_filters.h +101 -78
  13. data/src/core/call/call_spine.h +91 -68
  14. data/src/core/call/call_state.h +60 -4
  15. data/src/core/call/client_call.cc +9 -9
  16. data/src/core/call/client_call.h +1 -1
  17. data/src/core/call/metadata_batch.cc +2 -0
  18. data/src/core/call/metadata_batch.h +48 -1
  19. data/src/core/call/metadata_info.cc +35 -0
  20. data/src/core/call/metadata_info.h +2 -0
  21. data/src/core/call/simple_slice_based_metadata.h +2 -1
  22. data/src/core/channelz/channelz.cc +9 -6
  23. data/src/core/channelz/channelz.h +7 -4
  24. data/src/core/channelz/property_list.h +5 -0
  25. data/src/core/channelz/v2tov1/convert.cc +1 -1
  26. data/src/core/channelz/v2tov1/legacy_api.cc +164 -307
  27. data/src/core/client_channel/buffered_call.cc +7 -3
  28. data/src/core/client_channel/buffered_call.h +11 -5
  29. data/src/core/client_channel/client_channel.cc +106 -44
  30. data/src/core/client_channel/client_channel.h +3 -6
  31. data/src/core/client_channel/client_channel_filter.cc +90 -64
  32. data/src/core/client_channel/client_channel_filter.h +3 -6
  33. data/src/core/client_channel/client_channel_internal.h +5 -0
  34. data/src/core/client_channel/config_selector.h +17 -12
  35. data/src/core/client_channel/dynamic_filters.cc +8 -7
  36. data/src/core/client_channel/dynamic_filters.h +7 -5
  37. data/src/core/client_channel/retry_filter.cc +1 -1
  38. data/src/core/client_channel/retry_filter.h +2 -2
  39. data/src/core/client_channel/subchannel.cc +1682 -266
  40. data/src/core/client_channel/subchannel.h +411 -134
  41. data/src/core/client_channel/subchannel_stream_client.cc +22 -18
  42. data/src/core/client_channel/subchannel_stream_client.h +8 -9
  43. data/src/core/client_channel/subchannel_stream_limiter.cc +76 -0
  44. data/src/core/client_channel/subchannel_stream_limiter.h +51 -0
  45. data/src/core/config/config_vars.cc +9 -1
  46. data/src/core/config/config_vars.h +6 -0
  47. data/src/core/credentials/call/call_creds_registry.h +51 -22
  48. data/src/core/credentials/call/call_creds_registry_init.cc +86 -2
  49. data/src/core/credentials/call/external/aws_external_account_credentials.cc +2 -2
  50. data/src/core/credentials/call/external/external_account_credentials.cc +11 -4
  51. data/src/core/credentials/call/external/file_external_account_credentials.cc +2 -2
  52. data/src/core/credentials/transport/channel_creds_registry.h +71 -20
  53. data/src/core/credentials/transport/channel_creds_registry_init.cc +338 -29
  54. data/src/core/credentials/transport/ssl/ssl_credentials.cc +43 -24
  55. data/src/core/credentials/transport/ssl/ssl_credentials.h +7 -1
  56. data/src/core/credentials/transport/ssl/ssl_security_connector.cc +2 -8
  57. data/src/core/credentials/transport/ssl/ssl_security_connector.h +4 -3
  58. data/src/core/credentials/transport/tls/grpc_tls_certificate_distributor.cc +25 -5
  59. data/src/core/credentials/transport/tls/grpc_tls_certificate_distributor.h +7 -5
  60. data/src/core/credentials/transport/tls/grpc_tls_certificate_provider.cc +181 -109
  61. data/src/core/credentials/transport/tls/grpc_tls_certificate_provider.h +55 -42
  62. data/src/core/credentials/transport/tls/grpc_tls_credentials_options.cc +28 -23
  63. data/src/core/credentials/transport/tls/grpc_tls_credentials_options.h +26 -23
  64. data/src/core/credentials/transport/tls/spiffe_utils.cc +2 -2
  65. data/src/core/credentials/transport/tls/ssl_utils.cc +18 -18
  66. data/src/core/credentials/transport/tls/ssl_utils.h +12 -10
  67. data/src/core/credentials/transport/tls/tls_security_connector.cc +106 -74
  68. data/src/core/credentials/transport/tls/tls_security_connector.h +12 -8
  69. data/src/core/credentials/transport/xds/xds_credentials.cc +76 -32
  70. data/src/core/credentials/transport/xds/xds_credentials.h +4 -2
  71. data/src/core/ext/filters/fault_injection/fault_injection_filter.cc +117 -35
  72. data/src/core/ext/filters/fault_injection/fault_injection_filter.h +42 -4
  73. data/src/core/ext/filters/gcp_authentication/gcp_authentication_filter.cc +58 -29
  74. data/src/core/ext/filters/gcp_authentication/gcp_authentication_filter.h +19 -11
  75. data/src/core/ext/filters/stateful_session/stateful_session_filter.cc +82 -25
  76. data/src/core/ext/filters/stateful_session/stateful_session_filter.h +28 -3
  77. data/src/core/ext/filters/stateful_session/stateful_session_service_config_parser.cc +9 -7
  78. data/src/core/ext/filters/stateful_session/stateful_session_service_config_parser.h +1 -1
  79. data/src/core/ext/transport/chttp2/transport/call_tracer_wrapper.h +7 -1
  80. data/src/core/ext/transport/chttp2/transport/chttp2_transport.cc +117 -67
  81. data/src/core/ext/transport/chttp2/transport/chttp2_transport.h +2 -0
  82. data/src/core/ext/transport/chttp2/transport/flow_control.h +11 -1
  83. data/src/core/ext/transport/chttp2/transport/frame.cc +2 -15
  84. data/src/core/ext/transport/chttp2/transport/frame.h +0 -4
  85. data/src/core/ext/transport/chttp2/transport/goaway.cc +17 -2
  86. data/src/core/ext/transport/chttp2/transport/goaway.h +27 -6
  87. data/src/core/ext/transport/chttp2/transport/header_assembler.h +8 -21
  88. data/src/core/ext/transport/chttp2/transport/hpack_encoder.cc +101 -40
  89. data/src/core/ext/transport/chttp2/transport/hpack_encoder.h +95 -0
  90. data/src/core/ext/transport/chttp2/transport/http2_client_transport.cc +923 -772
  91. data/src/core/ext/transport/chttp2/transport/http2_client_transport.h +406 -423
  92. data/src/core/ext/transport/chttp2/transport/http2_settings.cc +1 -0
  93. data/src/core/ext/transport/chttp2/transport/http2_settings.h +8 -1
  94. data/src/core/ext/transport/chttp2/transport/http2_settings_promises.h +25 -13
  95. data/src/core/ext/transport/chttp2/transport/http2_transport.cc +71 -24
  96. data/src/core/ext/transport/chttp2/transport/http2_transport.h +25 -49
  97. data/src/core/ext/transport/chttp2/transport/http2_ztrace_collector.h +2 -2
  98. data/src/core/ext/transport/chttp2/transport/incoming_metadata_tracker.h +29 -9
  99. data/src/core/ext/transport/chttp2/transport/internal.h +6 -2
  100. data/src/core/ext/transport/chttp2/transport/keepalive.cc +14 -20
  101. data/src/core/ext/transport/chttp2/transport/keepalive.h +9 -6
  102. data/src/core/ext/transport/chttp2/transport/parsing.cc +11 -0
  103. data/src/core/ext/transport/chttp2/transport/ping_promise.cc +34 -74
  104. data/src/core/ext/transport/chttp2/transport/ping_promise.h +123 -79
  105. data/src/core/ext/transport/chttp2/transport/security_frame.h +233 -3
  106. data/src/core/ext/transport/chttp2/transport/stream.h +152 -73
  107. data/src/core/ext/transport/chttp2/transport/stream_data_queue.h +155 -85
  108. data/src/core/ext/transport/chttp2/transport/transport_common.h +0 -5
  109. data/src/core/ext/transport/chttp2/transport/writable_streams.h +8 -7
  110. data/src/core/ext/transport/chttp2/transport/write_cycle.cc +86 -0
  111. data/src/core/ext/transport/chttp2/transport/write_cycle.h +355 -0
  112. data/src/core/ext/transport/chttp2/transport/writing.cc +31 -29
  113. data/src/core/ext/upb-gen/cel/expr/checked.upb.h +1875 -0
  114. data/src/core/ext/upb-gen/cel/expr/checked.upb_minitable.c +409 -0
  115. data/src/core/ext/upb-gen/cel/expr/checked.upb_minitable.h +56 -0
  116. data/src/core/ext/upb-gen/cel/expr/syntax.upb.h +2223 -0
  117. data/src/core/ext/upb-gen/cel/expr/syntax.upb_minitable.c +489 -0
  118. data/src/core/ext/upb-gen/cel/expr/syntax.upb_minitable.h +60 -0
  119. data/src/core/ext/upb-gen/envoy/config/accesslog/v3/accesslog.upb.h +2 -1
  120. data/src/core/ext/upb-gen/envoy/config/bootstrap/v3/bootstrap.upb.h +130 -18
  121. data/src/core/ext/upb-gen/envoy/config/bootstrap/v3/bootstrap.upb_minitable.c +18 -13
  122. data/src/core/ext/upb-gen/envoy/config/cluster/v3/cluster.upb.h +70 -38
  123. data/src/core/ext/upb-gen/envoy/config/cluster/v3/cluster.upb_minitable.c +20 -17
  124. data/src/core/ext/upb-gen/envoy/config/common/matcher/v3/matcher.upb.h +26 -10
  125. data/src/core/ext/upb-gen/envoy/config/common/matcher/v3/matcher.upb_minitable.c +8 -7
  126. data/src/core/ext/upb-gen/envoy/config/common/mutation_rules/v3/mutation_rules.upb.h +495 -0
  127. data/src/core/ext/upb-gen/envoy/config/common/mutation_rules/v3/mutation_rules.upb_minitable.c +114 -0
  128. data/src/core/ext/upb-gen/envoy/config/common/mutation_rules/v3/mutation_rules.upb_minitable.h +36 -0
  129. data/src/core/ext/upb-gen/envoy/config/core/v3/address.upb.h +26 -10
  130. data/src/core/ext/upb-gen/envoy/config/core/v3/address.upb_minitable.c +8 -7
  131. data/src/core/ext/upb-gen/envoy/config/core/v3/cel.upb.h +121 -0
  132. data/src/core/ext/upb-gen/envoy/config/core/v3/cel.upb_minitable.c +54 -0
  133. data/src/core/ext/upb-gen/envoy/config/core/v3/cel.upb_minitable.h +32 -0
  134. data/src/core/ext/upb-gen/envoy/config/core/v3/grpc_service.upb.h +143 -9
  135. data/src/core/ext/upb-gen/envoy/config/core/v3/grpc_service.upb_minitable.c +18 -6
  136. data/src/core/ext/upb-gen/envoy/config/core/v3/protocol.upb.h +112 -11
  137. data/src/core/ext/upb-gen/envoy/config/core/v3/protocol.upb_minitable.c +22 -9
  138. data/src/core/ext/upb-gen/envoy/config/core/v3/proxy_protocol.upb.h +276 -0
  139. data/src/core/ext/upb-gen/envoy/config/core/v3/proxy_protocol.upb_minitable.c +60 -5
  140. data/src/core/ext/upb-gen/envoy/config/core/v3/proxy_protocol.upb_minitable.h +4 -0
  141. data/src/core/ext/upb-gen/envoy/config/endpoint/v3/endpoint_components.upb.h +72 -0
  142. data/src/core/ext/upb-gen/envoy/config/endpoint/v3/endpoint_components.upb_minitable.c +23 -2
  143. data/src/core/ext/upb-gen/envoy/config/endpoint/v3/endpoint_components.upb_minitable.h +2 -0
  144. data/src/core/ext/upb-gen/envoy/config/listener/v3/listener.upb.h +129 -13
  145. data/src/core/ext/upb-gen/envoy/config/listener/v3/listener.upb_minitable.c +36 -10
  146. data/src/core/ext/upb-gen/envoy/config/listener/v3/listener.upb_minitable.h +2 -0
  147. data/src/core/ext/upb-gen/envoy/config/listener/v3/quic_config.upb.h +30 -0
  148. data/src/core/ext/upb-gen/envoy/config/listener/v3/quic_config.upb_minitable.c +5 -3
  149. data/src/core/ext/upb-gen/envoy/config/metrics/v3/metrics_service.upb.h +16 -0
  150. data/src/core/ext/upb-gen/envoy/config/metrics/v3/metrics_service.upb_minitable.c +4 -3
  151. data/src/core/ext/upb-gen/envoy/config/metrics/v3/stats.upb.h +31 -0
  152. data/src/core/ext/upb-gen/envoy/config/metrics/v3/stats.upb_minitable.c +5 -3
  153. data/src/core/ext/upb-gen/envoy/config/overload/v3/overload.upb.h +2 -1
  154. data/src/core/ext/upb-gen/envoy/config/rbac/v3/rbac.upb.h +63 -0
  155. data/src/core/ext/upb-gen/envoy/config/rbac/v3/rbac.upb_minitable.c +12 -7
  156. data/src/core/ext/upb-gen/envoy/config/route/v3/route.upb.h +97 -81
  157. data/src/core/ext/upb-gen/envoy/config/route/v3/route.upb_minitable.c +40 -23
  158. data/src/core/ext/upb-gen/envoy/config/route/v3/route_components.upb.h +604 -228
  159. data/src/core/ext/upb-gen/envoy/config/route/v3/route_components.upb_minitable.c +146 -100
  160. data/src/core/ext/upb-gen/envoy/config/tap/v3/common.upb.h +30 -0
  161. data/src/core/ext/upb-gen/envoy/config/tap/v3/common.upb_minitable.c +5 -3
  162. data/src/core/ext/upb-gen/envoy/config/trace/v3/opentelemetry.upb.h +35 -3
  163. data/src/core/ext/upb-gen/envoy/config/trace/v3/opentelemetry.upb_minitable.c +7 -4
  164. data/src/core/ext/upb-gen/envoy/config/trace/v3/zipkin.upb.h +66 -14
  165. data/src/core/ext/upb-gen/envoy/config/trace/v3/zipkin.upb_minitable.c +22 -11
  166. data/src/core/ext/upb-gen/envoy/extensions/clusters/aggregate/v3/cluster.upb.h +87 -0
  167. data/src/core/ext/upb-gen/envoy/extensions/clusters/aggregate/v3/cluster.upb_minitable.c +29 -2
  168. data/src/core/ext/upb-gen/envoy/extensions/clusters/aggregate/v3/cluster.upb_minitable.h +2 -0
  169. data/src/core/ext/upb-gen/envoy/extensions/filters/http/rbac/v3/rbac.upb.h +0 -1
  170. data/src/core/ext/upb-gen/envoy/extensions/filters/http/rbac/v3/rbac.upb_minitable.c +0 -1
  171. data/src/core/ext/upb-gen/envoy/extensions/filters/http/stateful_session/v3/stateful_session.upb.h +20 -4
  172. data/src/core/ext/upb-gen/envoy/extensions/filters/http/stateful_session/v3/stateful_session.upb_minitable.c +5 -4
  173. data/src/core/ext/upb-gen/envoy/extensions/filters/network/http_connection_manager/v3/http_connection_manager.upb.h +239 -60
  174. data/src/core/ext/upb-gen/envoy/extensions/filters/network/http_connection_manager/v3/http_connection_manager.upb_minitable.c +59 -28
  175. data/src/core/ext/upb-gen/envoy/extensions/filters/network/http_connection_manager/v3/http_connection_manager.upb_minitable.h +2 -0
  176. data/src/core/ext/upb-gen/envoy/extensions/grpc_service/call_credentials/access_token/v3/access_token_credentials.upb.h +89 -0
  177. data/src/core/ext/upb-gen/envoy/extensions/grpc_service/call_credentials/access_token/v3/access_token_credentials.upb_minitable.c +50 -0
  178. data/src/core/ext/upb-gen/envoy/extensions/grpc_service/call_credentials/access_token/v3/access_token_credentials.upb_minitable.h +32 -0
  179. data/src/core/ext/upb-gen/envoy/extensions/grpc_service/channel_credentials/tls/v3/tls_credentials.upb.h +135 -0
  180. data/src/core/ext/upb-gen/envoy/extensions/grpc_service/channel_credentials/tls/v3/tls_credentials.upb_minitable.c +53 -0
  181. data/src/core/ext/upb-gen/envoy/extensions/grpc_service/channel_credentials/tls/v3/tls_credentials.upb_minitable.h +32 -0
  182. data/src/core/ext/upb-gen/envoy/extensions/grpc_service/channel_credentials/xds/v3/xds_credentials.upb.h +105 -0
  183. data/src/core/ext/upb-gen/envoy/extensions/grpc_service/channel_credentials/xds/v3/xds_credentials.upb_minitable.c +51 -0
  184. data/src/core/ext/upb-gen/envoy/extensions/grpc_service/channel_credentials/xds/v3/xds_credentials.upb_minitable.h +32 -0
  185. data/src/core/ext/upb-gen/envoy/extensions/load_balancing_policies/client_side_weighted_round_robin/v3/client_side_weighted_round_robin.upb.h +32 -0
  186. data/src/core/ext/upb-gen/envoy/extensions/load_balancing_policies/client_side_weighted_round_robin/v3/client_side_weighted_round_robin.upb_minitable.c +6 -3
  187. data/src/core/ext/upb-gen/envoy/extensions/load_balancing_policies/common/v3/common.upb.h +206 -0
  188. data/src/core/ext/upb-gen/envoy/extensions/load_balancing_policies/common/v3/common.upb_minitable.c +41 -8
  189. data/src/core/ext/upb-gen/envoy/extensions/load_balancing_policies/common/v3/common.upb_minitable.h +2 -0
  190. data/src/core/ext/upb-gen/envoy/extensions/transport_sockets/tls/v3/common.upb.h +64 -0
  191. data/src/core/ext/upb-gen/envoy/extensions/transport_sockets/tls/v3/common.upb_minitable.c +4 -3
  192. data/src/core/ext/upb-gen/envoy/extensions/transport_sockets/tls/v3/secret.upb.h +64 -0
  193. data/src/core/ext/upb-gen/envoy/extensions/transport_sockets/tls/v3/secret.upb_minitable.c +31 -5
  194. data/src/core/ext/upb-gen/envoy/extensions/transport_sockets/tls/v3/secret.upb_minitable.h +2 -0
  195. data/src/core/ext/upb-gen/envoy/extensions/upstreams/http/v3/http_protocol_options.upb.h +283 -14
  196. data/src/core/ext/upb-gen/envoy/extensions/upstreams/http/v3/http_protocol_options.upb_minitable.c +48 -11
  197. data/src/core/ext/upb-gen/envoy/extensions/upstreams/http/v3/http_protocol_options.upb_minitable.h +2 -0
  198. data/src/core/ext/upb-gen/envoy/type/http/v3/cookie.upb.h +144 -6
  199. data/src/core/ext/upb-gen/envoy/type/http/v3/cookie.upb_minitable.c +35 -7
  200. data/src/core/ext/upb-gen/envoy/type/http/v3/cookie.upb_minitable.h +2 -0
  201. data/src/core/ext/upb-gen/envoy/type/tracing/v3/custom_tag.upb.h +42 -21
  202. data/src/core/ext/upb-gen/envoy/type/tracing/v3/custom_tag.upb_minitable.c +9 -8
  203. data/src/core/ext/upb-gen/src/proto/grpc/channelz/v2/promise.upb.h +164 -1
  204. data/src/core/ext/upb-gen/src/proto/grpc/channelz/v2/promise.upb_minitable.c +37 -6
  205. data/src/core/ext/upb-gen/src/proto/grpc/channelz/v2/promise.upb_minitable.h +2 -0
  206. data/src/core/ext/upb-gen/xds/type/matcher/v3/cel.upb.h +0 -1
  207. data/src/core/ext/upb-gen/xds/type/matcher/v3/cel.upb_minitable.c +0 -1
  208. data/src/core/ext/upb-gen/xds/type/matcher/v3/http_inputs.upb.h +0 -1
  209. data/src/core/ext/upb-gen/xds/type/matcher/v3/http_inputs.upb_minitable.c +0 -1
  210. data/src/core/ext/upb-gen/xds/type/matcher/v3/matcher.upb.h +26 -11
  211. data/src/core/ext/upb-gen/xds/type/matcher/v3/matcher.upb_minitable.c +8 -8
  212. data/src/core/ext/upb-gen/xds/type/matcher/v3/string.upb.h +33 -0
  213. data/src/core/ext/upb-gen/xds/type/matcher/v3/string.upb_minitable.c +14 -3
  214. data/src/core/ext/upb-gen/xds/type/v3/cel.upb.h +90 -10
  215. data/src/core/ext/upb-gen/xds/type/v3/cel.upb_minitable.c +18 -7
  216. data/src/core/ext/upbdefs-gen/cel/expr/checked.upbdefs.c +248 -0
  217. data/src/core/ext/upbdefs-gen/cel/expr/checked.upbdefs.h +97 -0
  218. data/src/core/ext/upbdefs-gen/cel/expr/syntax.upbdefs.c +283 -0
  219. data/src/core/ext/upbdefs-gen/cel/expr/syntax.upbdefs.h +107 -0
  220. data/src/core/ext/upbdefs-gen/envoy/config/accesslog/v3/accesslog.upbdefs.c +213 -211
  221. data/src/core/ext/upbdefs-gen/envoy/config/bootstrap/v3/bootstrap.upbdefs.c +635 -614
  222. data/src/core/ext/upbdefs-gen/envoy/config/cluster/v3/cluster.upbdefs.c +1012 -1000
  223. data/src/core/ext/upbdefs-gen/envoy/config/common/matcher/v3/matcher.upbdefs.c +276 -273
  224. data/src/core/ext/upbdefs-gen/envoy/config/common/mutation_rules/v3/mutation_rules.upbdefs.c +152 -0
  225. data/src/core/ext/upbdefs-gen/envoy/config/common/mutation_rules/v3/mutation_rules.upbdefs.h +47 -0
  226. data/src/core/ext/upbdefs-gen/envoy/config/core/v3/address.upbdefs.c +149 -144
  227. data/src/core/ext/upbdefs-gen/envoy/config/core/v3/base.upbdefs.c +367 -370
  228. data/src/core/ext/upbdefs-gen/envoy/config/core/v3/cel.upbdefs.c +63 -0
  229. data/src/core/ext/upbdefs-gen/envoy/config/core/v3/cel.upbdefs.h +37 -0
  230. data/src/core/ext/upbdefs-gen/envoy/config/core/v3/grpc_service.upbdefs.c +297 -284
  231. data/src/core/ext/upbdefs-gen/envoy/config/core/v3/protocol.upbdefs.c +492 -469
  232. data/src/core/ext/upbdefs-gen/envoy/config/core/v3/proxy_protocol.upbdefs.c +74 -43
  233. data/src/core/ext/upbdefs-gen/envoy/config/core/v3/proxy_protocol.upbdefs.h +10 -0
  234. data/src/core/ext/upbdefs-gen/envoy/config/core/v3/substitution_format_string.upbdefs.c +60 -59
  235. data/src/core/ext/upbdefs-gen/envoy/config/endpoint/v3/endpoint_components.upbdefs.c +202 -184
  236. data/src/core/ext/upbdefs-gen/envoy/config/endpoint/v3/endpoint_components.upbdefs.h +5 -0
  237. data/src/core/ext/upbdefs-gen/envoy/config/listener/v3/listener.upbdefs.c +354 -339
  238. data/src/core/ext/upbdefs-gen/envoy/config/listener/v3/listener.upbdefs.h +5 -0
  239. data/src/core/ext/upbdefs-gen/envoy/config/listener/v3/quic_config.upbdefs.c +28 -19
  240. data/src/core/ext/upbdefs-gen/envoy/config/metrics/v3/metrics_service.upbdefs.c +30 -27
  241. data/src/core/ext/upbdefs-gen/envoy/config/metrics/v3/stats.upbdefs.c +71 -66
  242. data/src/core/ext/upbdefs-gen/envoy/config/overload/v3/overload.upbdefs.c +94 -91
  243. data/src/core/ext/upbdefs-gen/envoy/config/rbac/v3/rbac.upbdefs.c +386 -369
  244. data/src/core/ext/upbdefs-gen/envoy/config/route/v3/route.upbdefs.c +60 -57
  245. data/src/core/ext/upbdefs-gen/envoy/config/route/v3/route_components.upbdefs.c +1974 -1884
  246. data/src/core/ext/upbdefs-gen/envoy/config/tap/v3/common.upbdefs.c +119 -112
  247. data/src/core/ext/upbdefs-gen/envoy/config/trace/v3/opentelemetry.upbdefs.c +62 -51
  248. data/src/core/ext/upbdefs-gen/envoy/config/trace/v3/zipkin.upbdefs.c +109 -88
  249. data/src/core/ext/upbdefs-gen/envoy/extensions/clusters/aggregate/v3/cluster.upbdefs.c +54 -36
  250. data/src/core/ext/upbdefs-gen/envoy/extensions/clusters/aggregate/v3/cluster.upbdefs.h +5 -0
  251. data/src/core/ext/upbdefs-gen/envoy/extensions/filters/http/rbac/v3/rbac.upbdefs.c +78 -84
  252. data/src/core/ext/upbdefs-gen/envoy/extensions/filters/http/stateful_session/v3/stateful_session.upbdefs.c +48 -46
  253. data/src/core/ext/upbdefs-gen/envoy/extensions/filters/network/http_connection_manager/v3/http_connection_manager.upbdefs.c +1041 -984
  254. data/src/core/ext/upbdefs-gen/envoy/extensions/filters/network/http_connection_manager/v3/http_connection_manager.upbdefs.h +5 -0
  255. data/src/core/ext/upbdefs-gen/envoy/extensions/transport_sockets/tls/v3/common.upbdefs.c +304 -290
  256. data/src/core/ext/upbdefs-gen/envoy/extensions/transport_sockets/tls/v3/secret.upbdefs.c +94 -77
  257. data/src/core/ext/upbdefs-gen/envoy/extensions/transport_sockets/tls/v3/secret.upbdefs.h +5 -0
  258. data/src/core/ext/upbdefs-gen/envoy/extensions/upstreams/http/v3/http_protocol_options.upbdefs.c +246 -193
  259. data/src/core/ext/upbdefs-gen/envoy/extensions/upstreams/http/v3/http_protocol_options.upbdefs.h +5 -0
  260. data/src/core/ext/upbdefs-gen/envoy/type/http/v3/cookie.upbdefs.c +37 -23
  261. data/src/core/ext/upbdefs-gen/envoy/type/http/v3/cookie.upbdefs.h +5 -0
  262. data/src/core/ext/upbdefs-gen/envoy/type/tracing/v3/custom_tag.upbdefs.c +5 -3
  263. data/src/core/ext/upbdefs-gen/google/api/http.upbdefs.c +4 -4
  264. data/src/core/ext/upbdefs-gen/google/api/httpbody.upbdefs.c +4 -5
  265. data/src/core/ext/upbdefs-gen/src/proto/grpc/channelz/v2/promise.upbdefs.c +113 -87
  266. data/src/core/ext/upbdefs-gen/src/proto/grpc/channelz/v2/promise.upbdefs.h +5 -0
  267. data/src/core/ext/upbdefs-gen/udpa/annotations/migrate.upbdefs.c +5 -5
  268. data/src/core/ext/upbdefs-gen/udpa/annotations/security.upbdefs.c +6 -5
  269. data/src/core/ext/upbdefs-gen/udpa/annotations/sensitive.upbdefs.c +5 -5
  270. data/src/core/ext/upbdefs-gen/udpa/annotations/status.upbdefs.c +5 -5
  271. data/src/core/ext/upbdefs-gen/udpa/annotations/versioning.upbdefs.c +5 -5
  272. data/src/core/ext/upbdefs-gen/xds/type/matcher/v3/cel.upbdefs.c +25 -30
  273. data/src/core/ext/upbdefs-gen/xds/type/matcher/v3/http_inputs.upbdefs.c +14 -20
  274. data/src/core/ext/upbdefs-gen/xds/type/matcher/v3/matcher.upbdefs.c +180 -183
  275. data/src/core/ext/upbdefs-gen/xds/type/matcher/v3/string.upbdefs.c +56 -47
  276. data/src/core/ext/upbdefs-gen/xds/type/v3/cel.upbdefs.c +69 -47
  277. data/src/core/filter/filter_chain.h +95 -0
  278. data/src/core/handshaker/http_connect/{http_connect_handshaker.cc → http_connect_client_handshaker.cc} +32 -31
  279. data/src/core/handshaker/http_connect/{http_connect_handshaker.h → http_connect_client_handshaker.h} +4 -4
  280. data/src/core/handshaker/http_connect/http_proxy_mapper.cc +1 -1
  281. data/src/core/handshaker/http_connect/xds_http_proxy_mapper.cc +1 -1
  282. data/src/core/handshaker/security/pipelined_secure_endpoint.cc +14 -13
  283. data/src/core/handshaker/security/secure_endpoint.cc +282 -68
  284. data/src/core/handshaker/security/secure_endpoint.h +0 -7
  285. data/src/core/lib/channel/channel_args.h +1 -1
  286. data/src/core/lib/channel/promise_based_filter.cc +17 -4
  287. data/src/core/lib/channel/promise_based_filter.h +3 -2
  288. data/src/core/lib/debug/trace_flags.cc +2 -0
  289. data/src/core/lib/debug/trace_flags.h +1 -0
  290. data/src/core/lib/event_engine/cf_engine/cfstream_endpoint.cc +35 -8
  291. data/src/core/lib/event_engine/cf_engine/dns_service_resolver.h +1 -2
  292. data/src/core/lib/event_engine/event_engine.cc +9 -0
  293. data/src/core/lib/event_engine/extensions/tcp_trace.h +0 -3
  294. data/src/core/lib/event_engine/posix_engine/ev_poll_posix.cc +2 -2
  295. data/src/core/lib/event_engine/posix_engine/posix_endpoint.h +1 -1
  296. data/src/core/lib/event_engine/posix_engine/posix_engine.cc +34 -9
  297. data/src/core/lib/event_engine/posix_engine/posix_engine.h +24 -2
  298. data/src/core/lib/event_engine/posix_engine/posix_engine_listener.cc +1 -3
  299. data/src/core/lib/event_engine/posix_engine/posix_engine_listener_utils.cc +141 -14
  300. data/src/core/lib/event_engine/posix_engine/posix_engine_listener_utils.h +19 -2
  301. data/src/core/lib/event_engine/posix_engine/posix_interface.h +7 -0
  302. data/src/core/lib/event_engine/posix_engine/posix_interface_posix.cc +21 -3
  303. data/src/core/lib/event_engine/posix_engine/posix_interface_windows.cc +16 -0
  304. data/src/core/lib/experiments/experiments.cc +309 -201
  305. data/src/core/lib/experiments/experiments.h +141 -80
  306. data/src/core/lib/iomgr/event_engine_shims/endpoint.cc +2 -2
  307. data/src/core/lib/iomgr/resolve_address.h +0 -2
  308. data/src/core/lib/iomgr/resolved_address.h +0 -2
  309. data/src/core/lib/iomgr/tcp_posix.cc +13 -5
  310. data/src/core/lib/iomgr/tcp_server.cc +0 -5
  311. data/src/core/lib/iomgr/tcp_server.h +0 -7
  312. data/src/core/lib/iomgr/tcp_server_posix.cc +0 -17
  313. data/src/core/lib/iomgr/tcp_server_utils_posix.h +0 -3
  314. data/src/core/lib/iomgr/tcp_server_windows.cc +12 -51
  315. data/src/core/lib/promise/all_ok.h +17 -12
  316. data/src/core/lib/promise/cancel_callback.h +12 -13
  317. data/src/core/lib/promise/detail/join_state.h +626 -0
  318. data/src/core/lib/promise/detail/promise_factory.h +14 -14
  319. data/src/core/lib/promise/for_each.h +32 -8
  320. data/src/core/lib/promise/if.h +9 -7
  321. data/src/core/lib/promise/loop.h +18 -16
  322. data/src/core/lib/promise/map.h +54 -47
  323. data/src/core/lib/promise/mpsc.h +11 -10
  324. data/src/core/lib/promise/observable.h +6 -6
  325. data/src/core/lib/promise/party.h +25 -19
  326. data/src/core/lib/promise/poll.h +5 -5
  327. data/src/core/lib/promise/prioritized_race.h +10 -7
  328. data/src/core/lib/promise/promise.h +16 -11
  329. data/src/core/lib/promise/race.h +6 -5
  330. data/src/core/lib/promise/seq.h +109 -74
  331. data/src/core/lib/promise/try_join.h +14 -6
  332. data/src/core/lib/promise/try_seq.h +76 -60
  333. data/src/core/lib/resource_quota/api.cc +7 -0
  334. data/src/core/lib/resource_quota/arena.h +1 -1
  335. data/src/core/lib/resource_quota/memory_quota.cc +4 -1
  336. data/src/core/lib/resource_quota/resource_quota.cc +2 -1
  337. data/src/core/lib/resource_quota/resource_quota.h +3 -0
  338. data/src/core/lib/resource_quota/stream_quota.cc +77 -1
  339. data/src/core/lib/resource_quota/stream_quota.h +64 -1
  340. data/src/core/lib/resource_quota/telemetry.h +1 -1
  341. data/src/core/lib/surface/call.cc +13 -0
  342. data/src/core/lib/surface/call_utils.h +58 -43
  343. data/src/core/lib/surface/channel.h +1 -4
  344. data/src/core/lib/surface/completion_queue.cc +13 -6
  345. data/src/core/lib/surface/validate_metadata.cc +20 -15
  346. data/src/core/lib/surface/validate_metadata.h +3 -1
  347. data/src/core/lib/surface/version.cc +2 -2
  348. data/src/core/lib/transport/promise_endpoint.cc +1 -1
  349. data/src/core/lib/transport/promise_endpoint.h +1 -1
  350. data/src/core/lib/transport/transport.h +5 -0
  351. data/src/core/load_balancing/health_check_client.cc +1 -15
  352. data/src/core/load_balancing/health_check_client_internal.h +0 -2
  353. data/src/core/load_balancing/oob_backend_metric.cc +1 -5
  354. data/src/core/load_balancing/oob_backend_metric_internal.h +0 -1
  355. data/src/core/load_balancing/xds/xds_cluster_impl.cc +12 -9
  356. data/src/core/plugin_registry/grpc_plugin_registry.cc +3 -2
  357. data/src/core/resolver/xds/xds_resolver.cc +162 -116
  358. data/src/core/server/server.cc +18 -1
  359. data/src/core/server/server.h +2 -0
  360. data/src/core/server/xds_server_config_fetcher.cc +4 -4
  361. data/src/core/telemetry/call_tracer.cc +87 -2
  362. data/src/core/telemetry/call_tracer.h +46 -8
  363. data/src/core/telemetry/instrument.cc +102 -40
  364. data/src/core/telemetry/instrument.h +246 -65
  365. data/src/core/tsi/fake_transport_security.cc +3 -1
  366. data/src/core/tsi/ssl_transport_security.cc +516 -137
  367. data/src/core/tsi/ssl_transport_security.h +28 -22
  368. data/src/core/tsi/ssl_transport_security_utils.cc +2 -2
  369. data/src/core/tsi/ssl_transport_security_utils.h +2 -2
  370. data/src/core/util/bitset.h +6 -0
  371. data/src/core/util/function_signature.h +3 -1
  372. data/src/core/util/http_client/httpcli_security_connector.cc +2 -1
  373. data/src/core/util/json/json_reader.cc +0 -4
  374. data/src/core/xds/grpc/certificate_provider_store.cc +2 -1
  375. data/src/core/xds/grpc/certificate_provider_store.h +3 -17
  376. data/src/core/xds/grpc/certificate_provider_store_interface.h +61 -0
  377. data/src/core/xds/grpc/xds_bootstrap_grpc.cc +48 -0
  378. data/src/core/xds/grpc/xds_bootstrap_grpc.h +18 -0
  379. data/src/core/xds/grpc/xds_certificate_provider.cc +7 -2
  380. data/src/core/xds/grpc/xds_certificate_provider.h +13 -2
  381. data/src/core/xds/grpc/xds_client_grpc.cc +13 -6
  382. data/src/core/xds/grpc/xds_client_grpc.h +10 -7
  383. data/src/core/xds/grpc/xds_cluster.cc +18 -4
  384. data/src/core/xds/grpc/xds_cluster.h +17 -2
  385. data/src/core/xds/grpc/xds_cluster_parser.cc +36 -11
  386. data/src/core/xds/grpc/xds_common_types.cc +45 -0
  387. data/src/core/xds/grpc/xds_common_types.h +31 -0
  388. data/src/core/xds/grpc/xds_common_types_parser.cc +274 -16
  389. data/src/core/xds/grpc/xds_common_types_parser.h +12 -0
  390. data/src/core/xds/grpc/xds_http_fault_filter.cc +128 -24
  391. data/src/core/xds/grpc/xds_http_fault_filter.h +19 -10
  392. data/src/core/xds/grpc/xds_http_filter.cc +38 -0
  393. data/src/core/xds/grpc/xds_http_filter.h +70 -47
  394. data/src/core/xds/grpc/xds_http_filter_registry.cc +48 -14
  395. data/src/core/xds/grpc/xds_http_filter_registry.h +29 -15
  396. data/src/core/xds/grpc/xds_http_gcp_authn_filter.cc +88 -22
  397. data/src/core/xds/grpc/xds_http_gcp_authn_filter.h +22 -11
  398. data/src/core/xds/grpc/xds_http_rbac_filter.cc +36 -20
  399. data/src/core/xds/grpc/xds_http_rbac_filter.h +19 -10
  400. data/src/core/xds/grpc/xds_http_stateful_session_filter.cc +143 -26
  401. data/src/core/xds/grpc/xds_http_stateful_session_filter.h +19 -10
  402. data/src/core/xds/grpc/xds_listener.cc +4 -1
  403. data/src/core/xds/grpc/xds_listener.h +10 -2
  404. data/src/core/xds/grpc/xds_listener_parser.cc +23 -18
  405. data/src/core/xds/grpc/xds_matcher.cc +40 -5
  406. data/src/core/xds/grpc/xds_matcher.h +13 -0
  407. data/src/core/xds/grpc/xds_matcher_action.h +1 -1
  408. data/src/core/xds/grpc/xds_matcher_parse.cc +60 -40
  409. data/src/core/xds/grpc/xds_matcher_parse.h +2 -1
  410. data/src/core/xds/grpc/xds_route_config.cc +12 -1
  411. data/src/core/xds/grpc/xds_route_config.h +15 -2
  412. data/src/core/xds/grpc/xds_route_config_parser.cc +11 -5
  413. data/src/core/xds/grpc/xds_routing.cc +181 -6
  414. data/src/core/xds/grpc/xds_routing.h +57 -0
  415. data/src/core/xds/grpc/xds_server_grpc.cc +55 -43
  416. data/src/core/xds/grpc/xds_server_grpc.h +13 -6
  417. data/src/core/xds/grpc/xds_server_grpc_interface.h +3 -2
  418. data/src/core/xds/grpc/xds_transport_grpc.cc +12 -6
  419. data/src/core/xds/grpc/xds_transport_grpc.h +5 -1
  420. data/src/ruby/ext/grpc/rb_grpc_imports.generated.c +12 -8
  421. data/src/ruby/ext/grpc/rb_grpc_imports.generated.h +18 -12
  422. data/src/ruby/lib/grpc/grpc.rb +7 -9
  423. data/src/ruby/lib/grpc/version.rb +1 -1
  424. data/src/ruby/pb/generate_proto_ruby.sh +1 -1
  425. data/src/ruby/spec/client_server_spec.rb +1 -1
  426. data/src/ruby/spec/generic/rpc_server_pool_spec.rb +1 -1
  427. data/src/ruby/spec/generic/rpc_server_spec.rb +3 -4
  428. data/src/ruby/spec/spec_helper.rb +1 -1
  429. metadata +64 -14
  430. data/src/core/ext/transport/chttp2/transport/security_frame.cc +0 -31
  431. data/src/core/handshaker/security/legacy_secure_endpoint.cc +0 -597
@@ -275,7 +275,7 @@ class ClientChannel::SubchannelWrapper::WatcherWrapper
275
275
  << subchannel_wrapper_->subchannel_.get()
276
276
  << " watcher=" << watcher_.get()
277
277
  << " state=" << ConnectivityStateName(state) << " status=" << status;
278
- if (!IsTransportStateWatcherEnabled()) {
278
+ if (!IsSubchannelConnectionScalingEnabled()) {
279
279
  auto keepalive_throttling = status.GetPayload(kKeepaliveThrottlingKey);
280
280
  if (keepalive_throttling.has_value()) {
281
281
  int new_keepalive_time_ms = -1;
@@ -679,7 +679,7 @@ ClientChannel::ClientChannel(
679
679
  client_channel_factory_(client_channel_factory),
680
680
  channelz_node_(channel_args_.GetObject<channelz::ChannelNode>()),
681
681
  idle_timeout_(GetClientIdleTimeout(channel_args_)),
682
- resolver_data_for_calls_(ResolverDataForCalls{}),
682
+ resolver_data_for_calls_(nullptr),
683
683
  picker_(nullptr),
684
684
  call_destination_(
685
685
  call_destination_factory->CreateCallDestination(picker_)),
@@ -906,6 +906,72 @@ grpc_call* ClientChannel::CreateCall(
906
906
  compression_options(), std::move(arena), Ref());
907
907
  }
908
908
 
909
+ namespace {
910
+
911
+ class FilterChainImpl final : public FilterChain {
912
+ public:
913
+ explicit FilterChainImpl(RefCountedPtr<UnstartedCallDestination> destination)
914
+ : destination_(std::move(destination)) {}
915
+
916
+ UnstartedCallDestination* destination() const { return destination_.get(); }
917
+
918
+ private:
919
+ RefCountedPtr<UnstartedCallDestination> destination_;
920
+ };
921
+
922
+ class FilterChainBuilderImpl final : public FilterChainBuilder {
923
+ public:
924
+ FilterChainBuilderImpl(
925
+ bool enable_retries, const ChannelArgs& channel_args,
926
+ Blackboard* blackboard,
927
+ std::function<void(ServerMetadata&)> on_server_trailing_metadata,
928
+ RefCountedPtr<UnstartedCallDestination> destination)
929
+ : enable_retries_(enable_retries),
930
+ channel_args_(channel_args),
931
+ blackboard_(blackboard),
932
+ on_server_trailing_metadata_(std::move(on_server_trailing_metadata)),
933
+ destination_(std::move(destination)) {}
934
+
935
+ absl::StatusOr<RefCountedPtr<FilterChain>> Build() override {
936
+ if (builder_ == nullptr) InitBuilder();
937
+ if (enable_retries_) builder_->Add<RetryInterceptor>(nullptr);
938
+ auto top_of_stack_destination = builder_->Build(destination_);
939
+ if (!top_of_stack_destination.ok()) {
940
+ return MaybeRewriteIllegalStatusCode(top_of_stack_destination.status(),
941
+ "channel construction");
942
+ }
943
+ builder_.reset();
944
+ return MakeRefCounted<FilterChainImpl>(
945
+ std::move(*top_of_stack_destination));
946
+ }
947
+
948
+ private:
949
+ void AddFilter(const FilterHandle& filter_handle,
950
+ RefCountedPtr<const FilterConfig> config) override {
951
+ if (builder_ == nullptr) InitBuilder();
952
+ filter_handle.AddToBuilder(builder_.get(), std::move(config));
953
+ }
954
+
955
+ void InitBuilder() {
956
+ builder_ =
957
+ std::make_unique<InterceptionChainBuilder>(channel_args_, blackboard_);
958
+ if (on_server_trailing_metadata_ != nullptr) {
959
+ builder_->AddOnServerTrailingMetadata(on_server_trailing_metadata_);
960
+ }
961
+ CoreConfiguration::Get().channel_init().AddToInterceptionChainBuilder(
962
+ GRPC_CLIENT_CHANNEL, *builder_);
963
+ }
964
+
965
+ const bool enable_retries_;
966
+ const ChannelArgs channel_args_;
967
+ const Blackboard* blackboard_;
968
+ const std::function<void(ServerMetadata&)> on_server_trailing_metadata_;
969
+ const RefCountedPtr<UnstartedCallDestination> destination_;
970
+ std::unique_ptr<InterceptionChainBuilder> builder_;
971
+ };
972
+
973
+ } // namespace
974
+
909
975
  void ClientChannel::StartCall(UnstartedCallHandler unstarted_handler) {
910
976
  // Increment call count.
911
977
  if (idle_timeout_ != Duration::Zero()) idle_state_.IncreaseCallCount();
@@ -924,31 +990,32 @@ void ClientChannel::StartCall(UnstartedCallHandler unstarted_handler) {
924
990
  // Wait for the resolver result.
925
991
  CheckDelayed(self->resolver_data_for_calls_.NextWhen(
926
992
  [wait_for_ready](
927
- const absl::StatusOr<ResolverDataForCalls> result) {
993
+ const absl::StatusOr<RefCountedPtr<ConfigSelector>>
994
+ config_selector) {
928
995
  bool got_result = false;
929
996
  // If the resolver reports an error but the call is
930
997
  // wait_for_ready, keep waiting for the next result
931
998
  // instead of failing the call.
932
- if (!result.ok()) {
999
+ if (!config_selector.ok()) {
933
1000
  got_result = !wait_for_ready;
934
1001
  } else {
935
1002
  // Not an error. Make sure we actually have a result.
936
- got_result = result->config_selector != nullptr;
1003
+ got_result = *config_selector != nullptr;
937
1004
  }
938
1005
  return got_result;
939
1006
  })),
940
1007
  // Handle resolver result.
941
1008
  [self, unstarted_handler](
942
- std::tuple<absl::StatusOr<ResolverDataForCalls>, bool>
1009
+ std::tuple<absl::StatusOr<RefCountedPtr<ConfigSelector>>, bool>
943
1010
  result_and_delayed) mutable {
944
- auto& resolver_data = std::get<0>(result_and_delayed);
945
- const bool was_queued = std::get<1>(result_and_delayed);
946
- if (!resolver_data.ok()) return resolver_data.status();
1011
+ auto& [config_selector, was_queued] = result_and_delayed;
1012
+ if (!config_selector.ok()) return config_selector.status();
947
1013
  // Apply service config to call.
948
- absl::Status status = self->ApplyServiceConfigToCall(
949
- *resolver_data->config_selector,
950
- unstarted_handler.UnprocessedClientInitialMetadata());
951
- if (!status.ok()) return status;
1014
+ absl::StatusOr<RefCountedPtr<const FilterChain>> filter_chain =
1015
+ self->ApplyServiceConfigToCall(
1016
+ **config_selector,
1017
+ unstarted_handler.UnprocessedClientInitialMetadata());
1018
+ if (!filter_chain.ok()) return filter_chain.status();
952
1019
  // If the call was queued, add trace annotation.
953
1020
  if (was_queued) {
954
1021
  auto* call_tracer = MaybeGetContext<CallSpan>();
@@ -959,8 +1026,10 @@ void ClientChannel::StartCall(UnstartedCallHandler unstarted_handler) {
959
1026
  }
960
1027
  // Start the call on the destination provided by the
961
1028
  // resolver.
962
- resolver_data->call_destination->StartCall(
963
- std::move(unstarted_handler));
1029
+ auto destination =
1030
+ DownCast<const FilterChainImpl*>(filter_chain->get())
1031
+ ->destination();
1032
+ destination->StartCall(std::move(unstarted_handler));
964
1033
  return absl::OkStatus();
965
1034
  });
966
1035
  });
@@ -992,7 +1061,7 @@ void ClientChannel::DestroyResolverAndLbPolicyLocked() {
992
1061
  resolver_.reset();
993
1062
  saved_service_config_.reset();
994
1063
  saved_config_selector_.reset();
995
- resolver_data_for_calls_.Set(ResolverDataForCalls{nullptr, nullptr});
1064
+ resolver_data_for_calls_.Set(nullptr);
996
1065
  // Clear LB policy if set.
997
1066
  if (lb_policy_ != nullptr) {
998
1067
  GRPC_TRACE_LOG(client_channel, INFO)
@@ -1324,35 +1393,26 @@ void ClientChannel::UpdateServiceConfigInDataPlaneLocked(
1324
1393
  ChannelArgs new_args = args.SetObject(this).SetObject(saved_service_config_);
1325
1394
  // Construct filter stack.
1326
1395
  auto new_blackboard = MakeRefCounted<Blackboard>();
1327
- InterceptionChainBuilder builder(new_args, new_blackboard.get());
1328
- if (idle_timeout_ != Duration::Zero()) {
1329
- builder.AddOnServerTrailingMetadata([this](ServerMetadata&) {
1330
- if (idle_state_.DecreaseCallCount()) StartIdleTimer();
1331
- });
1332
- }
1333
- CoreConfiguration::Get().channel_init().AddToInterceptionChainBuilder(
1334
- GRPC_CLIENT_CHANNEL, builder);
1335
- // Add filters returned by the config selector (e.g., xDS HTTP filters).
1336
- config_selector->AddFilters(builder, blackboard_.get(), new_blackboard.get());
1337
1396
  const bool enable_retries =
1338
1397
  !channel_args_.WantMinimalStack() &&
1339
1398
  channel_args_.GetBool(GRPC_ARG_ENABLE_RETRIES).value_or(true);
1340
1399
  if (enable_retries) {
1341
1400
  RetryInterceptor::UpdateBlackboard(*saved_service_config_,
1342
1401
  blackboard_.get(), new_blackboard.get());
1343
- builder.Add<RetryInterceptor>(nullptr);
1344
1402
  }
1345
- blackboard_ = std::move(new_blackboard);
1346
- // Create call destination.
1347
- auto top_of_stack_call_destination = builder.Build(call_destination_);
1348
- // Send result to data plane.
1349
- if (!top_of_stack_call_destination.ok()) {
1350
- resolver_data_for_calls_.Set(MaybeRewriteIllegalStatusCode(
1351
- top_of_stack_call_destination.status(), "channel construction"));
1352
- } else {
1353
- resolver_data_for_calls_.Set(ResolverDataForCalls{
1354
- std::move(config_selector), std::move(*top_of_stack_call_destination)});
1403
+ std::function<void(ServerMetadata&)> on_server_trailing_metadata;
1404
+ if (idle_timeout_ != Duration::Zero()) {
1405
+ on_server_trailing_metadata = [this](ServerMetadata&) {
1406
+ if (idle_state_.DecreaseCallCount()) StartIdleTimer();
1407
+ };
1355
1408
  }
1409
+ FilterChainBuilderImpl filter_chain_builder(
1410
+ enable_retries, new_args, new_blackboard.get(),
1411
+ std::move(on_server_trailing_metadata), call_destination_);
1412
+ config_selector->BuildFilterChains(filter_chain_builder, blackboard_.get(),
1413
+ new_blackboard.get());
1414
+ blackboard_ = std::move(new_blackboard);
1415
+ resolver_data_for_calls_.Set(std::move(config_selector));
1356
1416
  }
1357
1417
 
1358
1418
  void ClientChannel::UpdateStateLocked(grpc_connectivity_state state,
@@ -1423,7 +1483,8 @@ void ClientChannel::StartIdleTimer() {
1423
1483
  std::move(arena)));
1424
1484
  }
1425
1485
 
1426
- absl::Status ClientChannel::ApplyServiceConfigToCall(
1486
+ absl::StatusOr<RefCountedPtr<const FilterChain>>
1487
+ ClientChannel::ApplyServiceConfigToCall(
1427
1488
  ConfigSelector& config_selector,
1428
1489
  ClientMetadata& client_initial_metadata) const {
1429
1490
  GRPC_TRACE_LOG(client_channel_call, INFO)
@@ -1438,11 +1499,12 @@ absl::Status ClientChannel::ApplyServiceConfigToCall(
1438
1499
  GetContext<Arena>()->New<ClientChannelServiceConfigCallData>(
1439
1500
  GetContext<Arena>());
1440
1501
  // Use the ConfigSelector to determine the config for the call.
1441
- absl::Status call_config_status = config_selector.GetCallConfig(
1442
- {&client_initial_metadata, GetContext<Arena>(),
1443
- service_config_call_data});
1444
- if (!call_config_status.ok()) {
1445
- return MaybeRewriteIllegalStatusCode(call_config_status, "ConfigSelector");
1502
+ auto filter_chain = config_selector.GetCallConfig({&client_initial_metadata,
1503
+ GetContext<Arena>(),
1504
+ service_config_call_data});
1505
+ if (!filter_chain.ok()) {
1506
+ return MaybeRewriteIllegalStatusCode(filter_chain.status(),
1507
+ "ConfigSelector");
1446
1508
  }
1447
1509
  // Apply our own method params to the call.
1448
1510
  auto* method_params = DownCast<ClientChannelMethodParsedConfig*>(
@@ -1467,7 +1529,7 @@ absl::Status ClientChannel::ApplyServiceConfigToCall(
1467
1529
  wait_for_ready->value = method_params->wait_for_ready().value();
1468
1530
  }
1469
1531
  }
1470
- return absl::OkStatus();
1532
+ return filter_chain;
1471
1533
  }
1472
1534
 
1473
1535
  } // namespace grpc_core
@@ -166,7 +166,7 @@ class ClientChannel : public Channel {
166
166
 
167
167
  // Applies service config settings from config_selector to the call.
168
168
  // May modify call context and client_initial_metadata.
169
- absl::Status ApplyServiceConfigToCall(
169
+ absl::StatusOr<RefCountedPtr<const FilterChain>> ApplyServiceConfigToCall(
170
170
  ConfigSelector& config_selector,
171
171
  ClientMetadata& client_initial_metadata) const;
172
172
 
@@ -192,11 +192,8 @@ class ClientChannel : public Channel {
192
192
  //
193
193
  // Fields related to name resolution.
194
194
  //
195
- struct ResolverDataForCalls {
196
- RefCountedPtr<ConfigSelector> config_selector;
197
- RefCountedPtr<UnstartedCallDestination> call_destination;
198
- };
199
- Observable<absl::StatusOr<ResolverDataForCalls>> resolver_data_for_calls_;
195
+ Observable<absl::StatusOr<RefCountedPtr<ConfigSelector>>>
196
+ resolver_data_for_calls_;
200
197
 
201
198
  //
202
199
  // Fields related to LB picks.
@@ -217,7 +217,7 @@ class ClientChannelFilter::CallData {
217
217
  grpc_closure* original_recv_trailing_metadata_ready_ = nullptr;
218
218
  grpc_closure recv_trailing_metadata_ready_;
219
219
 
220
- RefCountedPtr<DynamicFilters> dynamic_filters_;
220
+ RefCountedPtr<const DynamicFilters> dynamic_filters_;
221
221
  RefCountedPtr<DynamicFilters::Call> dynamic_call_;
222
222
 
223
223
  BufferedCall buffered_call_;
@@ -300,7 +300,7 @@ class DynamicTerminationFilter::CallData final {
300
300
  const grpc_call_final_info* /*final_info*/,
301
301
  grpc_closure* then_schedule_closure) {
302
302
  auto* calld = static_cast<CallData*>(elem->call_data);
303
- RefCountedPtr<SubchannelCall> subchannel_call;
303
+ RefCountedPtr<Subchannel::Call> subchannel_call;
304
304
  if (GPR_LIKELY(calld->lb_call_ != nullptr)) {
305
305
  subchannel_call = calld->lb_call_->subchannel_call();
306
306
  }
@@ -504,8 +504,13 @@ class ClientChannelFilter::SubchannelWrapper final
504
504
  watcher_map_.erase(it);
505
505
  }
506
506
 
507
- RefCountedPtr<ConnectedSubchannel> connected_subchannel() const {
508
- return subchannel_->connected_subchannel();
507
+ absl::Status Ping(grpc_closure* on_initiate, grpc_closure* on_ack) {
508
+ return subchannel_->Ping(on_initiate, on_ack);
509
+ }
510
+
511
+ RefCountedPtr<Subchannel::Call> CreateCall(Subchannel::CreateCallArgs args,
512
+ grpc_error_handle* error) {
513
+ return subchannel_->CreateCall(args, error);
509
514
  }
510
515
 
511
516
  void RequestConnection() override { subchannel_->RequestConnection(); }
@@ -599,7 +604,7 @@ class ClientChannelFilter::SubchannelWrapper final
599
604
  << parent_.get() << " subchannel " << parent_->subchannel_.get()
600
605
  << " watcher=" << watcher_.get()
601
606
  << " state=" << ConnectivityStateName(state) << " status=" << status;
602
- if (!IsTransportStateWatcherEnabled()) {
607
+ if (!IsSubchannelConnectionScalingEnabled()) {
603
608
  auto keepalive_throttling = status.GetPayload(kKeepaliveThrottlingKey);
604
609
  if (keepalive_throttling.has_value()) {
605
610
  int new_keepalive_time_ms = -1;
@@ -1412,6 +1417,46 @@ void ClientChannelFilter::UpdateServiceConfigInControlPlaneLocked(
1412
1417
  << saved_config_selector_.get();
1413
1418
  }
1414
1419
 
1420
+ namespace {
1421
+
1422
+ // Filter chain builder impl to inject into ConfigSelector.
1423
+ class LegacyFilterChainBuilder final : public FilterChainBuilder {
1424
+ public:
1425
+ LegacyFilterChainBuilder(bool enable_retries, const ChannelArgs& channel_args,
1426
+ const Blackboard* blackboard)
1427
+ : enable_retries_(enable_retries),
1428
+ channel_args_(channel_args),
1429
+ blackboard_(blackboard) {}
1430
+
1431
+ absl::StatusOr<RefCountedPtr<FilterChain>> Build() override {
1432
+ if (enable_retries_) {
1433
+ filters_.push_back({&RetryFilter::kFilterVtable, nullptr});
1434
+ } else {
1435
+ filters_.push_back({&DynamicTerminationFilter::kFilterVtable, nullptr});
1436
+ }
1437
+ RefCountedPtr<DynamicFilters> dynamic_filters =
1438
+ DynamicFilters::Create(channel_args_, std::move(filters_), blackboard_);
1439
+ if (dynamic_filters == nullptr) {
1440
+ return absl::InternalError("error constructing dynamic filter stack");
1441
+ }
1442
+ filters_.clear();
1443
+ return dynamic_filters;
1444
+ }
1445
+
1446
+ private:
1447
+ void AddFilter(const FilterHandle& filter_handle,
1448
+ RefCountedPtr<const FilterConfig> config) override {
1449
+ filter_handle.AddToBuilder(&filters_, std::move(config));
1450
+ }
1451
+
1452
+ const bool enable_retries_;
1453
+ const ChannelArgs channel_args_;
1454
+ const Blackboard* blackboard_;
1455
+ std::vector<FilterAndConfig> filters_;
1456
+ };
1457
+
1458
+ } // namespace
1459
+
1415
1460
  void ClientChannelFilter::UpdateServiceConfigInDataPlaneLocked(
1416
1461
  const ChannelArgs& args) {
1417
1462
  // Grab ref to service config.
@@ -1432,19 +1477,15 @@ void ClientChannelFilter::UpdateServiceConfigInDataPlaneLocked(
1432
1477
  new_args.GetBool(GRPC_ARG_ENABLE_RETRIES).value_or(true);
1433
1478
  // Construct dynamic filter stack.
1434
1479
  auto new_blackboard = MakeRefCounted<Blackboard>();
1435
- std::vector<const grpc_channel_filter*> filters =
1436
- config_selector->GetFilters(blackboard_.get(), new_blackboard.get());
1437
1480
  if (enable_retries) {
1438
1481
  RetryFilter::UpdateBlackboard(*service_config, blackboard_.get(),
1439
1482
  new_blackboard.get());
1440
- filters.push_back(&RetryFilter::kVtable);
1441
- } else {
1442
- filters.push_back(&DynamicTerminationFilter::kFilterVtable);
1443
1483
  }
1484
+ LegacyFilterChainBuilder filter_chain_builder(enable_retries, new_args,
1485
+ new_blackboard.get());
1486
+ config_selector->BuildFilterChains(filter_chain_builder, blackboard_.get(),
1487
+ new_blackboard.get());
1444
1488
  blackboard_ = std::move(new_blackboard);
1445
- RefCountedPtr<DynamicFilters> dynamic_filters =
1446
- DynamicFilters::Create(new_args, std::move(filters), blackboard_.get());
1447
- GRPC_CHECK(dynamic_filters != nullptr);
1448
1489
  // Grab data plane lock to update service config.
1449
1490
  //
1450
1491
  // We defer unreffing the old values (and deallocating memory) until
@@ -1457,7 +1498,6 @@ void ClientChannelFilter::UpdateServiceConfigInDataPlaneLocked(
1457
1498
  // Old values will be unreffed after lock is released.
1458
1499
  service_config_.swap(service_config);
1459
1500
  config_selector_.swap(config_selector);
1460
- dynamic_filters_.swap(dynamic_filters);
1461
1501
  // Re-process queued calls asynchronously.
1462
1502
  ReprocessQueuedResolverCalls();
1463
1503
  }
@@ -1495,13 +1535,11 @@ void ClientChannelFilter::DestroyResolverAndLbPolicyLocked() {
1495
1535
  // after we release the lock.
1496
1536
  RefCountedPtr<ServiceConfig> service_config_to_unref;
1497
1537
  RefCountedPtr<ConfigSelector> config_selector_to_unref;
1498
- RefCountedPtr<DynamicFilters> dynamic_filters_to_unref;
1499
1538
  {
1500
1539
  MutexLock lock(&resolution_mu_);
1501
1540
  received_service_config_data_ = false;
1502
1541
  service_config_to_unref = std::move(service_config_);
1503
1542
  config_selector_to_unref = std::move(config_selector_);
1504
- dynamic_filters_to_unref = std::move(dynamic_filters_);
1505
1543
  }
1506
1544
  // Clear LB policy if set.
1507
1545
  if (lb_policy_ != nullptr) {
@@ -1604,17 +1642,11 @@ grpc_error_handle ClientChannelFilter::DoPingLocked(grpc_transport_op* op) {
1604
1642
  // Complete pick.
1605
1643
  [op](LoadBalancingPolicy::PickResult::Complete* complete_pick)
1606
1644
  ABSL_EXCLUSIVE_LOCKS_REQUIRED(
1607
- *ClientChannelFilter::work_serializer_) {
1608
- SubchannelWrapper* subchannel = static_cast<SubchannelWrapper*>(
1609
- complete_pick->subchannel.get());
1610
- RefCountedPtr<ConnectedSubchannel> connected_subchannel =
1611
- subchannel->connected_subchannel();
1612
- if (connected_subchannel == nullptr) {
1613
- return GRPC_ERROR_CREATE("LB pick for ping not connected");
1614
- }
1615
- connected_subchannel->Ping(op->send_ping.on_initiate,
1616
- op->send_ping.on_ack);
1617
- return absl::OkStatus();
1645
+ *ClientChannelFilter::work_serializer_) -> grpc_error_handle {
1646
+ SubchannelWrapper* subchannel =
1647
+ DownCast<SubchannelWrapper*>(complete_pick->subchannel.get());
1648
+ return subchannel->Ping(op->send_ping.on_initiate,
1649
+ op->send_ping.on_ack);
1618
1650
  },
1619
1651
  // Queue pick.
1620
1652
  [](LoadBalancingPolicy::PickResult::Queue* /*queue_pick*/) {
@@ -1850,14 +1882,14 @@ grpc_error_handle ClientChannelFilter::CallData::ApplyServiceConfigToCallLocked(
1850
1882
  auto* service_config_call_data =
1851
1883
  arena_->New<ClientChannelServiceConfigCallData>(arena_);
1852
1884
  // Use the ConfigSelector to determine the config for the call.
1853
- absl::Status call_config_status =
1854
- (*config_selector)
1855
- ->GetCallConfig(
1856
- {send_initial_metadata(), arena_, service_config_call_data});
1857
- if (!call_config_status.ok()) {
1885
+ auto filter_chain = (*config_selector)
1886
+ ->GetCallConfig({send_initial_metadata(), arena_,
1887
+ service_config_call_data});
1888
+ if (!filter_chain.ok()) {
1858
1889
  return absl_status_to_grpc_error(
1859
- MaybeRewriteIllegalStatusCode(call_config_status, "ConfigSelector"));
1890
+ MaybeRewriteIllegalStatusCode(filter_chain.status(), "ConfigSelector"));
1860
1891
  }
1892
+ dynamic_filters_ = filter_chain->TakeAsSubclass<const DynamicFilters>();
1861
1893
  // Apply our own method params to the call.
1862
1894
  auto* method_params = static_cast<ClientChannelMethodParsedConfig*>(
1863
1895
  service_config_call_data->GetMethodParsedConfig(
@@ -1938,7 +1970,6 @@ bool ClientChannelFilter::CallData::CheckResolutionLocked(
1938
1970
  }
1939
1971
  // Result found.
1940
1972
  *config_selector = chand()->config_selector_;
1941
- dynamic_filters_ = chand()->dynamic_filters_;
1942
1973
  return true;
1943
1974
  }
1944
1975
 
@@ -2106,7 +2137,7 @@ void ClientChannelFilter::CallData::CreateDynamicCall() {
2106
2137
  call_start_time_, deadline_,
2107
2138
  arena_, call_combiner_};
2108
2139
  grpc_error_handle error;
2109
- DynamicFilters* channel_stack = args.channel_stack.get();
2140
+ const DynamicFilters* channel_stack = args.channel_stack.get();
2110
2141
  GRPC_TRACE_LOG(client_channel_call, INFO)
2111
2142
  << "chand=" << chand() << " calld=" << this
2112
2143
  << ": creating dynamic call stack on channel_stack=" << channel_stack;
@@ -2461,7 +2492,7 @@ ClientChannelFilter::LoadBalancedCall::PickSubchannel(bool was_queued) {
2461
2492
 
2462
2493
  bool ClientChannelFilter::LoadBalancedCall::PickSubchannelImpl(
2463
2494
  LoadBalancingPolicy::SubchannelPicker* picker, grpc_error_handle* error) {
2464
- GRPC_CHECK(connected_subchannel_ == nullptr);
2495
+ GRPC_CHECK(subchannel_call_ == nullptr);
2465
2496
  // Perform LB pick.
2466
2497
  LoadBalancingPolicy::PickArgs pick_args;
2467
2498
  Slice* path = send_initial_metadata()->get_pointer(HttpPathMetadata());
@@ -2475,7 +2506,7 @@ bool ClientChannelFilter::LoadBalancedCall::PickSubchannelImpl(
2475
2506
  return HandlePickResult<bool>(
2476
2507
  &result,
2477
2508
  // CompletePick
2478
- [this](LoadBalancingPolicy::PickResult::Complete* complete_pick) {
2509
+ [this, &error](LoadBalancingPolicy::PickResult::Complete* complete_pick) {
2479
2510
  GRPC_TRACE_LOG(client_channel_lb_call, INFO)
2480
2511
  << "chand=" << chand_ << " lb_call=" << this
2481
2512
  << ": LB pick succeeded: subchannel="
@@ -2485,12 +2516,24 @@ bool ClientChannelFilter::LoadBalancedCall::PickSubchannelImpl(
2485
2516
  // holding the data plane mutex.
2486
2517
  SubchannelWrapper* subchannel =
2487
2518
  static_cast<SubchannelWrapper*>(complete_pick->subchannel.get());
2488
- connected_subchannel_ = subchannel->connected_subchannel();
2519
+ Subchannel::CreateCallArgs call_args = {
2520
+ pollent_, /*start_time=*/0, arena_->GetContext<Call>()->deadline(),
2521
+ // TODO(roth): When we implement hedging support, we will probably
2522
+ // need to use a separate call arena for each subchannel call.
2523
+ arena_, call_combiner_};
2524
+ subchannel_call_ = subchannel->CreateCall(call_args, error);
2525
+ if (subchannel_call_ != nullptr &&
2526
+ on_call_destruction_complete_ != nullptr) {
2527
+ subchannel_call_->SetAfterCallStackDestroy(
2528
+ on_call_destruction_complete_);
2529
+ on_call_destruction_complete_ = nullptr;
2530
+ }
2531
+ if (!error->ok()) return true;
2489
2532
  // If the subchannel has no connected subchannel (e.g., if the
2490
2533
  // subchannel has moved out of state READY but the LB policy hasn't
2491
2534
  // yet seen that change and given us a new picker), then just
2492
2535
  // queue the pick. We'll try again as soon as we get a new picker.
2493
- if (connected_subchannel_ == nullptr) {
2536
+ if (subchannel_call_ == nullptr) {
2494
2537
  GRPC_TRACE_LOG(client_channel_lb_call, INFO)
2495
2538
  << "chand=" << chand_ << " lb_call=" << this
2496
2539
  << ": subchannel returned by LB picker "
@@ -2726,7 +2769,7 @@ void ClientChannelFilter::LoadBalancedCall::TryPick(bool was_queued) {
2726
2769
  buffered_call_.Fail(*result, BufferedCall::YieldCallCombiner);
2727
2770
  return;
2728
2771
  }
2729
- CreateSubchannelCall();
2772
+ StartSubchannelCall();
2730
2773
  }
2731
2774
  }
2732
2775
 
@@ -2759,32 +2802,15 @@ void ClientChannelFilter::LoadBalancedCall::RetryPickLocked() {
2759
2802
  absl::OkStatus());
2760
2803
  }
2761
2804
 
2762
- void ClientChannelFilter::LoadBalancedCall::CreateSubchannelCall() {
2763
- SubchannelCall::Args call_args = {
2764
- connected_subchannel_->Ref(), pollent_, /*start_time=*/0,
2765
- arena_->GetContext<Call>()->deadline(),
2766
- // TODO(roth): When we implement hedging support, we will probably
2767
- // need to use a separate call arena for each subchannel call.
2768
- arena_, call_combiner_};
2769
- grpc_error_handle error;
2770
- subchannel_call_ = SubchannelCall::Create(std::move(call_args), &error);
2805
+ void ClientChannelFilter::LoadBalancedCall::StartSubchannelCall() {
2771
2806
  GRPC_TRACE_LOG(client_channel_lb_call, INFO)
2772
2807
  << "chand=" << chand_ << " lb_call=" << this
2773
- << ": create subchannel_call=" << subchannel_call_.get()
2774
- << ": error=" << StatusToString(error);
2775
- if (on_call_destruction_complete_ != nullptr) {
2776
- subchannel_call_->SetAfterCallStackDestroy(on_call_destruction_complete_);
2777
- on_call_destruction_complete_ = nullptr;
2778
- }
2779
- if (GPR_UNLIKELY(!error.ok())) {
2780
- buffered_call_.Fail(error, BufferedCall::YieldCallCombiner);
2781
- } else {
2782
- buffered_call_.Resume([subchannel_call = subchannel_call_](
2783
- grpc_transport_stream_op_batch* batch) {
2784
- // Note: This will release the call combiner.
2785
- subchannel_call->StartTransportStreamOpBatch(batch);
2786
- });
2787
- }
2808
+ << ": starting subchannel_call=" << subchannel_call_.get();
2809
+ buffered_call_.Resume([subchannel_call = subchannel_call_](
2810
+ grpc_transport_stream_op_batch* batch) {
2811
+ // Note: This will release the call combiner.
2812
+ subchannel_call->StartTransportStreamOpBatch(batch);
2813
+ });
2788
2814
  }
2789
2815
 
2790
2816
  } // namespace grpc_core
@@ -276,8 +276,6 @@ class ClientChannelFilter final {
276
276
  RefCountedPtr<ServiceConfig> service_config_ ABSL_GUARDED_BY(resolution_mu_);
277
277
  RefCountedPtr<ConfigSelector> config_selector_
278
278
  ABSL_GUARDED_BY(resolution_mu_);
279
- RefCountedPtr<DynamicFilters> dynamic_filters_
280
- ABSL_GUARDED_BY(resolution_mu_);
281
279
 
282
280
  //
283
281
  // Fields related to LB picks. Guarded by lb_mu_.
@@ -369,7 +367,7 @@ class ClientChannelFilter::LoadBalancedCall final
369
367
  void RetryPickLocked()
370
368
  ABSL_EXCLUSIVE_LOCKS_REQUIRED(&ClientChannelFilter::lb_mu_);
371
369
 
372
- RefCountedPtr<SubchannelCall> subchannel_call() const {
370
+ RefCountedPtr<Subchannel::Call> subchannel_call() const {
373
371
  return subchannel_call_;
374
372
  }
375
373
 
@@ -423,7 +421,7 @@ class ClientChannelFilter::LoadBalancedCall final
423
421
  // and when it is queued and the channel gets a new picker.
424
422
  void TryPick(bool was_queued);
425
423
 
426
- void CreateSubchannelCall();
424
+ void StartSubchannelCall();
427
425
 
428
426
  ClientChannelFilter* chand_;
429
427
  // When we start a new attempt for a call, we might not have cleaned up the
@@ -443,7 +441,6 @@ class ClientChannelFilter::LoadBalancedCall final
443
441
 
444
442
  absl::AnyInvocable<void()> on_commit_;
445
443
 
446
- RefCountedPtr<ConnectedSubchannel> connected_subchannel_;
447
444
  const BackendMetricData* backend_metric_data_ = nullptr;
448
445
  std::unique_ptr<LoadBalancingPolicy::SubchannelCallTrackerInterface>
449
446
  lb_subchannel_call_tracker_;
@@ -459,7 +456,7 @@ class ClientChannelFilter::LoadBalancedCall final
459
456
  LbQueuedCallCanceller* lb_call_canceller_
460
457
  ABSL_GUARDED_BY(&ClientChannelFilter::lb_mu_) = nullptr;
461
458
 
462
- RefCountedPtr<SubchannelCall> subchannel_call_;
459
+ RefCountedPtr<Subchannel::Call> subchannel_call_;
463
460
 
464
461
  // For intercepting recv_initial_metadata_ready.
465
462
  grpc_metadata_batch* recv_initial_metadata_ = nullptr;
@@ -45,6 +45,11 @@
45
45
  #define GRPC_ARG_MAX_CONNECTIONS_PER_SUBCHANNEL \
46
46
  "grpc.internal.max_connections_per_subchannel"
47
47
 
48
+ // EXPERIMENTAL: Fail requests at the client if the client is over max
49
+ // concurrent streams, so they may be retried elsewhere.
50
+ #define GRPC_ARG_MAX_CONCURRENT_STREAMS_REJECT_ON_CLIENT \
51
+ "grpc.http.max_concurrent_streams_reject_on_client"
52
+
48
53
  namespace grpc_core {
49
54
 
50
55
  // Internal type for LB call state interface. Provides an interface for