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
@@ -28,6 +28,7 @@
28
28
  #include <optional>
29
29
  #include <queue>
30
30
  #include <string>
31
+ #include <type_traits>
31
32
  #include <utility>
32
33
  #include <variant>
33
34
  #include <vector>
@@ -39,9 +40,11 @@
39
40
  #include "src/core/ext/transport/chttp2/transport/http2_status.h"
40
41
  #include "src/core/ext/transport/chttp2/transport/message_assembler.h"
41
42
  #include "src/core/ext/transport/chttp2/transport/transport_common.h"
43
+ #include "src/core/ext/transport/chttp2/transport/write_cycle.h"
42
44
  #include "src/core/lib/promise/activity.h"
43
45
  #include "src/core/lib/promise/context.h"
44
46
  #include "src/core/lib/promise/poll.h"
47
+ #include "src/core/lib/resource_quota/arena.h"
45
48
  #include "src/core/lib/slice/slice_buffer.h"
46
49
  #include "src/core/util/grpc_check.h"
47
50
  #include "src/core/util/ref_counted.h"
@@ -59,7 +62,8 @@ namespace http2 {
59
62
  template <typename T>
60
63
  class SimpleQueue {
61
64
  public:
62
- explicit SimpleQueue(const uint32_t max_tokens) : max_tokens_(max_tokens) {}
65
+ explicit SimpleQueue(Arena* arena, const uint32_t max_tokens)
66
+ : queue_(arena), max_tokens_(max_tokens) {}
63
67
  SimpleQueue(SimpleQueue&& rhs) = delete;
64
68
  SimpleQueue& operator=(SimpleQueue&& rhs) = delete;
65
69
  SimpleQueue(const SimpleQueue&) = delete;
@@ -99,13 +103,18 @@ class SimpleQueue {
99
103
  }
100
104
 
101
105
  // Returns true if the queue is empty. This function is NOT thread safe.
102
- bool IsEmpty() const { return queue_.empty(); }
106
+ inline bool IsEmpty() { return queue_.Peek() == nullptr; }
107
+
103
108
  // Clears the queue. This function is NOT thread safe.
104
- void Clear() { std::queue<Entry>().swap(queue_); }
109
+ void Clear() {
110
+ while (queue_.Pop().has_value()) {
111
+ }
112
+ GRPC_DCHECK(IsEmpty());
113
+ }
105
114
 
106
- inline std::optional<uint32_t> GetNextEntryTokens() const {
107
- return queue_.empty() ? std::nullopt
108
- : std::make_optional(queue_.front().tokens);
115
+ inline std::optional<uint32_t> GetNextEntryTokens() {
116
+ Entry* front = queue_.Peek();
117
+ return front == nullptr ? std::nullopt : std::make_optional(front->tokens);
109
118
  }
110
119
 
111
120
  private:
@@ -116,11 +125,12 @@ class SimpleQueue {
116
125
  if (tokens_consumed_ == 0 ||
117
126
  tokens_consumed_ <= max_tokens_consumed_threshold) {
118
127
  tokens_consumed_ += tokens;
119
- queue_.emplace(Entry{std::move(data), tokens});
128
+ const bool was_empty = IsEmpty();
129
+ queue_.Push(Entry{std::move(data), tokens});
120
130
  GRPC_STREAM_DATA_QUEUE_DEBUG
121
131
  << "Enqueue successful. Data tokens: " << tokens
122
132
  << " Current tokens consumed: " << tokens_consumed_;
123
- return /*became_non_empty=*/(queue_.size() == 1);
133
+ return /*became_non_empty=*/was_empty;
124
134
  }
125
135
 
126
136
  GRPC_STREAM_DATA_QUEUE_DEBUG
@@ -139,33 +149,35 @@ class SimpleQueue {
139
149
  return absl::InternalError("Tokens consumed overflowed.");
140
150
  }
141
151
  tokens_consumed_ += tokens;
142
- queue_.emplace(Entry{std::move(data), tokens});
152
+ const bool was_empty = IsEmpty();
153
+ queue_.Push(Entry{std::move(data), tokens});
143
154
  GRPC_STREAM_DATA_QUEUE_DEBUG
144
155
  << "Immediate enqueue successful. Data tokens: " << tokens
145
156
  << " Current tokens consumed: " << tokens_consumed_;
146
- return /*became_non_empty*/ (queue_.size() == 1);
157
+ return /*became_non_empty*/ was_empty;
147
158
  }
148
159
 
149
160
  std::optional<T> DequeueInternal(const uint32_t allowed_dequeue_tokens,
150
161
  const bool allow_oversized_dequeue) {
151
- if (queue_.empty() || (queue_.front().tokens > allowed_dequeue_tokens &&
152
- !allow_oversized_dequeue)) {
162
+ Entry* front = queue_.Peek();
163
+ if (front == nullptr ||
164
+ (front->tokens > allowed_dequeue_tokens && !allow_oversized_dequeue)) {
153
165
  GRPC_STREAM_DATA_QUEUE_DEBUG
154
- << "Dequeueing data. Queue size: " << queue_.size()
166
+ << "Dequeueing data."
155
167
  << " Max allowed dequeue tokens: " << allowed_dequeue_tokens
156
168
  << " Front tokens: "
157
- << (!queue_.empty() ? std::to_string(queue_.front().tokens)
158
- : std::string("NA"))
169
+ << (front != nullptr ? std::to_string(front->tokens)
170
+ : std::string("NA"))
159
171
  << " Allow oversized dequeue: " << allow_oversized_dequeue;
160
172
  return std::nullopt;
161
173
  }
162
174
 
163
- auto entry = std::move(queue_.front());
164
- queue_.pop();
165
- tokens_consumed_ -= entry.tokens;
175
+ std::optional<Entry> entry = queue_.Pop();
176
+ GRPC_DCHECK(entry.has_value());
177
+ tokens_consumed_ -= entry->tokens;
166
178
  auto waker = std::move(waker_);
167
179
  GRPC_STREAM_DATA_QUEUE_DEBUG
168
- << "Dequeue successful. Data tokens released: " << entry.tokens
180
+ << "Dequeue successful. Data tokens released: " << entry->tokens
169
181
  << " Current tokens consumed: " << tokens_consumed_;
170
182
 
171
183
  // TODO(akshitpatel) : [PH2][P2] : Investigate a mechanism to only wake up
@@ -173,7 +185,7 @@ class SimpleQueue {
173
185
  // this queue is revamped soon and so not spending time on optimization
174
186
  // right now.
175
187
  waker.Wakeup();
176
- return std::move(entry.data);
188
+ return std::move(entry->data);
177
189
  }
178
190
 
179
191
  struct Entry {
@@ -181,7 +193,7 @@ class SimpleQueue {
181
193
  uint32_t tokens;
182
194
  };
183
195
 
184
- std::queue<Entry> queue_;
196
+ ArenaSpsc<Entry> queue_;
185
197
  // The maximum number of tokens that can be enqueued. This limit is used to
186
198
  // exert back pressure on the sender. If the sender tries to enqueue more
187
199
  // tokens than this limit, the enqueue promise will not resolve until the
@@ -196,16 +208,58 @@ class SimpleQueue {
196
208
  Waker waker_;
197
209
  };
198
210
 
211
+ // DequeueFlags is a wrapper class for the dequeue flags. The flags can only
212
+ // be set from within the StreamDataQueue class.
213
+ class DequeueFlags {
214
+ public:
215
+ static constexpr uint8_t kResetStreamDequeued = 0x01u;
216
+ static constexpr uint8_t kHalfCloseDequeued = 0x02u;
217
+ static constexpr uint8_t kInitialMetadataDequeued = 0x04u;
218
+ static constexpr uint8_t kMessageDequeued = 0x08u;
219
+ static constexpr uint8_t kTrailingMetadataDequeued = 0x10u;
220
+
221
+ DequeueFlags() = default;
222
+
223
+ bool IsResetStreamDequeued() const {
224
+ return (flags_ & kResetStreamDequeued) != 0u;
225
+ }
226
+ bool IsHalfCloseDequeued() const {
227
+ return (flags_ & kHalfCloseDequeued) != 0u;
228
+ }
229
+ bool IsInitialMetadataDequeued() const {
230
+ return (flags_ & kInitialMetadataDequeued) != 0u;
231
+ }
232
+ bool IsMessageDequeued() const { return (flags_ & kMessageDequeued) != 0u; }
233
+ bool IsTrailingMetadataDequeued() const {
234
+ return (flags_ & kTrailingMetadataDequeued) != 0u;
235
+ }
236
+
237
+ bool operator==(uint8_t flags) const { return flags_ == flags; }
238
+
239
+ private:
240
+ template <typename MetadataHandle>
241
+ friend class StreamDataQueue;
242
+
243
+ void set_reset_stream_dequeued() { flags_ |= kResetStreamDequeued; }
244
+ void set_half_close_dequeued() { flags_ |= kHalfCloseDequeued; }
245
+ void set_initial_metadata_dequeued() { flags_ |= kInitialMetadataDequeued; }
246
+ void set_message_dequeued() { flags_ |= kMessageDequeued; }
247
+ void set_trailing_metadata_dequeued() { flags_ |= kTrailingMetadataDequeued; }
248
+
249
+ uint8_t flags_ = 0u;
250
+ };
251
+
199
252
  // StreamDataQueue is a thread safe.
200
253
  // Note: StreamDataQueue is a single producer single
201
254
  // consumer queue.
202
255
  template <typename MetadataHandle>
203
256
  class StreamDataQueue : public RefCounted<StreamDataQueue<MetadataHandle>> {
204
257
  public:
205
- explicit StreamDataQueue(const bool is_client, const uint32_t queue_size)
258
+ explicit StreamDataQueue(Arena* arena, const bool is_client,
259
+ const uint32_t queue_size)
206
260
  : stream_id_(0),
207
261
  is_client_(is_client),
208
- queue_(queue_size),
262
+ queue_(arena, queue_size),
209
263
  initial_metadata_disassembler_(/*is_trailing_metadata=*/false),
210
264
  trailing_metadata_disassembler_(/*is_trailing_metadata=*/true) {};
211
265
  ~StreamDataQueue() = default;
@@ -259,7 +313,14 @@ class StreamDataQueue : public RefCounted<StreamDataQueue<MetadataHandle>> {
259
313
  GRPC_DCHECK(!is_initial_metadata_queued_);
260
314
  GRPC_DCHECK(!is_trailing_metadata_or_half_close_queued_);
261
315
  GRPC_DCHECK(metadata != nullptr);
262
- GRPC_DCHECK(reset_stream_state_ == RstStreamState::kNotQueued);
316
+
317
+ // Stream closed before initial metadata is enqueued. This is possible
318
+ // if the stream is cancelled between stream creation and
319
+ // PullClientInitialMetadata resolving.
320
+ if (IsEnqueueClosed()) {
321
+ return StreamWritabilityUpdate{/*became_writable=*/false,
322
+ WritableStreamPriority::kStreamClosed};
323
+ }
263
324
 
264
325
  is_initial_metadata_queued_ = true;
265
326
  absl::StatusOr<bool> result = queue_.ImmediateEnqueue(
@@ -376,12 +437,14 @@ class StreamDataQueue : public RefCounted<StreamDataQueue<MetadataHandle>> {
376
437
  }
377
438
 
378
439
  // Enqueue Reset Stream.
379
- // 1. MUST be called at most once.
380
- // 3. This function is thread safe.
440
+ // 1. This function is thread safe.
441
+ // 2. ResetStream frame can be enqueued at any point after the creation of the
442
+ // stream.
443
+ // 3. Once ResetStream is enqueued, any enqueue calls after this will be
444
+ // ignored.
381
445
  absl::StatusOr<StreamWritabilityUpdate> EnqueueResetStream(
382
446
  const uint32_t error_code) {
383
447
  MutexLock lock(&mu_);
384
- GRPC_DCHECK(is_initial_metadata_queued_);
385
448
 
386
449
  // This can happen when the transport tries to close the stream and the
387
450
  // stream is cancelled from the call stack.
@@ -407,35 +470,22 @@ class StreamDataQueue : public RefCounted<StreamDataQueue<MetadataHandle>> {
407
470
 
408
471
  //////////////////////////////////////////////////////////////////////////////
409
472
  // Dequeue Helpers
410
-
411
- static constexpr uint8_t kResetStreamDequeued = 0x1;
412
- static constexpr uint8_t kHalfCloseDequeued = 0x2;
413
- static constexpr uint8_t kInitialMetadataDequeued = 0x4;
414
-
415
473
  struct DequeueResult {
416
- std::vector<Http2Frame> frames;
417
474
  bool is_writable;
418
475
  WritableStreamPriority priority;
419
- // Maybe not be extremely accurate but should be good enough for our
420
- // purposes.
421
- size_t total_bytes_consumed = 0u;
422
476
  size_t flow_control_tokens_consumed = 0u;
423
477
  // Bitmask of the dequeue flags.
424
- uint8_t flags = 0u;
478
+ DequeueFlags flags;
425
479
 
426
480
  // Returns true if the reset stream was dequeued.
427
- bool ResetStreamDequeued() const {
428
- return (flags & kResetStreamDequeued) != 0u;
429
- }
481
+ bool IsResetStreamDequeued() const { return flags.IsResetStreamDequeued(); }
430
482
 
431
483
  // Returns true if the half close was dequeued.
432
- bool HalfCloseDequeued() const {
433
- return (flags & kHalfCloseDequeued) != 0u;
434
- }
484
+ bool IsHalfCloseDequeued() const { return flags.IsHalfCloseDequeued(); }
435
485
 
436
486
  // Returns true if the initial metadata was dequeued.
437
- bool InitialMetadataDequeued() const {
438
- return (flags & kInitialMetadataDequeued) != 0u;
487
+ bool IsInitialMetadataDequeued() const {
488
+ return flags.IsInitialMetadataDequeued();
439
489
  }
440
490
  };
441
491
 
@@ -462,6 +512,7 @@ class StreamDataQueue : public RefCounted<StreamDataQueue<MetadataHandle>> {
462
512
  const uint32_t max_frame_length,
463
513
  const uint32_t stream_fc_tokens,
464
514
  HPackCompressor& encoder,
515
+ FrameSender& frame_sender,
465
516
  const bool can_send_reset_stream) {
466
517
  MutexLock lock(&mu_);
467
518
  GRPC_STREAM_DATA_QUEUE_DEBUG
@@ -478,12 +529,12 @@ class StreamDataQueue : public RefCounted<StreamDataQueue<MetadataHandle>> {
478
529
  // metadata enqueued has not reached HPACK encoder, so it is safe to drop
479
530
  // all frames.
480
531
  if (std::optional<DequeueResult> result =
481
- HandleResetStreamLocked(can_send_reset_stream)) {
532
+ HandleResetStreamLocked(can_send_reset_stream, frame_sender)) {
482
533
  return std::move(*result);
483
534
  }
484
535
 
485
536
  HandleDequeue handle_dequeue(max_fc_tokens, max_frame_length, encoder,
486
- *this);
537
+ frame_sender, *this);
487
538
  while (message_disassembler_.GetBufferedLength() <= max_fc_tokens) {
488
539
  const uint32_t tokens_to_dequeue =
489
540
  max_fc_tokens - message_disassembler_.GetBufferedLength();
@@ -502,14 +553,15 @@ class StreamDataQueue : public RefCounted<StreamDataQueue<MetadataHandle>> {
502
553
  GRPC_DCHECK_GE(stream_fc_tokens,
503
554
  handle_dequeue.GetFlowControlTokensConsumed());
504
555
 
556
+ handle_dequeue.AppendBufferedFrames();
557
+
505
558
  return DequeueResult{
506
- handle_dequeue.GetFrames(),
507
559
  UpdateWritableStateDequeueLocked(
508
560
  stream_fc_tokens - handle_dequeue.GetFlowControlTokensConsumed()),
509
561
  priority_,
510
- handle_dequeue.GetTotalBytesConsumed(),
562
+ /*flow_control_tokens_consumed=*/
511
563
  handle_dequeue.GetFlowControlTokensConsumed(),
512
- handle_dequeue.GetDequeueFlags()};
564
+ /*flags=*/handle_dequeue.GetDequeueFlags()};
513
565
  }
514
566
 
515
567
  // TODO(tjagtap) : [PH2][P1][FlowControl] : Call this while processing
@@ -550,18 +602,20 @@ class StreamDataQueue : public RefCounted<StreamDataQueue<MetadataHandle>> {
550
602
  class HandleDequeue {
551
603
  public:
552
604
  HandleDequeue(const uint32_t max_tokens, const uint32_t max_frame_length,
553
- HPackCompressor& encoder, StreamDataQueue& queue)
605
+ HPackCompressor& encoder, FrameSender& frame_sender,
606
+ StreamDataQueue& queue)
554
607
  : queue_(queue),
555
608
  max_frame_length_(max_frame_length),
556
609
  max_tokens_available_(max_tokens),
557
610
  flow_control_tokens_consumed_(0),
558
- encoder_(encoder) {}
611
+ encoder_(encoder),
612
+ frame_sender_(frame_sender) {}
559
613
 
560
614
  void operator()(InitialMetadataType initial_metadata) {
561
615
  GRPC_STREAM_DATA_QUEUE_DEBUG << "Preparing initial metadata for sending";
562
616
  queue_.initial_metadata_disassembler_.PrepareForSending(
563
617
  std::move(initial_metadata.metadata), encoder_);
564
- dequeue_flags_ |= kInitialMetadataDequeued;
618
+ dequeue_flags_.set_initial_metadata_dequeued();
565
619
  MaybeAppendInitialMetadataFrames();
566
620
  }
567
621
 
@@ -569,6 +623,7 @@ class StreamDataQueue : public RefCounted<StreamDataQueue<MetadataHandle>> {
569
623
  GRPC_STREAM_DATA_QUEUE_DEBUG << "Preparing trailing metadata for sending";
570
624
  queue_.trailing_metadata_disassembler_.PrepareForSending(
571
625
  std::move(trailing_metadata.metadata), encoder_);
626
+ dequeue_flags_.set_trailing_metadata_dequeued();
572
627
  }
573
628
 
574
629
  void operator()(MessageHandle message) {
@@ -579,10 +634,10 @@ class StreamDataQueue : public RefCounted<StreamDataQueue<MetadataHandle>> {
579
634
 
580
635
  void operator()(GRPC_UNUSED HalfClosed half_closed) {
581
636
  GRPC_STREAM_DATA_QUEUE_DEBUG << "Preparing end of stream for sending";
582
- dequeue_flags_ |= kHalfCloseDequeued;
637
+ dequeue_flags_.set_half_close_dequeued();
583
638
  }
584
639
 
585
- std::vector<Http2Frame> GetFrames() {
640
+ void AppendBufferedFrames() {
586
641
  // TODO(akshitpatel) : [PH2][P3] : There is a second option here. We can
587
642
  // only append messages here. Additionally, when Trailing
588
643
  // Metadata/HalfClose/ResetStream is dequeued, we can first flush the
@@ -594,20 +649,18 @@ class StreamDataQueue : public RefCounted<StreamDataQueue<MetadataHandle>> {
594
649
  MaybeAppendMessageFrames();
595
650
  MaybeAppendEndOfStreamFrame();
596
651
  MaybeAppendTrailingMetadataFrames();
597
- return std::move(frames_);
598
652
  }
599
653
 
600
- size_t GetTotalBytesConsumed() const { return total_bytes_consumed_; }
601
654
  size_t GetFlowControlTokensConsumed() const {
602
655
  return flow_control_tokens_consumed_;
603
656
  }
604
- uint8_t GetDequeueFlags() const { return dequeue_flags_; }
657
+ DequeueFlags GetDequeueFlags() const { return dequeue_flags_; }
605
658
 
606
659
  private:
607
660
  inline void MaybeAppendInitialMetadataFrames() {
608
661
  while (queue_.initial_metadata_disassembler_.HasMoreData()) {
609
- GRPC_DCHECK(!(dequeue_flags_ & kHalfCloseDequeued));
610
- GRPC_DCHECK(!(dequeue_flags_ & kResetStreamDequeued));
662
+ GRPC_DCHECK(!dequeue_flags_.IsHalfCloseDequeued());
663
+ GRPC_DCHECK(!dequeue_flags_.IsResetStreamDequeued());
611
664
  // TODO(akshitpatel) : [PH2][P2] : I do not think we need this.
612
665
  // HasMoreData() should be enough.
613
666
  bool is_end_headers = false;
@@ -618,7 +671,7 @@ class StreamDataQueue : public RefCounted<StreamDataQueue<MetadataHandle>> {
618
671
 
619
672
  inline void MaybeAppendTrailingMetadataFrames() {
620
673
  while (queue_.trailing_metadata_disassembler_.HasMoreData()) {
621
- GRPC_DCHECK(!(dequeue_flags_ & kHalfCloseDequeued));
674
+ GRPC_DCHECK(!dequeue_flags_.IsHalfCloseDequeued());
622
675
  GRPC_DCHECK_EQ(queue_.message_disassembler_.GetBufferedLength(), 0u);
623
676
  GRPC_DCHECK_EQ(
624
677
  queue_.initial_metadata_disassembler_.GetBufferedLength(), 0u);
@@ -631,12 +684,31 @@ class StreamDataQueue : public RefCounted<StreamDataQueue<MetadataHandle>> {
631
684
  }
632
685
 
633
686
  inline void MaybeAppendEndOfStreamFrame() {
634
- if (dequeue_flags_ & kHalfCloseDequeued) {
687
+ if (dequeue_flags_.IsHalfCloseDequeued()) {
635
688
  GRPC_DCHECK_EQ(queue_.message_disassembler_.GetBufferedLength(), 0u);
636
689
  GRPC_DCHECK_EQ(
637
690
  queue_.initial_metadata_disassembler_.GetBufferedLength(), 0u);
638
691
  GRPC_DCHECK_EQ(
639
692
  queue_.trailing_metadata_disassembler_.GetBufferedLength(), 0u);
693
+ Http2Frame* last_frame = frame_sender_.MutableLastRegularFrame();
694
+
695
+ // On the Server side, trailing metadata acts as end of stream and is
696
+ // always sent with END_STREAM flag set.
697
+ // To be inline with CHTTP2, InitialMetadata is always sent with
698
+ // END_STREAM flag false.
699
+ if (last_frame != nullptr && dequeue_flags_.IsMessageDequeued()) {
700
+ bool merged = std::visit(
701
+ [](auto& frame) -> bool {
702
+ using F = std::decay_t<decltype(frame)>;
703
+ if constexpr (std::is_same_v<F, Http2DataFrame>) {
704
+ frame.end_stream = true;
705
+ return true;
706
+ }
707
+ return false;
708
+ },
709
+ *last_frame);
710
+ if (merged) return;
711
+ }
640
712
  AppendFrame(Http2DataFrame{/*stream_id=*/queue_.stream_id_,
641
713
  /*end_stream=*/true,
642
714
  /*payload=*/SliceBuffer()});
@@ -658,11 +730,12 @@ class StreamDataQueue : public RefCounted<StreamDataQueue<MetadataHandle>> {
658
730
  << " Consumed tokens: " << flow_control_tokens_consumed_
659
731
  << " Max tokens: " << max_tokens_available_;
660
732
  AppendFrame(std::move(frame));
733
+ dequeue_flags_.set_message_dequeued();
661
734
  }
662
735
  }
663
736
 
664
737
  inline void MaybeAppendResetStreamFrame() {
665
- if (dequeue_flags_ & kResetStreamDequeued) {
738
+ if (dequeue_flags_.IsResetStreamDequeued()) {
666
739
  // TODO(akshitpatel) : [PH2][P2] : Consider if we can send reset stream
667
740
  // frame without flushing all the messages enqueued until now.
668
741
  GRPC_DCHECK_EQ(queue_.message_disassembler_.GetBufferedLength(), 0u);
@@ -675,8 +748,10 @@ class StreamDataQueue : public RefCounted<StreamDataQueue<MetadataHandle>> {
675
748
  }
676
749
 
677
750
  inline void AppendFrame(Http2Frame&& frame) {
678
- total_bytes_consumed_ += GetFrameMemoryUsage(frame);
679
- frames_.emplace_back(std::move(frame));
751
+ // FrameSender automatically accounts for the frame size in write quota.
752
+ // Maybe not be extremely accurate but should be good enough for our
753
+ // purposes.
754
+ frame_sender_.AddRegularFrame(std::forward<Http2Frame>(frame));
680
755
  }
681
756
 
682
757
  StreamDataQueue& queue_;
@@ -684,10 +759,9 @@ class StreamDataQueue : public RefCounted<StreamDataQueue<MetadataHandle>> {
684
759
  const uint32_t max_tokens_available_;
685
760
  uint32_t flow_control_tokens_consumed_;
686
761
  uint32_t error_code_ = static_cast<uint32_t>(Http2ErrorCode::kNoError);
687
- std::vector<Http2Frame> frames_;
688
762
  HPackCompressor& encoder_;
689
- size_t total_bytes_consumed_ = 0u;
690
- uint8_t dequeue_flags_ = 0u;
763
+ FrameSender& frame_sender_;
764
+ DequeueFlags dequeue_flags_;
691
765
  };
692
766
 
693
767
  // Updates the writable state and priority of the stream. MUST only be called
@@ -765,8 +839,9 @@ class StreamDataQueue : public RefCounted<StreamDataQueue<MetadataHandle>> {
765
839
  return is_writable_;
766
840
  }
767
841
 
768
- inline bool IsNextQueueEntryMessage() const {
769
- return (!queue_.IsEmpty() && queue_.GetNextEntryTokens().value() > 0);
842
+ inline bool IsNextQueueEntryMessage() {
843
+ std::optional<size_t> next_entry_tokens = queue_.GetNextEntryTokens();
844
+ return next_entry_tokens.has_value() && *next_entry_tokens > 0;
770
845
  }
771
846
 
772
847
  // Handles the case where a reset stream is queued.
@@ -774,37 +849,32 @@ class StreamDataQueue : public RefCounted<StreamDataQueue<MetadataHandle>> {
774
849
  // DequeueResult. Otherwise, it returns std::nullopt.
775
850
  // This function must be called with mu_ held.
776
851
  std::optional<DequeueResult> HandleResetStreamLocked(
777
- const bool can_send_reset_stream) ABSL_EXCLUSIVE_LOCKS_REQUIRED(mu_) {
852
+ const bool can_send_reset_stream, FrameSender& frame_sender)
853
+ ABSL_EXCLUSIVE_LOCKS_REQUIRED(mu_) {
778
854
  switch (reset_stream_state_) {
779
855
  case RstStreamState::kDequeued:
780
856
  GRPC_STREAM_DATA_QUEUE_DEBUG
781
857
  << "Reset stream is already dequeued. Returning empty frames.";
782
858
  GRPC_DCHECK(queue_.IsEmpty());
783
859
  is_writable_ = false;
784
- return DequeueResult{
785
- std::vector<Http2Frame>(), is_writable_, priority_,
786
- /*total_bytes_consumed=*/0u,
787
- /*flow_control_tokens_consumed=*/0u, /*flags=*/0u};
860
+ return DequeueResult{is_writable_, priority_,
861
+ /*flow_control_tokens_consumed=*/0u,
862
+ /*flags=*/DequeueFlags{}};
788
863
  case RstStreamState::kQueued: {
789
864
  GRPC_STREAM_DATA_QUEUE_DEBUG
790
865
  << "Reset stream is queued. Skipping all frames (if any) for "
791
866
  "dequeuing.";
792
867
  is_writable_ = false;
793
- std::vector<Http2Frame> frames;
794
- uint8_t flags = 0u;
868
+ DequeueFlags flags;
795
869
  if (can_send_reset_stream) {
796
- frames.emplace_back(
870
+ frame_sender.AddRegularFrame(
797
871
  Http2RstStreamFrame{stream_id_, reset_stream_error_code_});
798
- flags = kResetStreamDequeued;
872
+ flags.set_reset_stream_dequeued();
799
873
  }
800
874
  queue_.Clear();
801
875
  reset_stream_state_ = RstStreamState::kDequeued;
802
- return DequeueResult{std::move(frames),
803
- is_writable_,
804
- priority_,
805
- /*total_bytes_consumed=*/0u,
806
- /*flow_control_tokens_consumed=*/0u,
807
- flags};
876
+ return DequeueResult{is_writable_, priority_,
877
+ /*flow_control_tokens_consumed=*/0u, flags};
808
878
  }
809
879
  case RstStreamState::kNotQueued:
810
880
  return std::nullopt;
@@ -39,11 +39,6 @@
39
39
  #define GRPC_ARG_MAX_CONCURRENT_STREAMS_OVERLOAD_PROTECTION \
40
40
  "grpc.http.overload_protection"
41
41
 
42
- // EXPERIMENTAL: Fail requests at the client if the client is over max
43
- // concurrent streams, so they may be retried elsewhere.
44
- #define GRPC_ARG_MAX_CONCURRENT_STREAMS_REJECT_ON_CLIENT \
45
- "grpc.http.max_concurrent_streams_reject_on_client"
46
-
47
42
  #define KEEPALIVE_TIME_BACKOFF_MULTIPLIER 2
48
43
 
49
44
  #define GRPC_CHTTP2_PING_TIMEOUT_STR "ping timeout"
@@ -74,19 +74,19 @@ class WritableStreams {
74
74
  WritableStreams(WritableStreams&&) = delete;
75
75
  WritableStreams& operator=(WritableStreams&&) = delete;
76
76
 
77
- absl::Status EnqueueWrapper(const StreamPtr stream,
77
+ absl::Status EnqueueWrapper(StreamPtr stream,
78
78
  const WritableStreamPriority priority,
79
79
  bool transport_tokens_available) {
80
80
  if (transport_tokens_available) {
81
- return Enqueue(stream, priority);
81
+ return Enqueue(std::move(stream), priority);
82
82
  } else {
83
- return BlockedOnTransportFlowControl(stream);
83
+ return BlockedOnTransportFlowControl(std::move(stream));
84
84
  }
85
85
  }
86
86
 
87
87
  // Enqueues a stream id with the given priority.
88
88
  // If this returns error, transport MUST be closed.
89
- absl::Status Enqueue(const StreamPtr stream,
89
+ absl::Status Enqueue(StreamPtr stream,
90
90
  const WritableStreamPriority priority) {
91
91
  // Streams waiting for transport flow control MUST not be added to list of
92
92
  // writable streams via this API, instead they MUST be added via
@@ -96,7 +96,7 @@ class WritableStreams {
96
96
  GRPC_DCHECK(priority !=
97
97
  WritableStreamPriority::kWaitForTransportFlowControl);
98
98
  StatusFlag status = sender_.UnbufferedImmediateSend(
99
- StreamIDAndPriority{stream, priority}, /*tokens*/ 1);
99
+ StreamIDAndPriority{std::move(stream), priority}, /*tokens*/ 1);
100
100
  GRPC_WRITABLE_STREAMS_DEBUG
101
101
  << "UnbufferedImmediateEnqueue stream with priority "
102
102
  << GetWritableStreamPriorityString(priority) << " status " << status;
@@ -109,9 +109,10 @@ class WritableStreams {
109
109
 
110
110
  // A synchronous function to add a stream id to the transport flow control
111
111
  // wait list.
112
- absl::Status BlockedOnTransportFlowControl(const StreamPtr stream) {
112
+ absl::Status BlockedOnTransportFlowControl(StreamPtr stream) {
113
113
  prioritized_queue_.Push(
114
- stream, WritableStreamPriority::kWaitForTransportFlowControl);
114
+ std::move(stream),
115
+ WritableStreamPriority::kWaitForTransportFlowControl);
115
116
  GRPC_WRITABLE_STREAMS_DEBUG << "Enqueuing a stream with priority "
116
117
  "kWaitForTransportFlowControl ";
117
118
  return absl::OkStatus();
@@ -0,0 +1,86 @@
1
+ //
2
+ //
3
+ // Copyright 2026 gRPC authors.
4
+ //
5
+ // Licensed under the Apache License, Version 2.0 (the "License");
6
+ // you may not use this file except in compliance with the License.
7
+ // You may obtain a copy of the License at
8
+ //
9
+ // http://www.apache.org/licenses/LICENSE-2.0
10
+ //
11
+ // Unless required by applicable law or agreed to in writing, software
12
+ // distributed under the License is distributed on an "AS IS" BASIS,
13
+ // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14
+ // See the License for the specific language governing permissions and
15
+ // limitations under the License.
16
+ //
17
+ //
18
+
19
+ #include "src/core/ext/transport/chttp2/transport/write_cycle.h"
20
+
21
+ #include <grpc/support/port_platform.h>
22
+
23
+ #include <string>
24
+
25
+ #include "src/core/ext/transport/chttp2/transport/frame.h"
26
+ #include "src/core/ext/transport/chttp2/transport/http2_settings.h"
27
+ #include "src/core/lib/transport/promise_endpoint.h"
28
+ #include "absl/container/inlined_vector.h"
29
+ #include "absl/strings/str_cat.h"
30
+
31
+ namespace grpc_core {
32
+ namespace http2 {
33
+
34
+ // WriteQuota
35
+
36
+ std::string WriteQuota::DebugString() const {
37
+ return absl::StrCat("WriteQuota{target=", target_write_size_,
38
+ ", consumed=", bytes_consumed_, "}");
39
+ }
40
+
41
+ // WriteBufferTracker
42
+ std::string WriteBufferTracker::DebugString() const {
43
+ return absl::StrCat(
44
+ "WriteBufferTracker{regular_frames_count=", regular_frames_.size(),
45
+ ", urgent_frames_count=", urgent_frames_.size(),
46
+ ", is_first_write=", is_first_write_, "}");
47
+ }
48
+
49
+ // WriteCycle
50
+
51
+ absl::InlinedVector<Http2Frame, WriteBufferTracker::kInlinedRegularFramesSize>&
52
+ WriteCycle::TestOnlyRegularFrames() {
53
+ return write_buffer_tracker_.TestOnlyRegularFrames();
54
+ }
55
+
56
+ absl::InlinedVector<Http2Frame, WriteBufferTracker::kInlinedUrgentFramesSize>&
57
+ WriteCycle::TestOnlyUrgentFrames() {
58
+ return write_buffer_tracker_.TestOnlyUrgentFrames();
59
+ }
60
+
61
+ std::string WriteCycle::DebugString() const {
62
+ return absl::StrCat("WriteCycle{quota=", write_quota_.DebugString(),
63
+ ", tracker=", write_buffer_tracker_.DebugString(), "}");
64
+ }
65
+
66
+ // TransportWriteContext
67
+
68
+ std::string TransportWriteContext::DebugString() const {
69
+ return absl::StrCat("TransportWriteContext{is_first_write=", is_first_write_,
70
+ "} ",
71
+ write_cycle_ ? write_cycle_->DebugString() : "null");
72
+ }
73
+
74
+ PromiseEndpoint::WriteArgs TransportWriteContext::GetWriteArgs(
75
+ const Http2Settings& peer_settings) {
76
+ PromiseEndpoint::WriteArgs args;
77
+ int max_frame_size = peer_settings.preferred_receive_crypto_message_size();
78
+ if (max_frame_size == 0) {
79
+ max_frame_size = INT_MAX;
80
+ }
81
+ args.set_max_frame_size(max_frame_size);
82
+ return args;
83
+ }
84
+
85
+ } // namespace http2
86
+ } // namespace grpc_core