grpc 1.75.0 → 1.78.1

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 (839) hide show
  1. checksums.yaml +4 -4
  2. data/Makefile +24 -5
  3. data/include/grpc/credentials.h +27 -6
  4. data/include/grpc/event_engine/memory_allocator.h +2 -0
  5. data/include/grpc/event_engine/memory_request.h +2 -0
  6. data/include/grpc/impl/channel_arg_names.h +5 -0
  7. data/include/grpc/support/metrics.h +7 -1
  8. data/src/core/call/call_filters.cc +5 -5
  9. data/src/core/call/call_filters.h +211 -37
  10. data/src/core/call/call_spine.cc +1 -1
  11. data/src/core/call/call_spine.h +54 -32
  12. data/src/core/call/channelz_context.h +30 -0
  13. data/src/core/call/client_call.cc +49 -10
  14. data/src/core/call/client_call.h +6 -3
  15. data/src/core/call/filter_fusion.h +9 -9
  16. data/src/core/call/interception_chain.h +7 -6
  17. data/src/core/call/metadata_batch.cc +49 -55
  18. data/src/core/call/metadata_batch.h +10 -9
  19. data/src/core/call/metadata_info.cc +1 -1
  20. data/src/core/call/parsed_metadata.h +2 -2
  21. data/src/core/call/request_buffer.cc +1 -1
  22. data/src/core/call/security_context.cc +2 -2
  23. data/src/core/call/security_context.h +1 -1
  24. data/src/core/call/server_call.cc +5 -5
  25. data/src/core/call/server_call.h +6 -4
  26. data/src/core/call/simple_slice_based_metadata.h +1 -1
  27. data/src/core/call/status_util.cc +1 -1
  28. data/src/core/channelz/channel_trace.cc +1 -1
  29. data/src/core/channelz/channel_trace.h +3 -3
  30. data/src/core/channelz/channelz.cc +25 -29
  31. data/src/core/channelz/channelz.h +73 -22
  32. data/src/core/channelz/channelz_registry.cc +2 -2
  33. data/src/core/channelz/channelz_registry.h +53 -2
  34. data/src/core/channelz/property_list.cc +18 -0
  35. data/src/core/channelz/property_list.h +15 -4
  36. data/src/core/channelz/text_encode.cc +66 -0
  37. data/src/core/channelz/text_encode.h +29 -0
  38. data/src/core/channelz/v2tov1/convert.cc +17 -6
  39. data/src/core/channelz/v2tov1/legacy_api.cc +18 -12
  40. data/src/core/channelz/v2tov1/property_list.cc +2 -1
  41. data/src/core/channelz/ztrace_collector.h +260 -87
  42. data/src/core/client_channel/backup_poller.cc +7 -8
  43. data/src/core/client_channel/buffered_call.cc +140 -0
  44. data/src/core/client_channel/buffered_call.h +104 -0
  45. data/src/core/client_channel/client_channel.cc +144 -84
  46. data/src/core/client_channel/client_channel.h +8 -11
  47. data/src/core/client_channel/client_channel_factory.h +1 -1
  48. data/src/core/client_channel/client_channel_filter.cc +424 -686
  49. data/src/core/client_channel/client_channel_filter.h +57 -150
  50. data/src/core/client_channel/client_channel_internal.h +8 -5
  51. data/src/core/client_channel/client_channel_service_config.cc +43 -3
  52. data/src/core/client_channel/client_channel_service_config.h +12 -1
  53. data/src/core/client_channel/config_selector.h +5 -5
  54. data/src/core/client_channel/connector.h +2 -0
  55. data/src/core/client_channel/dynamic_filters.cc +5 -5
  56. data/src/core/client_channel/global_subchannel_pool.cc +0 -37
  57. data/src/core/client_channel/global_subchannel_pool.h +1 -28
  58. data/src/core/client_channel/lb_metadata.h +1 -1
  59. data/src/core/client_channel/load_balanced_call_destination.cc +10 -12
  60. data/src/core/client_channel/load_balanced_call_destination.h +1 -1
  61. data/src/core/client_channel/local_subchannel_pool.cc +4 -4
  62. data/src/core/client_channel/retry_filter.cc +2 -2
  63. data/src/core/client_channel/retry_filter.h +3 -3
  64. data/src/core/client_channel/retry_filter_legacy_call_data.cc +11 -12
  65. data/src/core/client_channel/retry_filter_legacy_call_data.h +6 -8
  66. data/src/core/client_channel/retry_service_config.cc +3 -3
  67. data/src/core/client_channel/retry_service_config.h +1 -1
  68. data/src/core/client_channel/subchannel.cc +114 -25
  69. data/src/core/client_channel/subchannel.h +24 -8
  70. data/src/core/client_channel/subchannel_pool_interface.cc +2 -2
  71. data/src/core/client_channel/subchannel_pool_interface.h +1 -1
  72. data/src/core/client_channel/subchannel_stream_client.cc +5 -5
  73. data/src/core/client_channel/subchannel_stream_client.h +3 -3
  74. data/src/core/config/config_vars.cc +38 -3
  75. data/src/core/config/config_vars.h +26 -0
  76. data/src/core/config/core_configuration.cc +5 -5
  77. data/src/core/config/core_configuration.h +8 -8
  78. data/src/core/config/load_config.cc +13 -1
  79. data/src/core/config/load_config.h +2 -0
  80. data/src/core/credentials/call/call_credentials.h +4 -4
  81. data/src/core/credentials/call/call_creds_registry.h +1 -1
  82. data/src/core/credentials/call/call_creds_registry_init.cc +2 -2
  83. data/src/core/credentials/call/call_creds_util.cc +7 -6
  84. data/src/core/credentials/call/composite/composite_call_credentials.cc +6 -6
  85. data/src/core/credentials/call/composite/composite_call_credentials.h +1 -1
  86. data/src/core/credentials/call/external/aws_external_account_credentials.cc +9 -9
  87. data/src/core/credentials/call/external/aws_external_account_credentials.h +1 -1
  88. data/src/core/credentials/call/external/external_account_credentials.cc +12 -12
  89. data/src/core/credentials/call/external/external_account_credentials.h +1 -1
  90. data/src/core/credentials/call/external/file_external_account_credentials.cc +3 -3
  91. data/src/core/credentials/call/external/file_external_account_credentials.h +1 -1
  92. data/src/core/credentials/call/external/url_external_account_credentials.cc +7 -7
  93. data/src/core/credentials/call/external/url_external_account_credentials.h +1 -1
  94. data/src/core/credentials/call/gcp_service_account_identity/gcp_service_account_identity_credentials.cc +24 -71
  95. data/src/core/credentials/call/gcp_service_account_identity/gcp_service_account_identity_credentials.h +1 -8
  96. data/src/core/credentials/call/iam/iam_credentials.cc +6 -6
  97. data/src/core/credentials/call/iam/iam_credentials.h +1 -1
  98. data/src/core/credentials/call/json_util.cc +1 -1
  99. data/src/core/credentials/call/jwt/json_token.cc +7 -7
  100. data/src/core/credentials/call/jwt/jwt_credentials.cc +5 -5
  101. data/src/core/credentials/call/jwt/jwt_credentials.h +4 -4
  102. data/src/core/credentials/call/jwt/jwt_verifier.cc +19 -18
  103. data/src/core/credentials/call/jwt_token_file/jwt_token_file_call_credentials.cc +2 -2
  104. data/src/core/credentials/call/jwt_token_file/jwt_token_file_call_credentials.h +3 -3
  105. data/src/core/credentials/call/jwt_util.cc +3 -3
  106. data/src/core/credentials/call/jwt_util.h +1 -1
  107. data/src/core/credentials/call/oauth2/oauth2_credentials.cc +49 -72
  108. data/src/core/credentials/call/oauth2/oauth2_credentials.h +3 -9
  109. data/src/core/credentials/call/plugin/plugin_credentials.cc +6 -6
  110. data/src/core/credentials/call/plugin/plugin_credentials.h +2 -2
  111. data/src/core/credentials/call/token_fetcher/token_fetcher_credentials.cc +46 -0
  112. data/src/core/credentials/call/token_fetcher/token_fetcher_credentials.h +32 -3
  113. data/src/core/credentials/transport/alts/alts_credentials.cc +5 -5
  114. data/src/core/credentials/transport/alts/alts_security_connector.cc +17 -15
  115. data/src/core/credentials/transport/alts/check_gcp_environment_no_op.cc +1 -1
  116. data/src/core/credentials/transport/alts/grpc_alts_credentials_client_options.cc +23 -3
  117. data/src/core/credentials/transport/alts/grpc_alts_credentials_options.cc +10 -1
  118. data/src/core/credentials/transport/alts/grpc_alts_credentials_options.h +31 -0
  119. data/src/core/credentials/transport/alts/grpc_alts_credentials_server_options.cc +8 -3
  120. data/src/core/credentials/transport/channel_creds_registry.h +1 -1
  121. data/src/core/credentials/transport/channel_creds_registry_init.cc +1 -1
  122. data/src/core/credentials/transport/composite/composite_channel_credentials.cc +7 -7
  123. data/src/core/credentials/transport/composite/composite_channel_credentials.h +1 -1
  124. data/src/core/credentials/transport/fake/fake_credentials.cc +1 -1
  125. data/src/core/credentials/transport/fake/fake_credentials.h +1 -1
  126. data/src/core/credentials/transport/fake/fake_security_connector.cc +7 -7
  127. data/src/core/credentials/transport/google_default/credentials_generic.cc +2 -2
  128. data/src/core/credentials/transport/google_default/google_default_credentials.cc +83 -39
  129. data/src/core/credentials/transport/google_default/google_default_credentials.h +0 -2
  130. data/src/core/credentials/transport/insecure/insecure_security_connector.cc +3 -3
  131. data/src/core/credentials/transport/insecure/insecure_security_connector.h +2 -2
  132. data/src/core/credentials/transport/local/local_security_connector.cc +13 -13
  133. data/src/core/credentials/transport/security_connector.cc +6 -6
  134. data/src/core/credentials/transport/security_connector.h +2 -2
  135. data/src/core/credentials/transport/ssl/ssl_credentials.cc +13 -13
  136. data/src/core/credentials/transport/ssl/ssl_credentials.h +2 -2
  137. data/src/core/credentials/transport/ssl/ssl_security_connector.cc +8 -8
  138. data/src/core/credentials/transport/tls/certificate_provider_factory.h +1 -1
  139. data/src/core/credentials/transport/tls/certificate_provider_registry.cc +2 -2
  140. data/src/core/credentials/transport/tls/certificate_provider_registry.h +1 -1
  141. data/src/core/credentials/transport/tls/grpc_tls_certificate_distributor.cc +25 -25
  142. data/src/core/credentials/transport/tls/grpc_tls_certificate_distributor.h +2 -2
  143. data/src/core/credentials/transport/tls/grpc_tls_certificate_match.cc +1 -1
  144. data/src/core/credentials/transport/tls/grpc_tls_certificate_provider.cc +8 -8
  145. data/src/core/credentials/transport/tls/grpc_tls_certificate_provider.h +5 -5
  146. data/src/core/credentials/transport/tls/grpc_tls_certificate_verifier.cc +3 -3
  147. data/src/core/credentials/transport/tls/grpc_tls_certificate_verifier.h +4 -4
  148. data/src/core/credentials/transport/tls/grpc_tls_credentials_options.cc +18 -18
  149. data/src/core/credentials/transport/tls/grpc_tls_crl_provider.cc +5 -5
  150. data/src/core/credentials/transport/tls/grpc_tls_crl_provider.h +3 -3
  151. data/src/core/credentials/transport/tls/load_system_roots_supported.cc +1 -1
  152. data/src/core/credentials/transport/tls/spiffe_utils.cc +10 -8
  153. data/src/core/credentials/transport/tls/spiffe_utils.h +2 -2
  154. data/src/core/credentials/transport/tls/ssl_utils.cc +18 -13
  155. data/src/core/credentials/transport/tls/ssl_utils.h +2 -2
  156. data/src/core/credentials/transport/tls/tls_credentials.cc +3 -3
  157. data/src/core/credentials/transport/tls/tls_security_connector.cc +15 -15
  158. data/src/core/credentials/transport/tls/tls_security_connector.h +3 -3
  159. data/src/core/credentials/transport/transport_credentials.cc +3 -3
  160. data/src/core/credentials/transport/transport_credentials.h +4 -4
  161. data/src/core/credentials/transport/xds/xds_credentials.cc +5 -5
  162. data/src/core/credentials/transport/xds/xds_credentials.h +1 -1
  163. data/src/core/ext/filters/backend_metrics/backend_metric_filter.cc +2 -2
  164. data/src/core/ext/filters/backend_metrics/backend_metric_filter.h +4 -1
  165. data/src/core/ext/filters/channel_idle/legacy_channel_idle_filter.cc +6 -4
  166. data/src/core/ext/filters/channel_idle/legacy_channel_idle_filter.h +2 -2
  167. data/src/core/ext/filters/fault_injection/fault_injection_filter.cc +7 -7
  168. data/src/core/ext/filters/fault_injection/fault_injection_filter.h +6 -3
  169. data/src/core/ext/filters/fault_injection/fault_injection_service_config_parser.h +1 -1
  170. data/src/core/ext/filters/gcp_authentication/gcp_authentication_filter.cc +2 -2
  171. data/src/core/ext/filters/gcp_authentication/gcp_authentication_filter.h +6 -3
  172. data/src/core/ext/filters/gcp_authentication/gcp_authentication_service_config_parser.h +1 -1
  173. data/src/core/ext/filters/http/client/http_client_filter.cc +6 -6
  174. data/src/core/ext/filters/http/client/http_client_filter.h +4 -1
  175. data/src/core/ext/filters/http/client_authority_filter.cc +2 -2
  176. data/src/core/ext/filters/http/client_authority_filter.h +4 -1
  177. data/src/core/ext/filters/http/http_filters_plugin.cc +1 -1
  178. data/src/core/ext/filters/http/message_compress/compression_filter.cc +11 -11
  179. data/src/core/ext/filters/http/message_compress/compression_filter.h +24 -5
  180. data/src/core/ext/filters/http/server/http_server_filter.cc +3 -3
  181. data/src/core/ext/filters/http/server/http_server_filter.h +4 -1
  182. data/src/core/ext/filters/message_size/message_size_filter.cc +2 -2
  183. data/src/core/ext/filters/message_size/message_size_filter.h +8 -2
  184. data/src/core/ext/filters/rbac/rbac_filter.cc +1 -1
  185. data/src/core/ext/filters/rbac/rbac_filter.h +4 -1
  186. data/src/core/ext/filters/rbac/rbac_service_config_parser.cc +3 -3
  187. data/src/core/ext/filters/rbac/rbac_service_config_parser.h +1 -1
  188. data/src/core/ext/filters/stateful_session/stateful_session_filter.cc +14 -14
  189. data/src/core/ext/filters/stateful_session/stateful_session_filter.h +13 -2
  190. data/src/core/ext/filters/stateful_session/stateful_session_service_config_parser.h +1 -1
  191. data/src/core/ext/transport/chttp2/alpn/alpn.cc +2 -2
  192. data/src/core/ext/transport/chttp2/client/chttp2_connector.cc +58 -44
  193. data/src/core/ext/transport/chttp2/client/chttp2_connector.h +2 -3
  194. data/src/core/ext/transport/chttp2/server/chttp2_server.cc +25 -24
  195. data/src/core/ext/transport/chttp2/server/chttp2_server.h +1 -2
  196. data/src/core/ext/transport/chttp2/transport/bin_decoder.cc +6 -6
  197. data/src/core/ext/transport/chttp2/transport/bin_encoder.cc +6 -6
  198. data/src/core/ext/transport/chttp2/transport/chttp2_transport.cc +306 -148
  199. data/src/core/ext/transport/chttp2/transport/chttp2_transport.h +10 -2
  200. data/src/core/ext/transport/chttp2/transport/flow_control.cc +42 -7
  201. data/src/core/ext/transport/chttp2/transport/flow_control.h +223 -83
  202. data/src/core/ext/transport/chttp2/transport/flow_control_manager.h +105 -0
  203. data/src/core/ext/transport/chttp2/transport/frame.cc +175 -27
  204. data/src/core/ext/transport/chttp2/transport/frame.h +58 -10
  205. data/src/core/ext/transport/chttp2/transport/frame_data.cc +4 -4
  206. data/src/core/ext/transport/chttp2/transport/frame_data.h +1 -1
  207. data/src/core/ext/transport/chttp2/transport/frame_goaway.cc +5 -5
  208. data/src/core/ext/transport/chttp2/transport/frame_ping.cc +6 -6
  209. data/src/core/ext/transport/chttp2/transport/frame_rst_stream.cc +7 -7
  210. data/src/core/ext/transport/chttp2/transport/frame_security.cc +1 -1
  211. data/src/core/ext/transport/chttp2/transport/frame_settings.cc +7 -15
  212. data/src/core/ext/transport/chttp2/transport/frame_window_update.cc +6 -6
  213. data/src/core/ext/transport/chttp2/transport/goaway.cc +129 -0
  214. data/src/core/ext/transport/chttp2/transport/goaway.h +350 -0
  215. data/src/core/ext/transport/chttp2/transport/header_assembler.h +194 -54
  216. data/src/core/ext/transport/chttp2/transport/hpack_encoder.cc +3 -3
  217. data/src/core/ext/transport/chttp2/transport/hpack_encoder.h +8 -6
  218. data/src/core/ext/transport/chttp2/transport/hpack_encoder_table.cc +8 -8
  219. data/src/core/ext/transport/chttp2/transport/hpack_parse_result.cc +3 -3
  220. data/src/core/ext/transport/chttp2/transport/hpack_parse_result.h +5 -5
  221. data/src/core/ext/transport/chttp2/transport/hpack_parser.cc +34 -34
  222. data/src/core/ext/transport/chttp2/transport/hpack_parser.h +6 -7
  223. data/src/core/ext/transport/chttp2/transport/hpack_parser_table.cc +8 -8
  224. data/src/core/ext/transport/chttp2/transport/hpack_parser_table.h +1 -1
  225. data/src/core/ext/transport/chttp2/transport/http2_client_transport.cc +1475 -632
  226. data/src/core/ext/transport/chttp2/transport/http2_client_transport.h +384 -373
  227. data/src/core/ext/transport/chttp2/transport/http2_settings.cc +1 -1
  228. data/src/core/ext/transport/chttp2/transport/http2_settings.h +6 -4
  229. data/src/core/ext/transport/chttp2/transport/http2_settings_manager.cc +4 -3
  230. data/src/core/ext/transport/chttp2/transport/http2_settings_manager.h +6 -5
  231. data/src/core/ext/transport/chttp2/transport/http2_settings_promises.h +417 -0
  232. data/src/core/ext/transport/chttp2/transport/http2_status.h +7 -1
  233. data/src/core/ext/transport/chttp2/transport/http2_transport.cc +337 -30
  234. data/src/core/ext/transport/chttp2/transport/http2_transport.h +196 -21
  235. data/src/core/ext/transport/chttp2/transport/http2_ztrace_collector.h +172 -72
  236. data/src/core/ext/transport/chttp2/transport/incoming_metadata_tracker.h +128 -0
  237. data/src/core/ext/transport/chttp2/transport/internal.h +31 -19
  238. data/src/core/ext/transport/chttp2/transport/keepalive.cc +12 -5
  239. data/src/core/ext/transport/chttp2/transport/keepalive.h +14 -10
  240. data/src/core/ext/transport/chttp2/transport/message_assembler.h +30 -21
  241. data/src/core/ext/transport/chttp2/transport/parsing.cc +25 -23
  242. data/src/core/ext/transport/chttp2/transport/ping_callbacks.cc +2 -2
  243. data/src/core/ext/transport/chttp2/transport/ping_callbacks.h +3 -3
  244. data/src/core/ext/transport/chttp2/transport/ping_promise.cc +70 -28
  245. data/src/core/ext/transport/chttp2/transport/ping_promise.h +63 -23
  246. data/src/core/ext/transport/chttp2/transport/ping_rate_policy.cc +1 -1
  247. data/src/core/ext/transport/chttp2/transport/security_frame.cc +31 -0
  248. data/src/core/ext/transport/chttp2/transport/security_frame.h +32 -0
  249. data/src/core/ext/transport/chttp2/transport/stream.h +287 -0
  250. data/src/core/ext/transport/chttp2/transport/stream_data_queue.h +476 -208
  251. data/src/core/ext/transport/chttp2/transport/stream_lists.cc +8 -8
  252. data/src/core/ext/transport/chttp2/transport/transport_common.cc +17 -1
  253. data/src/core/ext/transport/chttp2/transport/transport_common.h +57 -0
  254. data/src/core/ext/transport/chttp2/transport/varint.h +2 -2
  255. data/src/core/ext/transport/chttp2/transport/writable_streams.h +202 -84
  256. data/src/core/ext/transport/chttp2/transport/write_size_policy.cc +2 -2
  257. data/src/core/ext/transport/chttp2/transport/writing.cc +6 -6
  258. data/src/core/ext/transport/inproc/inproc_transport.cc +9 -3
  259. data/src/core/ext/transport/inproc/legacy_inproc_transport.cc +11 -8
  260. data/src/core/ext/upb-gen/src/proto/grpc/channelz/v2/service.upb.h +740 -0
  261. data/src/core/ext/upb-gen/src/proto/grpc/channelz/v2/service.upb_minitable.c +218 -0
  262. data/src/core/ext/upb-gen/src/proto/grpc/channelz/v2/service.upb_minitable.h +46 -0
  263. data/src/core/ext/upb-gen/src/proto/grpc/gcp/handshaker.upb.h +87 -55
  264. data/src/core/ext/upb-gen/src/proto/grpc/gcp/handshaker.upb_minitable.c +23 -21
  265. data/src/core/ext/upbdefs-gen/src/proto/grpc/channelz/v2/channelz.upbdefs.c +80 -0
  266. data/src/core/ext/upbdefs-gen/src/proto/grpc/channelz/v2/channelz.upbdefs.h +47 -0
  267. data/src/core/ext/upbdefs-gen/src/proto/grpc/channelz/v2/service.upbdefs.c +129 -0
  268. data/src/core/ext/upbdefs-gen/src/proto/grpc/channelz/v2/service.upbdefs.h +72 -0
  269. data/src/core/filter/auth/auth_filters.h +7 -1
  270. data/src/core/filter/auth/client_auth_filter.cc +2 -2
  271. data/src/core/filter/auth/server_auth_filter.cc +5 -5
  272. data/src/core/filter/blackboard.h +2 -2
  273. data/src/core/filter/filter_args.h +40 -2
  274. data/src/core/handshaker/endpoint_info/endpoint_info_handshaker.cc +2 -2
  275. data/src/core/handshaker/handshaker.cc +8 -8
  276. data/src/core/handshaker/handshaker.h +2 -2
  277. data/src/core/handshaker/http_connect/http_connect_handshaker.cc +5 -5
  278. data/src/core/handshaker/http_connect/http_proxy_mapper.cc +12 -12
  279. data/src/core/handshaker/http_connect/http_proxy_mapper.h +1 -1
  280. data/src/core/handshaker/http_connect/xds_http_proxy_mapper.cc +1 -1
  281. data/src/core/handshaker/http_connect/xds_http_proxy_mapper.h +1 -1
  282. data/src/core/handshaker/proxy_mapper.h +1 -1
  283. data/src/core/handshaker/proxy_mapper_registry.h +1 -1
  284. data/src/core/handshaker/security/legacy_secure_endpoint.cc +6 -6
  285. data/src/core/handshaker/security/pipelined_secure_endpoint.cc +38 -15
  286. data/src/core/handshaker/security/secure_endpoint.cc +31 -11
  287. data/src/core/handshaker/security/security_handshaker.cc +11 -8
  288. data/src/core/handshaker/security/security_handshaker.h +1 -1
  289. data/src/core/handshaker/tcp_connect/tcp_connect_handshaker.cc +6 -6
  290. data/src/core/lib/address_utils/parse_address.cc +5 -5
  291. data/src/core/lib/address_utils/parse_address.h +2 -2
  292. data/src/core/lib/address_utils/sockaddr_utils.cc +4 -4
  293. data/src/core/lib/address_utils/sockaddr_utils.h +1 -1
  294. data/src/core/lib/channel/channel_args.cc +1 -1
  295. data/src/core/lib/channel/channel_args.h +2 -2
  296. data/src/core/lib/channel/channel_stack.cc +29 -25
  297. data/src/core/lib/channel/channel_stack.h +8 -3
  298. data/src/core/lib/channel/channel_stack_builder.cc +8 -4
  299. data/src/core/lib/channel/channel_stack_builder.h +10 -9
  300. data/src/core/lib/channel/channel_stack_builder_impl.cc +8 -13
  301. data/src/core/lib/channel/channel_stack_builder_impl.h +1 -1
  302. data/src/core/lib/channel/connected_channel.cc +4 -4
  303. data/src/core/lib/channel/promise_based_filter.cc +132 -72
  304. data/src/core/lib/channel/promise_based_filter.h +39 -23
  305. data/src/core/lib/compression/compression_internal.cc +6 -6
  306. data/src/core/lib/compression/compression_internal.h +1 -1
  307. data/src/core/lib/compression/message_compress.cc +8 -8
  308. data/src/core/lib/debug/trace.cc +2 -5
  309. data/src/core/lib/debug/trace.h +10 -0
  310. data/src/core/lib/debug/trace_flags.cc +2 -2
  311. data/src/core/lib/debug/trace_flags.h +1 -1
  312. data/src/core/lib/event_engine/ares_resolver.cc +30 -28
  313. data/src/core/lib/event_engine/ares_resolver.h +4 -4
  314. data/src/core/lib/event_engine/cf_engine/cf_engine.cc +3 -3
  315. data/src/core/lib/event_engine/cf_engine/cfstream_endpoint.cc +2 -2
  316. data/src/core/lib/event_engine/cf_engine/cfstream_endpoint.h +1 -1
  317. data/src/core/lib/event_engine/cf_engine/dns_service_resolver.cc +4 -4
  318. data/src/core/lib/event_engine/cf_engine/dns_service_resolver.h +3 -3
  319. data/src/core/lib/event_engine/channel_args_endpoint_config.h +1 -1
  320. data/src/core/lib/event_engine/default_event_engine.cc +1 -1
  321. data/src/core/lib/event_engine/event_engine.cc +1 -1
  322. data/src/core/lib/event_engine/extensions/channelz.h +3 -3
  323. data/src/core/lib/event_engine/extensions/chaotic_good_extension.h +1 -1
  324. data/src/core/lib/event_engine/extensions/supports_fd.h +5 -5
  325. data/src/core/lib/event_engine/extensions/tcp_trace.h +8 -1
  326. data/src/core/lib/event_engine/grpc_polled_fd.h +1 -1
  327. data/src/core/lib/event_engine/memory_allocator_factory.h +1 -1
  328. data/src/core/lib/event_engine/posix_engine/ev_epoll1_linux.cc +12 -12
  329. data/src/core/lib/event_engine/posix_engine/ev_epoll1_linux.h +5 -5
  330. data/src/core/lib/event_engine/posix_engine/ev_poll_posix.cc +15 -15
  331. data/src/core/lib/event_engine/posix_engine/ev_poll_posix.h +3 -3
  332. data/src/core/lib/event_engine/posix_engine/event_poller.h +2 -2
  333. data/src/core/lib/event_engine/posix_engine/event_poller_posix_default.cc +2 -2
  334. data/src/core/lib/event_engine/posix_engine/file_descriptor_collection.cc +1 -1
  335. data/src/core/lib/event_engine/posix_engine/file_descriptor_collection.h +1 -1
  336. data/src/core/lib/event_engine/posix_engine/grpc_polled_fd_posix.h +4 -4
  337. data/src/core/lib/event_engine/posix_engine/internal_errqueue.cc +1 -1
  338. data/src/core/lib/event_engine/posix_engine/lockfree_event.cc +3 -3
  339. data/src/core/lib/event_engine/posix_engine/lockfree_event.h +1 -1
  340. data/src/core/lib/event_engine/posix_engine/native_posix_dns_resolver.cc +3 -3
  341. data/src/core/lib/event_engine/posix_engine/native_posix_dns_resolver.h +1 -1
  342. data/src/core/lib/event_engine/posix_engine/posix_endpoint.cc +28 -27
  343. data/src/core/lib/event_engine/posix_engine/posix_endpoint.h +17 -17
  344. data/src/core/lib/event_engine/posix_engine/posix_engine.cc +175 -177
  345. data/src/core/lib/event_engine/posix_engine/posix_engine.h +40 -61
  346. data/src/core/lib/event_engine/posix_engine/posix_engine_listener.cc +11 -7
  347. data/src/core/lib/event_engine/posix_engine/posix_engine_listener.h +4 -4
  348. data/src/core/lib/event_engine/posix_engine/posix_engine_listener_utils.cc +9 -9
  349. data/src/core/lib/event_engine/posix_engine/posix_engine_listener_utils.h +1 -1
  350. data/src/core/lib/event_engine/posix_engine/posix_interface.h +2 -2
  351. data/src/core/lib/event_engine/posix_engine/posix_interface_posix.cc +5 -5
  352. data/src/core/lib/event_engine/posix_engine/posix_write_event_sink.h +1 -1
  353. data/src/core/lib/event_engine/posix_engine/tcp_socket_utils.cc +1 -1
  354. data/src/core/lib/event_engine/posix_engine/tcp_socket_utils.h +1 -1
  355. data/src/core/lib/event_engine/posix_engine/timer.h +1 -1
  356. data/src/core/lib/event_engine/posix_engine/timer_manager.cc +4 -4
  357. data/src/core/lib/event_engine/posix_engine/timer_manager.h +1 -1
  358. data/src/core/lib/event_engine/posix_engine/traced_buffer_list.cc +2 -2
  359. data/src/core/lib/event_engine/posix_engine/traced_buffer_list.h +2 -2
  360. data/src/core/lib/event_engine/posix_engine/wakeup_fd_eventfd.cc +1 -1
  361. data/src/core/lib/event_engine/posix_engine/wakeup_fd_eventfd.h +2 -2
  362. data/src/core/lib/event_engine/posix_engine/wakeup_fd_pipe.cc +1 -1
  363. data/src/core/lib/event_engine/posix_engine/wakeup_fd_pipe.h +2 -2
  364. data/src/core/lib/event_engine/posix_engine/wakeup_fd_posix.h +1 -1
  365. data/src/core/lib/event_engine/posix_engine/wakeup_fd_posix_default.cc +2 -2
  366. data/src/core/lib/event_engine/posix_engine/wakeup_fd_posix_default.h +1 -1
  367. data/src/core/lib/event_engine/ref_counted_dns_resolver_interface.h +1 -1
  368. data/src/core/lib/event_engine/resolved_address.cc +3 -3
  369. data/src/core/lib/event_engine/shim.cc +8 -11
  370. data/src/core/lib/event_engine/shim.h +2 -1
  371. data/src/core/lib/event_engine/slice.cc +2 -2
  372. data/src/core/lib/event_engine/tcp_socket_utils.cc +15 -15
  373. data/src/core/lib/event_engine/thread_pool/thread_count.cc +1 -1
  374. data/src/core/lib/event_engine/thread_pool/thread_count.h +1 -1
  375. data/src/core/lib/event_engine/thread_pool/work_stealing_thread_pool.cc +11 -11
  376. data/src/core/lib/event_engine/thread_pool/work_stealing_thread_pool.h +3 -3
  377. data/src/core/lib/event_engine/utils.cc +3 -3
  378. data/src/core/lib/event_engine/utils.h +1 -1
  379. data/src/core/lib/event_engine/windows/grpc_polled_fd_windows.cc +32 -32
  380. data/src/core/lib/event_engine/windows/grpc_polled_fd_windows.h +2 -2
  381. data/src/core/lib/event_engine/windows/iocp.cc +11 -11
  382. data/src/core/lib/event_engine/windows/iocp.h +1 -1
  383. data/src/core/lib/event_engine/windows/native_windows_dns_resolver.cc +5 -2
  384. data/src/core/lib/event_engine/windows/win_socket.cc +7 -7
  385. data/src/core/lib/event_engine/windows/win_socket.h +2 -2
  386. data/src/core/lib/event_engine/windows/windows_endpoint.cc +16 -16
  387. data/src/core/lib/event_engine/windows/windows_engine.cc +20 -18
  388. data/src/core/lib/event_engine/windows/windows_engine.h +3 -3
  389. data/src/core/lib/event_engine/windows/windows_listener.cc +10 -10
  390. data/src/core/lib/event_engine/windows/windows_listener.h +2 -2
  391. data/src/core/lib/event_engine/work_queue/basic_work_queue.h +2 -2
  392. data/src/core/lib/experiments/config.cc +4 -4
  393. data/src/core/lib/experiments/experiments.cc +255 -42
  394. data/src/core/lib/experiments/experiments.h +105 -21
  395. data/src/core/lib/iomgr/buffer_list.cc +1 -1
  396. data/src/core/lib/iomgr/call_combiner.cc +4 -4
  397. data/src/core/lib/iomgr/call_combiner.h +2 -2
  398. data/src/core/lib/iomgr/cfstream_handle.cc +1 -1
  399. data/src/core/lib/iomgr/closure.h +2 -2
  400. data/src/core/lib/iomgr/combiner.cc +2 -2
  401. data/src/core/lib/iomgr/endpoint.h +1 -1
  402. data/src/core/lib/iomgr/endpoint_cfstream.cc +7 -7
  403. data/src/core/lib/iomgr/endpoint_pair_posix.cc +6 -6
  404. data/src/core/lib/iomgr/endpoint_pair_windows.cc +16 -15
  405. data/src/core/lib/iomgr/error.cc +1 -1
  406. data/src/core/lib/iomgr/error.h +2 -2
  407. data/src/core/lib/iomgr/error_cfstream.cc +1 -1
  408. data/src/core/lib/iomgr/ev_apple.cc +1 -1
  409. data/src/core/lib/iomgr/ev_epoll1_linux.cc +19 -19
  410. data/src/core/lib/iomgr/ev_poll_posix.cc +14 -14
  411. data/src/core/lib/iomgr/ev_posix.cc +3 -3
  412. data/src/core/lib/iomgr/event_engine_shims/closure.cc +3 -3
  413. data/src/core/lib/iomgr/event_engine_shims/closure.h +1 -1
  414. data/src/core/lib/iomgr/event_engine_shims/endpoint.cc +10 -9
  415. data/src/core/lib/iomgr/event_engine_shims/endpoint.h +1 -1
  416. data/src/core/lib/iomgr/event_engine_shims/tcp_client.cc +2 -2
  417. data/src/core/lib/iomgr/exec_ctx.cc +3 -3
  418. data/src/core/lib/iomgr/exec_ctx.h +1 -1
  419. data/src/core/lib/iomgr/fork_posix.cc +1 -1
  420. data/src/core/lib/iomgr/internal_errqueue.cc +1 -1
  421. data/src/core/lib/iomgr/iocp_windows.cc +9 -9
  422. data/src/core/lib/iomgr/iomgr.cc +1 -1
  423. data/src/core/lib/iomgr/iomgr_windows.cc +3 -3
  424. data/src/core/lib/iomgr/lockfree_event.cc +3 -3
  425. data/src/core/lib/iomgr/polling_entity.cc +4 -4
  426. data/src/core/lib/iomgr/resolve_address.cc +1 -1
  427. data/src/core/lib/iomgr/resolve_address.h +2 -2
  428. data/src/core/lib/iomgr/resolve_address_posix.cc +4 -4
  429. data/src/core/lib/iomgr/resolve_address_windows.cc +1 -1
  430. data/src/core/lib/iomgr/sockaddr_utils_posix.cc +1 -1
  431. data/src/core/lib/iomgr/socket_utils_common_posix.cc +4 -4
  432. data/src/core/lib/iomgr/socket_windows.cc +6 -6
  433. data/src/core/lib/iomgr/tcp_client_cfstream.cc +1 -1
  434. data/src/core/lib/iomgr/tcp_client_posix.cc +7 -7
  435. data/src/core/lib/iomgr/tcp_client_windows.cc +4 -4
  436. data/src/core/lib/iomgr/tcp_posix.cc +47 -47
  437. data/src/core/lib/iomgr/tcp_server.cc +5 -0
  438. data/src/core/lib/iomgr/tcp_server.h +7 -0
  439. data/src/core/lib/iomgr/tcp_server_posix.cc +62 -31
  440. data/src/core/lib/iomgr/tcp_server_utils_posix.h +4 -1
  441. data/src/core/lib/iomgr/tcp_server_utils_posix_common.cc +7 -7
  442. data/src/core/lib/iomgr/tcp_server_utils_posix_ifaddrs.cc +4 -4
  443. data/src/core/lib/iomgr/tcp_server_windows.cc +70 -31
  444. data/src/core/lib/iomgr/tcp_windows.cc +8 -8
  445. data/src/core/lib/iomgr/timer_generic.cc +5 -5
  446. data/src/core/lib/iomgr/timer_manager.cc +3 -3
  447. data/src/core/lib/iomgr/unix_sockets_posix.cc +3 -3
  448. data/src/core/lib/iomgr/unix_sockets_posix.h +1 -1
  449. data/src/core/lib/iomgr/unix_sockets_posix_noop.cc +2 -2
  450. data/src/core/lib/iomgr/vsock.cc +1 -1
  451. data/src/core/lib/iomgr/vsock.h +1 -1
  452. data/src/core/lib/iomgr/wakeup_fd_pipe.cc +1 -1
  453. data/src/core/lib/promise/activity.cc +3 -3
  454. data/src/core/lib/promise/activity.h +11 -10
  455. data/src/core/lib/promise/all_ok.h +3 -3
  456. data/src/core/lib/promise/arena_promise.h +47 -6
  457. data/src/core/lib/promise/context.h +3 -3
  458. data/src/core/lib/promise/detail/join_state.h +10 -10
  459. data/src/core/lib/promise/detail/promise_factory.h +1 -1
  460. data/src/core/lib/promise/detail/promise_like.h +1 -1
  461. data/src/core/lib/promise/detail/seq_state.h +16 -16
  462. data/src/core/lib/promise/detail/status.h +2 -2
  463. data/src/core/lib/promise/exec_ctx_wakeup_scheduler.h +1 -1
  464. data/src/core/lib/promise/for_each.h +8 -8
  465. data/src/core/lib/promise/if.h +1 -1
  466. data/src/core/lib/promise/inter_activity_latch.h +3 -3
  467. data/src/core/lib/promise/inter_activity_mutex.h +1 -1
  468. data/src/core/lib/promise/interceptor_list.h +5 -5
  469. data/src/core/lib/promise/latch.h +9 -9
  470. data/src/core/lib/promise/loop.h +2 -2
  471. data/src/core/lib/promise/map.h +2 -2
  472. data/src/core/lib/promise/mpsc.cc +31 -30
  473. data/src/core/lib/promise/mpsc.h +2 -2
  474. data/src/core/lib/promise/observable.h +6 -6
  475. data/src/core/lib/promise/party.cc +43 -30
  476. data/src/core/lib/promise/party.h +27 -23
  477. data/src/core/lib/promise/pipe.h +31 -17
  478. data/src/core/lib/promise/poll.h +6 -5
  479. data/src/core/lib/promise/promise.h +2 -4
  480. data/src/core/lib/promise/sleep.cc +3 -1
  481. data/src/core/lib/promise/sleep.h +1 -1
  482. data/src/core/lib/promise/status_flag.h +8 -8
  483. data/src/core/lib/promise/try_join.h +5 -5
  484. data/src/core/lib/promise/try_seq.h +5 -5
  485. data/src/core/lib/promise/wait_set.h +2 -2
  486. data/src/core/lib/resource_quota/api.cc +1 -1
  487. data/src/core/lib/resource_quota/arena.cc +1 -1
  488. data/src/core/lib/resource_quota/arena.h +15 -2
  489. data/src/core/lib/resource_quota/connection_quota.cc +9 -7
  490. data/src/core/lib/resource_quota/connection_quota.h +1 -1
  491. data/src/core/lib/resource_quota/memory_quota.cc +48 -27
  492. data/src/core/lib/resource_quota/memory_quota.h +56 -20
  493. data/src/core/lib/resource_quota/periodic_update.h +1 -1
  494. data/src/core/lib/resource_quota/resource_quota.cc +8 -0
  495. data/src/core/lib/resource_quota/resource_quota.h +2 -1
  496. data/src/core/lib/resource_quota/stream_quota.cc +22 -0
  497. data/src/core/lib/resource_quota/stream_quota.h +31 -0
  498. data/src/core/lib/resource_quota/telemetry.h +55 -0
  499. data/src/core/lib/resource_quota/thread_quota.cc +2 -2
  500. data/src/core/lib/resource_quota/thread_quota.h +1 -1
  501. data/src/core/lib/resource_tracker/resource_tracker.cc +33 -0
  502. data/src/core/lib/resource_tracker/resource_tracker.h +46 -0
  503. data/src/core/lib/security/authorization/audit_logging.cc +7 -7
  504. data/src/core/lib/security/authorization/audit_logging.h +1 -1
  505. data/src/core/lib/security/authorization/authorization_policy_provider.h +1 -1
  506. data/src/core/lib/security/authorization/evaluate_args.cc +5 -5
  507. data/src/core/lib/security/authorization/evaluate_args.h +1 -1
  508. data/src/core/lib/security/authorization/grpc_authorization_engine.cc +2 -2
  509. data/src/core/lib/security/authorization/grpc_server_authz_filter.cc +3 -3
  510. data/src/core/lib/security/authorization/grpc_server_authz_filter.h +4 -1
  511. data/src/core/lib/security/authorization/matchers.cc +2 -2
  512. data/src/core/lib/security/authorization/stdout_logger.cc +3 -3
  513. data/src/core/lib/slice/percent_encoding.cc +1 -1
  514. data/src/core/lib/slice/slice.cc +1 -1
  515. data/src/core/lib/slice/slice.h +2 -2
  516. data/src/core/lib/slice/slice_buffer.cc +1 -1
  517. data/src/core/lib/slice/slice_internal.h +1 -1
  518. data/src/core/lib/surface/byte_buffer_reader.cc +2 -2
  519. data/src/core/lib/surface/call.cc +58 -28
  520. data/src/core/lib/surface/call.h +13 -6
  521. data/src/core/lib/surface/call_log_batch.cc +2 -2
  522. data/src/core/lib/surface/call_utils.cc +7 -7
  523. data/src/core/lib/surface/call_utils.h +85 -20
  524. data/src/core/lib/surface/channel.cc +6 -5
  525. data/src/core/lib/surface/channel.h +13 -3
  526. data/src/core/lib/surface/channel_create.cc +12 -8
  527. data/src/core/lib/surface/channel_create.h +1 -1
  528. data/src/core/lib/surface/channel_init.cc +84 -27
  529. data/src/core/lib/surface/channel_init.h +30 -13
  530. data/src/core/lib/surface/completion_queue.cc +21 -20
  531. data/src/core/lib/surface/completion_queue_factory.cc +7 -7
  532. data/src/core/lib/surface/connection_context.h +45 -2
  533. data/src/core/lib/surface/filter_stack_call.cc +25 -31
  534. data/src/core/lib/surface/filter_stack_call.h +6 -7
  535. data/src/core/lib/surface/init.cc +4 -4
  536. data/src/core/lib/surface/lame_client.cc +2 -2
  537. data/src/core/lib/surface/lame_client.h +3 -3
  538. data/src/core/lib/surface/legacy_channel.cc +10 -10
  539. data/src/core/lib/surface/legacy_channel.h +1 -1
  540. data/src/core/lib/surface/validate_metadata.cc +2 -2
  541. data/src/core/lib/surface/validate_metadata.h +3 -3
  542. data/src/core/lib/surface/version.cc +2 -2
  543. data/src/core/lib/transport/bdp_estimator.cc +2 -2
  544. data/src/core/lib/transport/bdp_estimator.h +5 -5
  545. data/src/core/lib/transport/connectivity_state.cc +1 -1
  546. data/src/core/lib/transport/connectivity_state.h +2 -2
  547. data/src/core/lib/transport/error_utils.h +1 -1
  548. data/src/core/lib/transport/promise_endpoint.cc +4 -4
  549. data/src/core/lib/transport/promise_endpoint.h +11 -11
  550. data/src/core/lib/transport/timeout_encoding.cc +4 -4
  551. data/src/core/lib/transport/transport.cc +3 -3
  552. data/src/core/lib/transport/transport.h +62 -4
  553. data/src/core/lib/transport/transport_framing_endpoint_extension.h +1 -1
  554. data/src/core/lib/transport/transport_op_string.cc +2 -2
  555. data/src/core/load_balancing/address_filtering.cc +1 -1
  556. data/src/core/load_balancing/address_filtering.h +2 -2
  557. data/src/core/load_balancing/backend_metric_parser.cc +1 -1
  558. data/src/core/load_balancing/backend_metric_parser.h +1 -1
  559. data/src/core/load_balancing/child_policy_handler.cc +8 -8
  560. data/src/core/load_balancing/child_policy_handler.h +2 -2
  561. data/src/core/load_balancing/delegating_helper.h +2 -2
  562. data/src/core/load_balancing/endpoint_list.cc +6 -6
  563. data/src/core/load_balancing/endpoint_list.h +2 -2
  564. data/src/core/load_balancing/grpclb/client_load_reporting_filter.cc +7 -5
  565. data/src/core/load_balancing/grpclb/client_load_reporting_filter.h +5 -1
  566. data/src/core/load_balancing/grpclb/grpclb.cc +37 -48
  567. data/src/core/load_balancing/grpclb/grpclb_client_stats.h +2 -2
  568. data/src/core/load_balancing/grpclb/load_balancer_api.cc +1 -1
  569. data/src/core/load_balancing/grpclb/load_balancer_api.h +1 -1
  570. data/src/core/load_balancing/health_check_client.cc +13 -9
  571. data/src/core/load_balancing/health_check_client_internal.h +5 -5
  572. data/src/core/load_balancing/lb_policy.h +11 -8
  573. data/src/core/load_balancing/lb_policy_factory.h +2 -2
  574. data/src/core/load_balancing/lb_policy_registry.cc +3 -3
  575. data/src/core/load_balancing/lb_policy_registry.h +2 -2
  576. data/src/core/load_balancing/oob_backend_metric.cc +11 -7
  577. data/src/core/load_balancing/oob_backend_metric_internal.h +4 -4
  578. data/src/core/load_balancing/outlier_detection/outlier_detection.cc +9 -17
  579. data/src/core/load_balancing/pick_first/pick_first.cc +62 -32
  580. data/src/core/load_balancing/priority/priority.cc +29 -30
  581. data/src/core/load_balancing/ring_hash/ring_hash.cc +11 -11
  582. data/src/core/load_balancing/rls/rls.cc +23 -23
  583. data/src/core/load_balancing/round_robin/round_robin.cc +16 -16
  584. data/src/core/load_balancing/subchannel_interface.h +2 -2
  585. data/src/core/load_balancing/weighted_round_robin/static_stride_scheduler.cc +3 -3
  586. data/src/core/load_balancing/weighted_round_robin/weighted_round_robin.cc +42 -41
  587. data/src/core/load_balancing/weighted_target/weighted_target.cc +14 -14
  588. data/src/core/load_balancing/xds/cds.cc +81 -37
  589. data/src/core/load_balancing/xds/xds_cluster_impl.cc +24 -41
  590. data/src/core/load_balancing/xds/xds_cluster_manager.cc +6 -6
  591. data/src/core/load_balancing/xds/xds_override_host.cc +14 -14
  592. data/src/core/load_balancing/xds/xds_override_host.h +1 -1
  593. data/src/core/load_balancing/xds/xds_wrr_locality.cc +5 -5
  594. data/src/core/resolver/dns/c_ares/dns_resolver_ares.cc +8 -8
  595. data/src/core/resolver/dns/c_ares/dns_resolver_ares.h +1 -1
  596. data/src/core/resolver/dns/c_ares/grpc_ares_ev_driver.h +1 -1
  597. data/src/core/resolver/dns/c_ares/grpc_ares_ev_driver_posix.cc +4 -4
  598. data/src/core/resolver/dns/c_ares/grpc_ares_ev_driver_windows.cc +35 -35
  599. data/src/core/resolver/dns/c_ares/grpc_ares_wrapper.cc +16 -16
  600. data/src/core/resolver/dns/c_ares/grpc_ares_wrapper.h +2 -2
  601. data/src/core/resolver/dns/dns_resolver_plugin.cc +8 -5
  602. data/src/core/resolver/dns/event_engine/event_engine_client_channel_resolver.cc +10 -10
  603. data/src/core/resolver/dns/event_engine/event_engine_client_channel_resolver.h +1 -1
  604. data/src/core/resolver/dns/event_engine/service_config_helper.cc +2 -2
  605. data/src/core/resolver/dns/native/dns_resolver.cc +7 -7
  606. data/src/core/resolver/endpoint_addresses.cc +6 -6
  607. data/src/core/resolver/endpoint_addresses.h +4 -1
  608. data/src/core/resolver/fake/fake_resolver.cc +3 -3
  609. data/src/core/resolver/fake/fake_resolver.h +3 -3
  610. data/src/core/resolver/google_c2p/google_c2p_resolver.cc +46 -59
  611. data/src/core/resolver/polling_resolver.cc +8 -8
  612. data/src/core/resolver/polling_resolver.h +1 -1
  613. data/src/core/resolver/resolver.h +2 -2
  614. data/src/core/resolver/resolver_factory.h +2 -2
  615. data/src/core/resolver/resolver_registry.cc +5 -4
  616. data/src/core/resolver/resolver_registry.h +1 -1
  617. data/src/core/resolver/sockaddr/sockaddr_resolver.cc +4 -4
  618. data/src/core/resolver/xds/xds_config.cc +1 -1
  619. data/src/core/resolver/xds/xds_config.h +3 -3
  620. data/src/core/resolver/xds/xds_dependency_manager.cc +7 -7
  621. data/src/core/resolver/xds/xds_dependency_manager.h +3 -3
  622. data/src/core/resolver/xds/xds_resolver.cc +25 -22
  623. data/src/core/resolver/xds/xds_resolver_attributes.h +1 -1
  624. data/src/core/server/add_port.cc +2 -2
  625. data/src/core/server/server.cc +47 -43
  626. data/src/core/server/server.h +8 -7
  627. data/src/core/server/server_call_tracer_filter.cc +1 -1
  628. data/src/core/server/server_call_tracer_filter.h +9 -5
  629. data/src/core/server/server_config_selector.h +2 -2
  630. data/src/core/server/server_config_selector_filter.cc +5 -5
  631. data/src/core/server/xds_channel_stack_modifier.cc +3 -2
  632. data/src/core/server/xds_channel_stack_modifier.h +1 -1
  633. data/src/core/server/xds_server_config_fetcher.cc +19 -18
  634. data/src/core/service_config/service_config.h +1 -1
  635. data/src/core/service_config/service_config_channel_arg_filter.h +4 -1
  636. data/src/core/service_config/service_config_impl.cc +3 -3
  637. data/src/core/service_config/service_config_impl.h +4 -4
  638. data/src/core/service_config/service_config_parser.h +1 -1
  639. data/src/core/telemetry/call_tracer.cc +39 -49
  640. data/src/core/telemetry/call_tracer.h +201 -24
  641. data/src/core/telemetry/default_tcp_tracer.h +3 -3
  642. data/src/core/telemetry/histogram.h +205 -0
  643. data/src/core/telemetry/instrument.cc +999 -0
  644. data/src/core/telemetry/instrument.h +1105 -0
  645. data/src/core/telemetry/metrics.cc +15 -5
  646. data/src/core/telemetry/metrics.h +36 -5
  647. data/src/core/telemetry/stats.h +2 -2
  648. data/src/core/telemetry/stats_data.cc +1 -20
  649. data/src/core/telemetry/stats_data.h +2 -21
  650. data/src/core/transport/auth_context.cc +3 -3
  651. data/src/core/transport/auth_context.h +2 -1
  652. data/src/core/transport/auth_context_comparator_registry.h +1 -1
  653. data/src/core/tsi/alts/crypt/aes_gcm.cc +1 -1
  654. data/src/core/tsi/alts/frame_protector/alts_frame_protector.cc +2 -2
  655. data/src/core/tsi/alts/frame_protector/frame_handler.cc +1 -1
  656. data/src/core/tsi/alts/handshaker/alts_handshaker_client.cc +81 -48
  657. data/src/core/tsi/alts/handshaker/alts_handshaker_client.h +1 -0
  658. data/src/core/tsi/alts/handshaker/alts_shared_resource.cc +3 -3
  659. data/src/core/tsi/alts/handshaker/alts_tsi_handshaker.cc +46 -36
  660. data/src/core/tsi/alts/handshaker/alts_tsi_utils.cc +4 -4
  661. data/src/core/tsi/alts/handshaker/transport_security_common_api.cc +1 -1
  662. data/src/core/tsi/alts/zero_copy_frame_protector/alts_grpc_integrity_only_record_protocol.cc +4 -4
  663. data/src/core/tsi/alts/zero_copy_frame_protector/alts_grpc_privacy_integrity_record_protocol.cc +11 -3
  664. data/src/core/tsi/alts/zero_copy_frame_protector/alts_grpc_record_protocol.h +10 -0
  665. data/src/core/tsi/alts/zero_copy_frame_protector/alts_grpc_record_protocol_common.cc +16 -8
  666. data/src/core/tsi/alts/zero_copy_frame_protector/alts_grpc_record_protocol_common.h +3 -0
  667. data/src/core/tsi/alts/zero_copy_frame_protector/alts_zero_copy_grpc_protector.cc +18 -5
  668. data/src/core/tsi/fake_transport_security.cc +6 -5
  669. data/src/core/tsi/local_transport_security.cc +1 -1
  670. data/src/core/tsi/ssl/key_logging/ssl_key_logging.cc +5 -5
  671. data/src/core/tsi/ssl/key_logging/ssl_key_logging.h +1 -1
  672. data/src/core/tsi/ssl/session_cache/ssl_session_cache.cc +10 -10
  673. data/src/core/tsi/ssl/session_cache/ssl_session_openssl.cc +4 -4
  674. data/src/core/tsi/ssl_transport_security.cc +30 -30
  675. data/src/core/tsi/ssl_transport_security.h +1 -1
  676. data/src/core/tsi/ssl_transport_security_utils.cc +10 -10
  677. data/src/core/tsi/ssl_transport_security_utils.h +2 -2
  678. data/src/core/tsi/transport_security_grpc.cc +8 -0
  679. data/src/core/tsi/transport_security_grpc.h +15 -0
  680. data/src/core/util/alloc.cc +1 -1
  681. data/src/core/util/backoff.h +1 -1
  682. data/src/core/util/chunked_vector.h +4 -4
  683. data/src/core/util/crash.h +1 -1
  684. data/src/core/util/dual_ref_counted.h +2 -2
  685. data/src/core/util/event_log.cc +2 -2
  686. data/src/core/util/event_log.h +3 -3
  687. data/src/core/util/gcp_metadata_query.cc +7 -7
  688. data/src/core/util/gcp_metadata_query.h +2 -2
  689. data/src/core/util/glob.cc +2 -0
  690. data/src/core/util/grpc_check.cc +24 -0
  691. data/src/core/util/grpc_check.h +103 -0
  692. data/src/core/util/grpc_if_nametoindex_posix.cc +1 -1
  693. data/src/core/util/grpc_if_nametoindex_unsupported.cc +1 -1
  694. data/src/core/util/http_client/format_request.cc +1 -1
  695. data/src/core/util/http_client/httpcli.cc +6 -6
  696. data/src/core/util/http_client/httpcli.h +4 -4
  697. data/src/core/util/http_client/httpcli_security_connector.cc +4 -4
  698. data/src/core/util/http_client/parser.cc +4 -4
  699. data/src/core/util/json/json_channel_args.h +1 -1
  700. data/src/core/util/json/json_object_loader.h +6 -6
  701. data/src/core/util/json/json_reader.cc +2 -2
  702. data/src/core/util/json/json_reader.h +1 -1
  703. data/src/core/util/json/json_util.h +3 -3
  704. data/src/core/util/json/json_writer.cc +1 -1
  705. data/src/core/util/latent_see.cc +45 -24
  706. data/src/core/util/latent_see.h +199 -28
  707. data/src/core/util/linux/cpu.cc +1 -1
  708. data/src/core/util/load_file.cc +1 -1
  709. data/src/core/util/load_file.h +1 -1
  710. data/src/core/util/log.cc +3 -3
  711. data/src/core/util/lru_cache.h +4 -4
  712. data/src/core/util/matchers.h +1 -1
  713. data/src/core/util/memory_usage.h +17 -1
  714. data/src/core/util/mpscq.h +1 -1
  715. data/src/core/util/notification.h +1 -1
  716. data/src/core/util/posix/cpu.cc +1 -1
  717. data/src/core/util/posix/directory_reader.cc +3 -2
  718. data/src/core/util/posix/stat.cc +2 -2
  719. data/src/core/util/posix/sync.cc +24 -24
  720. data/src/core/util/posix/thd.cc +2 -2
  721. data/src/core/util/posix/tmpfile.cc +2 -2
  722. data/src/core/util/postmortem_emit.cc +52 -0
  723. data/src/core/util/postmortem_emit.h +30 -0
  724. data/src/core/util/ref_counted.h +2 -2
  725. data/src/core/util/ref_counted_ptr.h +6 -1
  726. data/src/core/util/ref_counted_string.h +1 -1
  727. data/src/core/util/single_set_ptr.h +3 -1
  728. data/src/core/util/status_helper.cc +8 -8
  729. data/src/core/util/status_helper.h +1 -1
  730. data/src/core/util/string.cc +2 -2
  731. data/src/core/util/sync_abseil.cc +1 -1
  732. data/src/core/util/table.h +1 -1
  733. data/src/core/util/time.cc +1 -1
  734. data/src/core/util/time_precise.cc +1 -1
  735. data/src/core/util/trie_lookup.h +170 -0
  736. data/src/core/util/unique_ptr_with_bitset.h +5 -5
  737. data/src/core/util/unique_type_name.h +1 -1
  738. data/src/core/util/upb_utils.h +6 -1
  739. data/src/core/util/validation_errors.cc +2 -2
  740. data/src/core/util/validation_errors.h +2 -3
  741. data/src/core/util/wait_for_single_owner.h +2 -2
  742. data/src/core/util/windows/directory_reader.cc +1 -1
  743. data/src/core/util/windows/stat.cc +2 -2
  744. data/src/core/util/windows/thd.cc +2 -2
  745. data/src/core/util/windows/time.cc +1 -1
  746. data/src/core/util/work_serializer.cc +3 -3
  747. data/src/core/util/work_serializer.h +2 -2
  748. data/src/core/xds/grpc/certificate_provider_store.cc +2 -2
  749. data/src/core/xds/grpc/certificate_provider_store.h +2 -2
  750. data/src/core/xds/grpc/file_watcher_certificate_provider_factory.cc +3 -3
  751. data/src/core/xds/grpc/file_watcher_certificate_provider_factory.h +1 -1
  752. data/src/core/xds/grpc/xds_audit_logger_registry.cc +3 -3
  753. data/src/core/xds/grpc/xds_audit_logger_registry.h +1 -1
  754. data/src/core/xds/grpc/xds_bootstrap_grpc.cc +7 -7
  755. data/src/core/xds/grpc/xds_bootstrap_grpc.h +8 -3
  756. data/src/core/xds/grpc/xds_certificate_provider.cc +4 -4
  757. data/src/core/xds/grpc/xds_certificate_provider.h +2 -2
  758. data/src/core/xds/grpc/xds_client_grpc.cc +39 -20
  759. data/src/core/xds/grpc/xds_client_grpc.h +6 -3
  760. data/src/core/xds/grpc/xds_cluster.cc +2 -2
  761. data/src/core/xds/grpc/xds_cluster.h +1 -1
  762. data/src/core/xds/grpc/xds_cluster_parser.cc +7 -7
  763. data/src/core/xds/grpc/xds_cluster_parser.h +1 -1
  764. data/src/core/xds/grpc/xds_cluster_specifier_plugin.cc +4 -4
  765. data/src/core/xds/grpc/xds_cluster_specifier_plugin.h +1 -1
  766. data/src/core/xds/grpc/xds_common_types.cc +1 -1
  767. data/src/core/xds/grpc/xds_common_types.h +1 -1
  768. data/src/core/xds/grpc/xds_common_types_parser.cc +5 -5
  769. data/src/core/xds/grpc/xds_endpoint.h +2 -2
  770. data/src/core/xds/grpc/xds_endpoint_parser.cc +7 -7
  771. data/src/core/xds/grpc/xds_endpoint_parser.h +1 -1
  772. data/src/core/xds/grpc/xds_health_status.cc +1 -1
  773. data/src/core/xds/grpc/xds_health_status.h +1 -1
  774. data/src/core/xds/grpc/xds_http_fault_filter.cc +4 -4
  775. data/src/core/xds/grpc/xds_http_fault_filter.h +2 -2
  776. data/src/core/xds/grpc/xds_http_filter.h +3 -3
  777. data/src/core/xds/grpc/xds_http_filter_registry.cc +4 -3
  778. data/src/core/xds/grpc/xds_http_filter_registry.h +2 -2
  779. data/src/core/xds/grpc/xds_http_gcp_authn_filter.cc +3 -3
  780. data/src/core/xds/grpc/xds_http_gcp_authn_filter.h +2 -2
  781. data/src/core/xds/grpc/xds_http_rbac_filter.cc +4 -4
  782. data/src/core/xds/grpc/xds_http_rbac_filter.h +2 -2
  783. data/src/core/xds/grpc/xds_http_stateful_session_filter.cc +3 -3
  784. data/src/core/xds/grpc/xds_http_stateful_session_filter.h +2 -2
  785. data/src/core/xds/grpc/xds_lb_policy_registry.cc +1 -1
  786. data/src/core/xds/grpc/xds_lb_policy_registry.h +1 -1
  787. data/src/core/xds/grpc/xds_listener.cc +2 -2
  788. data/src/core/xds/grpc/xds_listener_parser.cc +9 -9
  789. data/src/core/xds/grpc/xds_listener_parser.h +1 -1
  790. data/src/core/xds/grpc/xds_matcher.cc +277 -0
  791. data/src/core/xds/grpc/xds_matcher.h +432 -0
  792. data/src/core/xds/grpc/xds_matcher_action.cc +47 -0
  793. data/src/core/xds/grpc/xds_matcher_action.h +48 -0
  794. data/src/core/xds/grpc/xds_matcher_context.cc +29 -0
  795. data/src/core/xds/grpc/xds_matcher_context.h +46 -0
  796. data/src/core/xds/grpc/xds_matcher_input.cc +79 -0
  797. data/src/core/xds/grpc/xds_matcher_input.h +105 -0
  798. data/src/core/xds/grpc/xds_matcher_parse.cc +356 -0
  799. data/src/core/xds/grpc/xds_matcher_parse.h +39 -0
  800. data/src/core/xds/grpc/xds_metadata.cc +4 -3
  801. data/src/core/xds/grpc/xds_metadata.h +3 -3
  802. data/src/core/xds/grpc/xds_metadata_parser.cc +2 -2
  803. data/src/core/xds/grpc/xds_route_config.cc +3 -3
  804. data/src/core/xds/grpc/xds_route_config_parser.cc +14 -14
  805. data/src/core/xds/grpc/xds_route_config_parser.h +1 -1
  806. data/src/core/xds/grpc/xds_routing.cc +6 -6
  807. data/src/core/xds/grpc/xds_routing.h +2 -2
  808. data/src/core/xds/grpc/xds_server_grpc.cc +2 -2
  809. data/src/core/xds/grpc/xds_transport_grpc.cc +11 -11
  810. data/src/core/xds/grpc/xds_transport_grpc.h +2 -2
  811. data/src/core/xds/xds_client/lrs_client.cc +9 -9
  812. data/src/core/xds/xds_client/lrs_client.h +4 -4
  813. data/src/core/xds/xds_client/xds_api.h +1 -1
  814. data/src/core/xds/xds_client/xds_backend_metric_propagation.cc +1 -1
  815. data/src/core/xds/xds_client/xds_backend_metric_propagation.h +1 -1
  816. data/src/core/xds/xds_client/xds_client.cc +17 -17
  817. data/src/core/xds/xds_client/xds_client.h +5 -5
  818. data/src/core/xds/xds_client/xds_locality.h +2 -2
  819. data/src/core/xds/xds_client/xds_resource_type.h +2 -2
  820. data/src/core/xds/xds_client/xds_resource_type_impl.h +1 -1
  821. data/src/core/xds/xds_client/xds_transport.h +2 -2
  822. data/src/ruby/ext/grpc/extconf.rb +14 -12
  823. data/src/ruby/ext/grpc/rb_call.c +0 -1
  824. data/src/ruby/ext/grpc/rb_channel_args.c +0 -1
  825. data/src/ruby/ext/grpc/rb_channel_credentials.c +0 -1
  826. data/src/ruby/ext/grpc/rb_compression_options.c +0 -1
  827. data/src/ruby/ext/grpc/rb_grpc_imports.generated.h +2 -2
  828. data/src/ruby/ext/grpc/rb_server_credentials.c +0 -1
  829. data/src/ruby/ext/grpc/rb_xds_channel_credentials.c +0 -1
  830. data/src/ruby/ext/grpc/rb_xds_server_credentials.c +0 -1
  831. data/src/ruby/lib/grpc/grpc.rb +7 -9
  832. data/src/ruby/lib/grpc/version.rb +1 -1
  833. data/src/ruby/spec/client_server_spec.rb +1 -1
  834. data/src/ruby/spec/generic/rpc_server_pool_spec.rb +1 -1
  835. data/src/ruby/spec/generic/rpc_server_spec.rb +3 -4
  836. data/src/ruby/spec/spec_helper.rb +1 -1
  837. data/third_party/abseil-cpp/absl/container/internal/node_slot_policy.h +95 -0
  838. data/third_party/abseil-cpp/absl/container/node_hash_map.h +687 -0
  839. metadata +67 -8
@@ -19,52 +19,75 @@
19
19
  #ifndef GRPC_SRC_CORE_EXT_TRANSPORT_CHTTP2_TRANSPORT_HTTP2_CLIENT_TRANSPORT_H
20
20
  #define GRPC_SRC_CORE_EXT_TRANSPORT_CHTTP2_TRANSPORT_HTTP2_CLIENT_TRANSPORT_H
21
21
 
22
+ #include <grpc/event_engine/event_engine.h>
23
+ #include <grpc/grpc.h>
24
+ #include <grpc/support/port_platform.h>
25
+
26
+ #include <cstddef>
22
27
  #include <cstdint>
28
+ #include <memory>
29
+ #include <optional>
30
+ #include <string>
23
31
  #include <utility>
32
+ #include <vector>
24
33
 
25
34
  #include "src/core/call/call_spine.h"
35
+ #include "src/core/call/metadata.h"
36
+ #include "src/core/channelz/channelz.h"
37
+ #include "src/core/ext/transport/chttp2/transport/flow_control.h"
26
38
  #include "src/core/ext/transport/chttp2/transport/frame.h"
27
- #include "src/core/ext/transport/chttp2/transport/header_assembler.h"
39
+ #include "src/core/ext/transport/chttp2/transport/goaway.h"
28
40
  #include "src/core/ext/transport/chttp2/transport/hpack_encoder.h"
29
41
  #include "src/core/ext/transport/chttp2/transport/hpack_parser.h"
30
- #include "src/core/ext/transport/chttp2/transport/http2_settings_manager.h"
42
+ #include "src/core/ext/transport/chttp2/transport/http2_settings_promises.h"
31
43
  #include "src/core/ext/transport/chttp2/transport/http2_status.h"
32
44
  #include "src/core/ext/transport/chttp2/transport/http2_transport.h"
45
+ #include "src/core/ext/transport/chttp2/transport/http2_ztrace_collector.h"
46
+ #include "src/core/ext/transport/chttp2/transport/incoming_metadata_tracker.h"
33
47
  #include "src/core/ext/transport/chttp2/transport/keepalive.h"
34
- #include "src/core/ext/transport/chttp2/transport/message_assembler.h"
35
48
  #include "src/core/ext/transport/chttp2/transport/ping_promise.h"
49
+ #include "src/core/ext/transport/chttp2/transport/stream.h"
36
50
  #include "src/core/ext/transport/chttp2/transport/stream_data_queue.h"
37
51
  #include "src/core/ext/transport/chttp2/transport/writable_streams.h"
38
- #include "src/core/lib/promise/inter_activity_mutex.h"
39
- #include "src/core/lib/promise/loop.h"
40
- #include "src/core/lib/promise/mpsc.h"
52
+ #include "src/core/lib/channel/channel_args.h"
53
+ #include "src/core/lib/iomgr/closure.h"
54
+ #include "src/core/lib/iomgr/iomgr_fwd.h"
55
+ #include "src/core/lib/promise/activity.h"
56
+ #include "src/core/lib/promise/context.h"
57
+ #include "src/core/lib/promise/if.h"
58
+ #include "src/core/lib/promise/latch.h"
59
+ #include "src/core/lib/promise/map.h"
41
60
  #include "src/core/lib/promise/party.h"
61
+ #include "src/core/lib/promise/poll.h"
62
+ #include "src/core/lib/promise/promise.h"
63
+ #include "src/core/lib/promise/race.h"
64
+ #include "src/core/lib/promise/try_seq.h"
65
+ #include "src/core/lib/resource_quota/memory_quota.h"
66
+ #include "src/core/lib/slice/slice.h"
67
+ #include "src/core/lib/slice/slice_buffer.h"
42
68
  #include "src/core/lib/transport/connectivity_state.h"
43
69
  #include "src/core/lib/transport/promise_endpoint.h"
44
70
  #include "src/core/lib/transport/transport.h"
71
+ #include "src/core/util/check_class_size.h"
72
+ #include "src/core/util/debug_location.h"
73
+ #include "src/core/util/grpc_check.h"
45
74
  #include "src/core/util/orphanable.h"
46
75
  #include "src/core/util/ref_counted_ptr.h"
47
76
  #include "src/core/util/sync.h"
77
+ #include "src/core/util/time.h"
78
+ #include "absl/base/thread_annotations.h"
79
+ #include "absl/container/flat_hash_map.h"
80
+ #include "absl/container/flat_hash_set.h"
81
+ #include "absl/functional/any_invocable.h"
82
+ #include "absl/log/log.h"
83
+ #include "absl/status/status.h"
84
+ #include "absl/status/statusor.h"
85
+ #include "absl/strings/string_view.h"
86
+ #include "absl/types/span.h"
48
87
 
49
88
  namespace grpc_core {
50
89
  namespace http2 {
51
90
 
52
- // All Promise Based HTTP2 Transport TODOs have the tag
53
- // [PH2][Pn] where n = 0 to 5.
54
- // This helps to maintain the uniformity for quick lookup and fixing.
55
- //
56
- // [PH2][P0] MUST be fixed before the current PR is submitted.
57
- // [PH2][P1] MUST be fixed before the current sub-project is considered
58
- // complete.
59
- // [PH2][P2] MUST be fixed before the current Milestone is considered
60
- // complete.
61
- // [PH2][P3] MUST be fixed before Milestone 3 is considered complete.
62
- // [PH2][P4] Can be fixed after roll out begins. Evaluate these during
63
- // Milestone 4. Either do the TODOs or delete them.
64
- // [PH2][P5] This MUST be a separate standalone project.
65
- // [PH2][EXT] This is a TODO related to a project unrelated to PH2 but happening
66
- // in parallel.
67
-
68
91
  // Http2 Client Transport Spawns Overview
69
92
 
70
93
  // | Promise Spawn | Max Duration | Promise Resolution | Max Spawns |
@@ -78,22 +101,21 @@ namespace http2 {
78
101
  // Max Party Slots (Always): 3
79
102
  // Max Promise Slots (Worst Case): 4
80
103
 
81
- // Experimental : This is just the initial skeleton of class
82
- // and it is functions. The code will be written iteratively.
104
+ // Experimental : The code will be written iteratively.
83
105
  // Do not use or edit any of these functions unless you are
84
106
  // familiar with the PH2 project (Moving chttp2 to promises.)
85
107
  // TODO(tjagtap) : [PH2][P3] : Update the experimental status of the code before
86
108
  // http2 rollout begins.
87
- class Http2ClientTransport final : public ClientTransport {
88
- // TODO(tjagtap) : [PH2][P3] Move the definitions to the header for better
89
- // inlining. For now definitions are in the cc file to
90
- // reduce cognitive load in the header.
109
+ class Http2ClientTransport final : public ClientTransport,
110
+ public channelz::DataSource {
111
+ // TODO(akshitpatel) [PH2][P1] : Functions that need a mutex to be held should
112
+ // have "locked" suffix in function name.
91
113
  public:
92
114
  Http2ClientTransport(
93
115
  PromiseEndpoint endpoint, GRPC_UNUSED const ChannelArgs& channel_args,
94
116
  std::shared_ptr<grpc_event_engine::experimental::EventEngine>
95
117
  event_engine,
96
- grpc_closure* on_receive_settings);
118
+ absl::AnyInvocable<void(absl::StatusOr<uint32_t>)> on_receive_settings);
97
119
 
98
120
  Http2ClientTransport(const Http2ClientTransport&) = delete;
99
121
  Http2ClientTransport& operator=(const Http2ClientTransport&) = delete;
@@ -120,36 +142,56 @@ class Http2ClientTransport final : public ClientTransport {
120
142
  OrphanablePtr<ConnectivityStateWatcherInterface> watcher);
121
143
  void StopConnectivityWatch(ConnectivityStateWatcherInterface* watcher);
122
144
 
145
+ void StartWatch(RefCountedPtr<StateWatcher> watcher) override;
146
+ void StopWatch(RefCountedPtr<StateWatcher> watcher) override;
147
+
123
148
  void Orphan() override;
124
- void AbortWithError();
125
149
 
126
150
  RefCountedPtr<channelz::SocketNode> GetSocketNode() const override {
151
+ return const_cast<channelz::BaseNode*>(
152
+ channelz::DataSource::channelz_node())
153
+ ->RefAsSubclass<channelz::SocketNode>();
154
+ }
155
+
156
+ std::unique_ptr<channelz::ZTrace> GetZTrace(absl::string_view name) override {
157
+ if (name == "transport_frames") return ztrace_collector_->MakeZTrace();
127
158
  return nullptr;
128
159
  }
129
160
 
130
- auto TestOnlyEnqueueOutgoingFrame(Http2Frame frame) {
131
- // TODO(tjagtap) : [PH2][P3] : See if making a sender in the constructor
132
- // and using that always would be more efficient.
133
- return AssertResultType<absl::Status>(Map(
134
- outgoing_frames_.MakeSender().Send(std::move(frame), 1),
135
- [](StatusFlag status) {
136
- GRPC_HTTP2_CLIENT_DLOG
137
- << "Http2ClientTransport::TestOnlyEnqueueOutgoingFrame status="
138
- << status;
139
- return (status.ok()) ? absl::OkStatus()
140
- : absl::InternalError("Failed to enqueue frame");
141
- }));
161
+ void AddData(channelz::DataSink sink) override;
162
+ void SpawnAddChannelzData(RefCountedPtr<Party> party,
163
+ channelz::DataSink sink);
164
+
165
+ auto TestOnlyTriggerWriteCycle() {
166
+ return Immediate(writable_stream_list_.ForceReadyForWrite());
142
167
  }
143
168
 
144
169
  auto TestOnlySendPing(absl::AnyInvocable<void()> on_initiate,
145
170
  bool important = false) {
146
- return ping_manager_.RequestPing(std::move(on_initiate), important);
171
+ return ping_manager_->RequestPing(std::move(on_initiate), important);
147
172
  }
148
173
 
149
174
  template <typename Factory>
150
- auto TestOnlySpawnPromise(absl::string_view name, Factory factory) {
151
- return general_party_->Spawn(name, std::move(factory), [](auto) {});
175
+ void TestOnlySpawnPromise(absl::string_view name, Factory&& factory) {
176
+ general_party_->Spawn(name, std::forward<Factory>(factory), [](Empty) {});
177
+ }
178
+
179
+ int64_t TestOnlyTransportFlowControlWindow() {
180
+ return flow_control_.remote_window();
181
+ }
182
+
183
+ int64_t TestOnlyGetStreamFlowControlWindow(const uint32_t stream_id) {
184
+ RefCountedPtr<Stream> stream = LookupStream(stream_id);
185
+ if (stream == nullptr) {
186
+ return -1;
187
+ }
188
+ return stream->flow_control.remote_window_delta();
189
+ }
190
+
191
+ bool AreTransportFlowControlTokensAvailable() {
192
+ return flow_control_.remote_window() > 0;
152
193
  }
194
+ void SpawnTransportLoops();
153
195
 
154
196
  private:
155
197
  // Promise factory for processing each type of frame
@@ -162,10 +204,7 @@ class Http2ClientTransport final : public ClientTransport {
162
204
  Http2Status ProcessHttp2WindowUpdateFrame(Http2WindowUpdateFrame frame);
163
205
  Http2Status ProcessHttp2ContinuationFrame(Http2ContinuationFrame frame);
164
206
  Http2Status ProcessHttp2SecurityFrame(Http2SecurityFrame frame);
165
- Http2Status ProcessMetadata(uint32_t stream_id, HeaderAssembler& assembler,
166
- CallHandler& call,
167
- bool& did_push_initial_metadata,
168
- bool& did_push_trailing_metadata);
207
+ Http2Status ProcessMetadata(RefCountedPtr<Stream> stream);
169
208
 
170
209
  // Reading from the endpoint.
171
210
 
@@ -179,204 +218,89 @@ class Http2ClientTransport final : public ClientTransport {
179
218
  // Returns a promise that will process one HTTP2 frame.
180
219
  auto ProcessOneFrame(Http2Frame frame);
181
220
 
182
- // Returns a promise that will do the cleanup after the ReadLoop ends.
183
- auto OnReadLoopEnded();
184
-
185
221
  // Writing to the endpoint.
186
222
 
187
- // Read from the MPSC queue and write it.
188
- auto WriteFromQueue();
189
-
190
- // Returns a promise to keep writing in a Loop till a fail/close is
191
- // received.
192
- auto WriteLoop();
193
-
194
- // Returns a promise that will do the cleanup after the WriteLoop ends.
195
- auto OnWriteLoopEnded();
223
+ // Write time sensitive control frames to the endpoint. Frames sent from here
224
+ // will be GOAWAY, SETTINGS, PING and PING acks, WINDOW_UPDATE and
225
+ // Custom gRPC security frame.
226
+ // These frames are written to the endpoint in a single endpoint write. If any
227
+ // module needs to take action after the write (for cases like spawning
228
+ // timeout promises), they MUST plug the call in the
229
+ // NotifyControlFramesWriteDone.
230
+ auto ProcessAndWriteControlFrames();
196
231
 
197
- // Returns a promise to keep draining data and control frames from all the
198
- // active streams. This includes all stream specific frames like data, header,
199
- // continuation and reset stream frames.
200
- auto StreamMultiplexerLoop();
232
+ // Notify the control frames modules that the endpoint write is done.
233
+ void NotifyControlFramesWriteDone();
201
234
 
202
- // Returns a promise that will do the cleanup after the StreamMultiplexerLoop
203
- // ends.
204
- auto OnStreamMultiplexerLoopEnded();
235
+ // Returns a promise to keep draining control frames and data frames from all
236
+ // the writable streams and write to the endpoint.
237
+ auto MultiplexerLoop();
205
238
 
206
239
  // Returns a promise to fetch data from the callhandler and pass it further
207
240
  // down towards the endpoint.
208
- auto CallOutboundLoop(CallHandler call_handler, uint32_t stream_id,
209
- InterActivityMutex<uint32_t>::Lock lock,
241
+ auto CallOutboundLoop(CallHandler call_handler, RefCountedPtr<Stream> stream,
210
242
  ClientMetadataHandle metadata);
211
243
 
212
- // Returns a promise to enqueue a frame to MPSC
213
- auto EnqueueOutgoingFrame(Http2Frame frame) {
214
- // TODO(tjagtap) : [PH2][P3] : See if making a sender in the constructor
215
- // and using that always would be more efficient.
216
- return AssertResultType<absl::Status>(Map(
217
- outgoing_frames_.MakeSender().Send(std::move(frame), 1),
218
- [self = RefAsSubclass<Http2ClientTransport>()](StatusFlag status) {
219
- GRPC_HTTP2_CLIENT_DLOG
220
- << "Http2ClientTransport::EnqueueOutgoingFrame status=" << status;
221
- return (status.ok())
222
- ? absl::OkStatus()
223
- : self->HandleError(Http2Status::AbslConnectionError(
224
- absl::StatusCode::kInternal,
225
- "Failed to enqueue frame"));
226
- }));
244
+ // TODO(akshitpatel) : [PH2][P1] : Make this a synchronous function.
245
+ // Force triggers a transport write cycle
246
+ auto TriggerWriteCycle() {
247
+ return Immediate(writable_stream_list_.ForceReadyForWrite());
227
248
  }
228
249
 
229
- // Force triggers a transport write cycle
230
- auto TriggerWriteCycle() { return EnqueueOutgoingFrame(Http2EmptyFrame{}); }
250
+ auto FlowControlPeriodicUpdateLoop();
251
+ // TODO(tjagtap) [PH2][P2][BDP] Remove this when the BDP code is done.
252
+ void AddPeriodicUpdatePromiseWaker() {
253
+ periodic_updates_waker_ = GetContext<Activity>()->MakeNonOwningWaker();
254
+ }
255
+ // TODO(tjagtap) [PH2][P2][BDP] Remove this when the BDP code is done.
256
+ void WakeupPeriodicUpdatePromise() { periodic_updates_waker_.Wakeup(); }
257
+
258
+ // Processes the flow control action and take necessary steps.
259
+ void ActOnFlowControlAction(const chttp2::FlowControlAction& action,
260
+ RefCountedPtr<Stream> stream);
261
+
262
+ void NotifyStateWatcherOnDisconnectLocked(
263
+ absl::Status status, StateWatcher::DisconnectInfo disconnect_info)
264
+ ABSL_EXCLUSIVE_LOCKS_REQUIRED(&transport_mutex_);
231
265
 
232
266
  RefCountedPtr<Party> general_party_;
267
+ std::shared_ptr<grpc_event_engine::experimental::EventEngine> event_engine_;
233
268
 
234
269
  PromiseEndpoint endpoint_;
235
- Http2SettingsManager settings_;
236
- Duration settings_timeout_;
270
+ RefCountedPtr<SettingsPromiseManager> settings_;
237
271
 
238
272
  Http2FrameHeader current_frame_header_;
273
+ // Returns the number of active streams. A stream is removed from the `active`
274
+ // list once both client and server agree to close the stream. The count of
275
+ // stream_list_(even though stream list represents streams open for reads)
276
+ // works here because of the following cases where the stream is closed:
277
+ // 1. Reading a RST stream frame: In this case, the stream is immediately
278
+ // closed for reads and writes and removed from the stream_list_
279
+ // (effectively tracking the number of active streams).
280
+ // 2. Reading a Trailing Metadata frame: In this case, the stream MAY be
281
+ // closed for reads and writes immediately which follows the above case. In
282
+ // other cases, the transport either reads RST stream frame from the server
283
+ // (and follows case 1) or sends a half close frame and closes the stream
284
+ // for reads and writes (in the multiplexer loop).
285
+ // 3. Hitting error condition in the transport: In this case, RST stream is
286
+ // is enqueued and the stream is closed for reads immediately. This means
287
+ // we effectively reduce the number of active streams inline (because we
288
+ // remove the stream from the stream_list_). This is fine because the
289
+ // priority logic in list of writable streams ensures that the RST stream
290
+ // frame is given priority over any new streams being created by the
291
+ // client.
292
+ // 4. Application abort: In this case, multiplexer loop will write RST stream
293
+ // frame to the endpoint and close the stream from reads and writes. This
294
+ // then follows the same reasoning as case 1.
295
+ inline uint32_t GetActiveStreamCountLocked() const
296
+ ABSL_EXCLUSIVE_LOCKS_REQUIRED(transport_mutex_) {
297
+ return stream_list_.size();
298
+ }
239
299
 
240
- // Managing the streams
241
- struct Stream : public RefCounted<Stream> {
242
- explicit Stream(CallHandler call, const uint32_t stream_id1)
243
- : call(std::move(call)),
244
- stream_state(HttpStreamState::kIdle),
245
- stream_id(stream_id1),
246
- header_assembler(stream_id1),
247
- did_push_initial_metadata(false),
248
- did_push_trailing_metadata(false),
249
- data_queue(MakeRefCounted<StreamDataQueue<ClientMetadataHandle>>(
250
- /*is_client*/ true, /*stream_id*/ stream_id1,
251
- /*queue_size*/ kStreamQueueSize)) {}
252
-
253
- ////////////////////////////////////////////////////////////////////////////
254
- // Data Queue Helpers
255
-
256
- auto EnqueueInitialMetadata(ClientMetadataHandle&& metadata) {
257
- GRPC_HTTP2_CLIENT_DLOG
258
- << "Http2ClientTransport::Stream::EnqueueInitialMetadata stream_id="
259
- << stream_id;
260
- return data_queue->EnqueueInitialMetadata(std::move(metadata));
261
- }
262
-
263
- auto EnqueueTrailingMetadata(ClientMetadataHandle&& metadata) {
264
- GRPC_HTTP2_CLIENT_DLOG
265
- << "Http2ClientTransport::Stream::EnqueueTrailingMetadata stream_id="
266
- << stream_id;
267
- return data_queue->EnqueueTrailingMetadata(std::move(metadata));
268
- }
269
-
270
- auto EnqueueMessage(MessageHandle&& message) {
271
- GRPC_HTTP2_CLIENT_DLOG
272
- << "Http2ClientTransport::Stream::EnqueueMessage stream_id="
273
- << stream_id
274
- << " with payload size = " << message->payload()->Length();
275
- return data_queue->EnqueueMessage(std::move(message));
276
- }
277
-
278
- auto EnqueueHalfClosed() {
279
- GRPC_HTTP2_CLIENT_DLOG
280
- << "Http2ClientTransport::Stream::EnqueueHalfClosed stream_id="
281
- << stream_id;
282
- return data_queue->EnqueueHalfClosed();
283
- }
284
-
285
- auto EnqueueResetStream(const uint32_t error_code) {
286
- GRPC_HTTP2_CLIENT_DLOG
287
- << "Http2ClientTransport::Stream::EnqueueResetStream stream_id="
288
- << stream_id << " with error_code = " << error_code;
289
- return data_queue->EnqueueResetStream(error_code);
290
- }
291
-
292
- auto DequeueFrames(const uint32_t transport_tokens,
293
- const uint32_t max_frame_length,
294
- HPackCompressor& encoder) {
295
- return data_queue->DequeueFrames(transport_tokens, max_frame_length,
296
- encoder);
297
- }
298
-
299
- ////////////////////////////////////////////////////////////////////////////
300
- // Stream State Management
301
-
302
- // Modify the stream state
303
- // The possible stream transitions are as follows:
304
- // kIdle -> kOpen
305
- // kOpen -> kClosed/kHalfClosedLocal/kHalfClosedRemote
306
- // kHalfClosedLocal/kHalfClosedRemote -> kClosed
307
- // kClosed -> kClosed
308
- void SentInitialMetadata() {
309
- DCHECK(stream_state == HttpStreamState::kIdle);
310
- stream_state = HttpStreamState::kOpen;
311
- }
312
-
313
- void MarkHalfClosedLocal() {
314
- switch (stream_state) {
315
- case HttpStreamState::kIdle:
316
- DCHECK(false) << "MarkHalfClosedLocal called for an idle stream";
317
- break;
318
- case HttpStreamState::kOpen:
319
- stream_state = HttpStreamState::kHalfClosedLocal;
320
- break;
321
- case HttpStreamState::kHalfClosedRemote:
322
- stream_state = HttpStreamState::kClosed;
323
- break;
324
- case HttpStreamState::kHalfClosedLocal:
325
- break;
326
- case HttpStreamState::kClosed:
327
- DCHECK(false) << "MarkHalfClosedLocal called for a closed stream";
328
- break;
329
- }
330
- }
331
-
332
- void MarkHalfClosedRemote() {
333
- switch (stream_state) {
334
- case HttpStreamState::kIdle:
335
- DCHECK(false) << "MarkHalfClosedRemote called for an idle stream";
336
- break;
337
- case HttpStreamState::kOpen:
338
- stream_state = HttpStreamState::kHalfClosedRemote;
339
- break;
340
- case HttpStreamState::kHalfClosedLocal:
341
- stream_state = HttpStreamState::kClosed;
342
- break;
343
- case HttpStreamState::kHalfClosedRemote:
344
- break;
345
- case HttpStreamState::kClosed:
346
- DCHECK(false) << "MarkHalfClosedRemote called for a closed stream";
347
- break;
348
- }
349
- }
350
-
351
- HttpStreamState GetStreamState() const { return stream_state; }
352
-
353
- inline bool IsClosed() const {
354
- return stream_state == HttpStreamState::kClosed;
355
- }
356
-
357
- CallHandler call;
358
- // TODO(akshitpatel) : [PH2][P3] : Investigate if this needs to be atomic.
359
- HttpStreamState stream_state;
360
- const uint32_t stream_id;
361
- GrpcMessageAssembler assembler;
362
- HeaderAssembler header_assembler;
363
- // TODO(akshitpatel) : [PH2][P2] : StreamQ should maintain a flag that
364
- // tracks if the half close has been sent for this stream. This flag is used
365
- // to notify the mixer that this stream is closed for
366
- // writes(HalfClosedLocal). When the mixer dequeues the last message for
367
- // the streamQ, it will mark the stream as closed for writes and send a
368
- // frame with end_stream or set the end_stream flag in the last data
369
- // frame being sent out. This is done as the stream state should not
370
- // transition to HalfClosedLocal till the end_stream frame is sent.
371
- bool did_push_initial_metadata;
372
- bool did_push_trailing_metadata;
373
- RefCountedPtr<StreamDataQueue<ClientMetadataHandle>> data_queue;
374
- };
375
-
376
- uint32_t NextStreamId(
377
- InterActivityMutex<uint32_t>::Lock& next_stream_id_lock) {
378
- const uint32_t stream_id = *next_stream_id_lock;
379
- if (stream_id > RFC9113::kMaxStreamId31Bit) {
300
+ // Returns the next stream id. If the next stream id is not available, it
301
+ // returns std::nullopt. MUST be called from the transport party.
302
+ absl::StatusOr<uint32_t> NextStreamId() {
303
+ if (next_stream_id_ > GetMaxAllowedStreamId()) {
380
304
  // TODO(tjagtap) : [PH2][P3] : Handle case if transport runs out of stream
381
305
  // ids
382
306
  // RFC9113 : Stream identifiers cannot be reused. Long-lived connections
@@ -386,75 +310,109 @@ class Http2ClientTransport final : public ClientTransport {
386
310
  // that is unable to establish a new stream identifier can send a GOAWAY
387
311
  // frame so that the client is forced to open a new connection for new
388
312
  // streams.
313
+ return absl::ResourceExhaustedError("No more stream ids available");
314
+ }
315
+ // TODO(akshitpatel) : [PH2][P3] : There is a channel arg to delay
316
+ // starting new streams instead of failing them. This needs to be
317
+ // implemented.
318
+ {
319
+ MutexLock lock(&transport_mutex_);
320
+ if (GetActiveStreamCountLocked() >=
321
+ settings_->peer().max_concurrent_streams()) {
322
+ return absl::ResourceExhaustedError("Reached max concurrent streams");
323
+ }
389
324
  }
325
+
390
326
  // RFC9113 : Streams initiated by a client MUST use odd-numbered stream
391
327
  // identifiers.
392
- (*next_stream_id_lock) += 2;
393
- return stream_id;
328
+ uint32_t new_stream_id =
329
+ std::exchange(next_stream_id_, next_stream_id_ + 2);
330
+ if (GPR_UNLIKELY(next_stream_id_ > GetMaxAllowedStreamId())) {
331
+ ReportDisconnection(
332
+ absl::ResourceExhaustedError("Transport Stream IDs exhausted"),
333
+ {}, // TODO(tjagtap) : [PH2][P2] : Report better disconnect info.
334
+ "no_more_stream_ids");
335
+ }
336
+ return new_stream_id;
394
337
  }
395
338
 
396
- MpscReceiver<Http2Frame> outgoing_frames_;
339
+ // Returns the next stream id without incrementing it. MUST be called from the
340
+ // transport party.
341
+ uint32_t PeekNextStreamId() const { return next_stream_id_; }
342
+
343
+ // Returns the last stream id sent by the transport. If no streams were sent,
344
+ // returns 0. MUST be called from the transport party.
345
+ uint32_t GetLastStreamId() const {
346
+ const uint32_t next_stream_id = PeekNextStreamId();
347
+ return (next_stream_id > 1) ? (next_stream_id - 2) : 0;
348
+ }
349
+
350
+ absl::Status InitializeStream(RefCountedPtr<Stream> stream);
351
+
352
+ void AddToStreamList(RefCountedPtr<Stream> stream);
397
353
 
398
354
  Mutex transport_mutex_;
399
- // TODO(tjagtap) : [PH2][P2] : Add to map in StartCall and clean this
400
- // mapping up in the on_done of the CallInitiator or CallHandler
355
+
401
356
  absl::flat_hash_map<uint32_t, RefCountedPtr<Stream>> stream_list_
402
357
  ABSL_GUARDED_BY(transport_mutex_);
403
358
 
404
- // Mutex to preserve the order of headers being sent out for new streams.
405
- // This also tracks the stream_id for creating new streams.
406
- InterActivityMutex<uint32_t> stream_id_mutex_;
359
+ uint32_t next_stream_id_;
407
360
  HPackCompressor encoder_;
408
361
  HPackParser parser_;
409
362
  bool is_transport_closed_ ABSL_GUARDED_BY(transport_mutex_) = false;
363
+ Latch<void> transport_closed_latch_;
364
+
365
+ template <typename Promise>
366
+ auto UntilTransportClosed(Promise promise) {
367
+ return Race(Map(transport_closed_latch_.Wait(),
368
+ [](Empty) {
369
+ GRPC_HTTP2_CLIENT_DLOG << "Transport closed";
370
+ return absl::CancelledError("Transport closed");
371
+ }),
372
+ std::move(promise));
373
+ }
374
+
375
+ // Spawns an infallible promise on the given party.
376
+ template <typename Factory>
377
+ void SpawnInfallible(RefCountedPtr<Party> party, absl::string_view name,
378
+ Factory&& factory);
379
+
380
+ // Spawns an infallible promise on the transport party.
381
+ template <typename Factory>
382
+ void SpawnInfallibleTransportParty(absl::string_view name, Factory&& factory);
383
+
384
+ // Spawns a promise on the transport party. If the promise returns a non-ok
385
+ // status, it is handled by closing the transport with the corresponding
386
+ // status.
387
+ template <typename Factory>
388
+ void SpawnGuardedTransportParty(absl::string_view name, Factory&& factory);
410
389
 
411
390
  ConnectivityStateTracker state_tracker_ ABSL_GUARDED_BY(transport_mutex_){
412
391
  "http2_client", GRPC_CHANNEL_READY};
413
392
 
414
- bool MakeStream(CallHandler call_handler, uint32_t stream_id);
393
+ RefCountedPtr<StateWatcher> watcher_ ABSL_GUARDED_BY(transport_mutex_);
415
394
 
416
- struct CloseStreamArgs {
417
- bool close_reads;
418
- bool close_writes;
419
- bool send_rst_stream;
420
- bool push_trailing_metadata;
421
- };
395
+ // Runs on the call party.
396
+ std::optional<RefCountedPtr<Stream>> MakeStream(CallHandler call_handler);
422
397
 
423
398
  // This function MUST be idempotent.
424
- void CloseStream(uint32_t stream_id, absl::Status status,
425
- CloseStreamArgs args, DebugLocation whence = {});
426
-
427
- RefCountedPtr<Http2ClientTransport::Stream> LookupStream(uint32_t stream_id);
428
-
429
- auto EndpointReadSlice(const size_t num_bytes) {
430
- return Map(endpoint_.ReadSlice(num_bytes),
431
- [self = RefAsSubclass<Http2ClientTransport>()](
432
- absl::StatusOr<Slice> status) {
433
- // We are ignoring the case where the read fails and call
434
- // GotData() regardless. Reasoning:
435
- // 1. It is expected that if the read fails, the transport will
436
- // close and the keepalive loop will be stopped.
437
- // 2. It does not seem worth to have an extra condition for the
438
- // success cases which would be way more common.
439
- self->keepalive_manager_.GotData();
440
- return status;
441
- });
442
- }
399
+ void CloseStream(RefCountedPtr<Stream> stream, CloseStreamArgs args,
400
+ DebugLocation whence = {});
443
401
 
444
- auto EndpointRead(const size_t num_bytes) {
445
- return Map(endpoint_.Read(num_bytes),
446
- [self = RefAsSubclass<Http2ClientTransport>()](
447
- absl::StatusOr<SliceBuffer> status) {
448
- // We are ignoring the case where the read fails and call
449
- // GotData() regardless. Reasoning:
450
- // 1. It is expected that if the read fails, the transport will
451
- // close and the keepalive loop will be stopped.
452
- // 2. It does not seem worth to have an extra condition for the
453
- // success cases which would be way more common.
454
- self->keepalive_manager_.GotData();
455
- return status;
456
- });
457
- }
402
+ void BeginCloseStream(RefCountedPtr<Stream> stream,
403
+ std::optional<uint32_t> reset_stream_error_code,
404
+ ServerMetadataHandle&& metadata,
405
+ DebugLocation whence = {});
406
+
407
+ RefCountedPtr<Stream> LookupStream(uint32_t stream_id);
408
+
409
+ auto EndpointReadSlice(const size_t num_bytes);
410
+ auto EndpointRead(const size_t num_bytes);
411
+
412
+ // HTTP2 Settings
413
+ auto WaitForSettingsTimeoutOnDone();
414
+ void MaybeSpawnWaitForSettingsTimeout();
415
+ void EnforceLatestIncomingSettings();
458
416
 
459
417
  // This function MUST run on the transport party.
460
418
  void CloseTransport();
@@ -470,23 +428,25 @@ class Http2ClientTransport final : public ClientTransport {
470
428
  // should not be cancelled in case of stream errors.
471
429
  // If the error is a connection error, it closes the transport and returns the
472
430
  // corresponding (failed) absl status.
473
- absl::Status HandleError(Http2Status status, DebugLocation whence = {}) {
431
+ absl::Status HandleError(const std::optional<uint32_t> stream_id,
432
+ Http2Status status, DebugLocation whence = {}) {
474
433
  auto error_type = status.GetType();
475
- DCHECK(error_type != Http2Status::Http2ErrorType::kOk);
434
+ GRPC_DCHECK(error_type != Http2Status::Http2ErrorType::kOk);
476
435
 
477
436
  if (error_type == Http2Status::Http2ErrorType::kStreamError) {
478
- LOG(ERROR) << "Stream Error: " << status.DebugString();
479
- CloseStream(current_frame_header_.stream_id, status.GetAbslStreamError(),
480
- CloseStreamArgs{
481
- /*close_reads=*/true,
482
- /*close_writes=*/true,
483
- /*send_rst_stream=*/true,
484
- /*push_trailing_metadata=*/true,
485
- },
486
- whence);
437
+ GRPC_HTTP2_CLIENT_ERROR_DLOG << "Stream Error: " << status.DebugString();
438
+ GRPC_DCHECK(stream_id.has_value());
439
+ // Passing a cancelled server metadata handle to propagate the error
440
+ // to the upper layers.
441
+ BeginCloseStream(
442
+ LookupStream(stream_id.value()),
443
+ Http2ErrorCodeToFrameErrorCode(status.GetStreamErrorCode()),
444
+ CancelledServerMetadataFromStatus(status.GetAbslStreamError()),
445
+ whence);
487
446
  return absl::OkStatus();
488
447
  } else if (error_type == Http2Status::Http2ErrorType::kConnectionError) {
489
- LOG(ERROR) << "Connection Error: " << status.DebugString();
448
+ GRPC_HTTP2_CLIENT_ERROR_DLOG << "Connection Error: "
449
+ << status.DebugString();
490
450
  absl::Status absl_status = status.GetAbslConnectionError();
491
451
  MaybeSpawnCloseTransport(std::move(status), whence);
492
452
  return absl_status;
@@ -494,79 +454,81 @@ class Http2ClientTransport final : public ClientTransport {
494
454
  GPR_UNREACHABLE_CODE(return absl::InternalError("Invalid error type"));
495
455
  }
496
456
 
497
- bool bytes_sent_in_last_write_;
498
- bool incoming_header_in_progress_;
499
- bool incoming_header_end_stream_;
457
+ bool should_reset_ping_clock_;
500
458
  bool is_first_write_;
501
- uint32_t incoming_header_stream_id_;
502
- grpc_closure* on_receive_settings_;
459
+ IncomingMetadataTracker incoming_headers_;
460
+
461
+ // The target number of bytes to write in a single write cycle. We may not
462
+ // always honour this max_write_size. We MAY overshoot it at most once per
463
+ // write cycle.
464
+ size_t max_write_size_;
465
+ // The number of bytes remaining to be written in the current write cycle.
466
+ size_t write_bytes_remaining_;
467
+
468
+ // The max_write_size will be decided dynamically based on the available
469
+ // bandwidth on the wire. We aim to keep the time spent in the write loop to
470
+ // about 100ms.
471
+ void SetMaxWriteSize(const size_t max_write_size) {
472
+ GRPC_HTTP2_CLIENT_DLOG << "Http2ClientTransport SetMaxWriteSize "
473
+ << " max_write_size changed: " << max_write_size_
474
+ << " -> " << max_write_size;
475
+ max_write_size_ = max_write_size;
476
+ }
477
+
478
+ size_t GetMaxWriteSize() const { return max_write_size_; }
479
+
480
+ auto SerializeAndWrite(std::vector<Http2Frame>&& frames);
481
+ // Tracks the max allowed stream id. Currently this is only set on receiving a
482
+ // graceful GOAWAY frame.
483
+ uint32_t max_allowed_stream_id_ = RFC9113::kMaxStreamId31Bit;
484
+
485
+ uint32_t GetMaxAllowedStreamId() const;
503
486
 
504
- uint32_t max_header_list_size_soft_limit_;
487
+ void SetMaxAllowedStreamId(uint32_t max_allowed_stream_id);
488
+
489
+ bool CanCloseTransportLocked() const
490
+ ABSL_EXCLUSIVE_LOCKS_REQUIRED(transport_mutex_);
505
491
 
506
492
  // Ping related members
507
- // TODO(akshitpatel) : [PH2][P2] : Consider removing the timeout related
508
- // members.
509
- // Duration between two consecutive keepalive pings
510
- const Duration keepalive_time_;
511
- // Duration to wait for a keepalive ping ack before triggering timeout. This
512
- // only takes effect if the assigned value is less than the ping timeout.
513
- const Duration keepalive_timeout_;
514
- // Duration to wait for ping ack before triggering timeout
515
- const Duration ping_timeout_;
516
- PingManager ping_manager_;
517
- std::vector<uint64_t> pending_ping_acks_;
518
- KeepaliveManager keepalive_manager_;
493
+
494
+ // Duration between two consecutive keepalive pings.
495
+ Duration keepalive_time_;
496
+ bool test_only_ack_pings_;
497
+ std::optional<PingManager> ping_manager_;
498
+ std::optional<KeepaliveManager> keepalive_manager_;
519
499
 
520
500
  // Flags
521
501
  bool keepalive_permit_without_calls_;
522
502
 
523
503
  auto SendPing(absl::AnyInvocable<void()> on_initiate, bool important) {
524
- return ping_manager_.RequestPing(std::move(on_initiate), important);
504
+ return ping_manager_->RequestPing(std::move(on_initiate), important);
525
505
  }
526
- auto WaitForPingAck() { return ping_manager_.WaitForPingAck(); }
506
+ auto WaitForPingAck() { return ping_manager_->WaitForPingAck(); }
527
507
 
528
- // Ping Helper functions
529
- // Returns a promise that resolves once a ping frame is written to the
530
- // endpoint.
531
- auto CreateAndWritePing(bool ack, uint64_t opaque_data) {
532
- Http2Frame frame = Http2PingFrame{ack, opaque_data};
533
- SliceBuffer output_buf;
534
- Serialize(absl::Span<Http2Frame>(&frame, 1), output_buf);
535
- return endpoint_.Write(std::move(output_buf), {});
536
- }
508
+ void MaybeGetWindowUpdateFrames(SliceBuffer& output_buf);
509
+
510
+ void ReportDisconnection(const absl::Status& status,
511
+ StateWatcher::DisconnectInfo disconnect_info,
512
+ const char* reason);
537
513
 
514
+ void ReportDisconnectionLocked(const absl::Status& status,
515
+ StateWatcher::DisconnectInfo disconnect_info,
516
+ const char* reason)
517
+ ABSL_EXCLUSIVE_LOCKS_REQUIRED(&transport_mutex_);
518
+
519
+ // Ping Helper functions
538
520
  Duration NextAllowedPingInterval() {
539
521
  MutexLock lock(&transport_mutex_);
540
- return (!keepalive_permit_without_calls_ && stream_list_.empty())
522
+ return (!keepalive_permit_without_calls_ &&
523
+ GetActiveStreamCountLocked() == 0)
541
524
  ? Duration::Hours(2)
542
525
  : Duration::Seconds(1);
543
526
  }
544
527
 
545
- auto MaybeSendPing() {
546
- return ping_manager_.MaybeSendPing(NextAllowedPingInterval(),
547
- ping_timeout_);
548
- }
549
-
550
- auto MaybeSendPingAcks() {
551
- return AssertResultType<absl::Status>(If(
552
- pending_ping_acks_.empty(), [] { return absl::OkStatus(); },
553
- [this] {
554
- std::vector<Http2Frame> frames;
555
- frames.reserve(pending_ping_acks_.size());
556
- for (auto& opaque_data : pending_ping_acks_) {
557
- frames.emplace_back(Http2PingFrame{true, opaque_data});
558
- }
559
- pending_ping_acks_.clear();
560
- SliceBuffer output_buf;
561
- Serialize(absl::Span<Http2Frame>(frames), output_buf);
562
- return endpoint_.Write(std::move(output_buf), {});
563
- }));
564
- }
565
-
566
528
  auto AckPing(uint64_t opaque_data) {
567
529
  bool valid_ping_ack_received = true;
568
530
 
569
- if (!ping_manager_.AckPing(opaque_data)) {
531
+ if (!ping_manager_->AckPing(opaque_data)) {
570
532
  GRPC_HTTP2_CLIENT_DLOG << "Unknown ping response received for ping id="
571
533
  << opaque_data;
572
534
  valid_ping_ack_received = false;
@@ -578,13 +540,10 @@ class Http2ClientTransport final : public ClientTransport {
578
540
  // When this happens, it becomes important to ensure that if a ping ack
579
541
  // is received and there is an "important" outstanding ping request, we
580
542
  // should retry to send it out now.
581
- valid_ping_ack_received && ping_manager_.ImportantPingRequested(),
543
+ valid_ping_ack_received && ping_manager_->ImportantPingRequested(),
582
544
  [self = RefAsSubclass<Http2ClientTransport>()] {
583
545
  return Map(self->TriggerWriteCycle(), [](const absl::Status status) {
584
- return (status.ok())
585
- ? Http2Status::Ok()
586
- : Http2Status::AbslConnectionError(
587
- status.code(), std::string(status.message()));
546
+ return ToHttpOkOrConnError(status);
588
547
  });
589
548
  },
590
549
  [] { return Immediate(Http2Status::Ok()); });
@@ -598,29 +557,22 @@ class Http2ClientTransport final : public ClientTransport {
598
557
  PingSystemInterfaceImpl(transport));
599
558
  }
600
559
 
601
- // Returns a promise that resolves once a ping frame is written to the
602
- // endpoint.
603
- Promise<absl::Status> SendPing(SendPingArgs args) override {
604
- return transport_->CreateAndWritePing(args.ack, args.opaque_data);
605
- }
606
-
607
560
  Promise<absl::Status> TriggerWrite() override {
608
561
  return transport_->TriggerWriteCycle();
609
562
  }
610
563
 
611
564
  Promise<absl::Status> PingTimeout() override {
612
- // TODO(akshitpatel) : [PH2][P2] : Trigger goaway here.
613
- // Returns a promise that resolves once goaway is sent.
614
- LOG(INFO) << "Ping timeout at time: " << Timestamp::Now();
565
+ GRPC_HTTP2_CLIENT_DLOG << "Ping timeout at time: " << Timestamp::Now();
615
566
 
616
567
  // TODO(akshitpatel) : [PH2][P2] : The error code here has been chosen
617
568
  // based on CHTTP2's usage of GRPC_STATUS_UNAVAILABLE (which corresponds
618
569
  // to kRefusedStream). However looking at RFC9113, definition of
619
570
  // kRefusedStream doesn't seem to fit this case. We should revisit this
620
571
  // and update the error code.
621
- return Immediate(
622
- transport_->HandleError(Http2Status::Http2ConnectionError(
623
- Http2ErrorCode::kRefusedStream, "Ping timeout")));
572
+ return Immediate(transport_->HandleError(
573
+ std::nullopt,
574
+ Http2Status::Http2ConnectionError(Http2ErrorCode::kRefusedStream,
575
+ GRPC_CHTTP2_PING_TIMEOUT_STR)));
624
576
  }
625
577
 
626
578
  private:
@@ -650,17 +602,17 @@ class Http2ClientTransport final : public ClientTransport {
650
602
  });
651
603
  }
652
604
  Promise<absl::Status> OnKeepAliveTimeout() override {
653
- // TODO(akshitpatel) : [PH2][P2] : Trigger goaway here.
654
- LOG(INFO) << "Keepalive timeout triggered";
605
+ GRPC_HTTP2_CLIENT_DLOG << "Keepalive timeout triggered";
655
606
 
656
607
  // TODO(akshitpatel) : [PH2][P2] : The error code here has been chosen
657
608
  // based on CHTTP2's usage of GRPC_STATUS_UNAVAILABLE (which corresponds
658
609
  // to kRefusedStream). However looking at RFC9113, definition of
659
610
  // kRefusedStream doesn't seem to fit this case. We should revisit this
660
611
  // and update the error code.
661
- return Immediate(
662
- transport_->HandleError(Http2Status::Http2ConnectionError(
663
- Http2ErrorCode::kRefusedStream, "Keepalive timeout")));
612
+ return Immediate(transport_->HandleError(
613
+ std::nullopt, Http2Status::Http2ConnectionError(
614
+ Http2ErrorCode::kRefusedStream,
615
+ GRPC_CHTTP2_KEEPALIVE_TIMEOUT_STR)));
664
616
  }
665
617
 
666
618
  bool NeedToSendKeepAlivePing() override {
@@ -668,7 +620,7 @@ class Http2ClientTransport final : public ClientTransport {
668
620
  {
669
621
  MutexLock lock(&transport_->transport_mutex_);
670
622
  need_to_send_ping = (transport_->keepalive_permit_without_calls_ ||
671
- !transport_->stream_list_.empty());
623
+ transport_->GetActiveStreamCountLocked() > 0);
672
624
  }
673
625
  return need_to_send_ping;
674
626
  }
@@ -680,24 +632,83 @@ class Http2ClientTransport final : public ClientTransport {
680
632
  Http2ClientTransport* transport_;
681
633
  };
682
634
 
683
- WritableStreams writable_stream_list_;
635
+ class GoawayInterfaceImpl : public GoawayInterface {
636
+ public:
637
+ static std::unique_ptr<GoawayInterface> Make(
638
+ Http2ClientTransport* transport) {
639
+ return std::make_unique<GoawayInterfaceImpl>(
640
+ GoawayInterfaceImpl(transport));
641
+ }
642
+
643
+ Promise<absl::Status> SendPingAndWaitForAck() override {
644
+ return transport_->ping_manager_->RequestPing(/*on_initiate=*/[] {},
645
+ /*important=*/true);
646
+ }
647
+
648
+ void TriggerWriteCycle() override { transport_->TriggerWriteCycle(); }
649
+
650
+ uint32_t GetLastAcceptedStreamId() override {
651
+ GRPC_DCHECK(false)
652
+ << "GetLastAcceptedStreamId is not implemented for client transport.";
653
+ LOG(ERROR) << "GetLastAcceptedStreamId is not implemented for client "
654
+ "transport.";
655
+ return 0;
656
+ }
657
+
658
+ private:
659
+ explicit GoawayInterfaceImpl(Http2ClientTransport* transport)
660
+ : transport_(transport) {}
661
+
662
+ Http2ClientTransport* transport_;
663
+ };
664
+
665
+ GoawayManager goaway_manager_;
666
+
667
+ WritableStreams<RefCountedPtr<Stream>> writable_stream_list_;
684
668
 
685
- auto MaybeAddStreamToWritableStreamList(const uint32_t stream_id,
686
- const bool became_writable) {
687
- if (became_writable) {
669
+ absl::Status MaybeAddStreamToWritableStreamList(
670
+ const RefCountedPtr<Stream> stream,
671
+ const StreamDataQueue<ClientMetadataHandle>::StreamWritabilityUpdate
672
+ result) {
673
+ if (result.became_writable) {
688
674
  GRPC_HTTP2_CLIENT_DLOG
689
675
  << "Http2ClientTransport MaybeAddStreamToWritableStreamList "
690
676
  " Stream id: "
691
- << stream_id << " became writable";
692
- absl::Status status = writable_stream_list_.Enqueue(
693
- stream_id, WritableStreams::StreamPriority::kDefault);
677
+ << stream->GetStreamId() << " became writable";
678
+ absl::Status status =
679
+ writable_stream_list_.Enqueue(stream, result.priority);
694
680
  if (!status.ok()) {
695
- return HandleError(Http2Status::Http2ConnectionError(
696
- Http2ErrorCode::kProtocolError, "Failed to enqueue stream"));
681
+ return HandleError(
682
+ std::nullopt,
683
+ Http2Status::Http2ConnectionError(
684
+ Http2ErrorCode::kRefusedStream,
685
+ "Failed to enqueue stream to writable stream list"));
697
686
  }
698
687
  }
699
688
  return absl::OkStatus();
700
689
  }
690
+ bool SetOnDone(CallHandler call_handler, RefCountedPtr<Stream> stream);
691
+ absl::StatusOr<std::vector<Http2Frame>> DequeueStreamFrames(
692
+ RefCountedPtr<Stream> stream);
693
+
694
+ /// Based on channel args, preferred_rx_crypto_frame_sizes are advertised to
695
+ /// the peer
696
+ bool enable_preferred_rx_crypto_frame_advertisement_;
697
+ MemoryOwner memory_owner_;
698
+ chttp2::TransportFlowControl flow_control_;
699
+ std::shared_ptr<PromiseHttp2ZTraceCollector> ztrace_collector_;
700
+ absl::flat_hash_set<uint32_t> window_update_list_;
701
+
702
+ // TODO(tjagtap) [PH2][P2][BDP] Remove this when the BDP code is done.
703
+ Waker periodic_updates_waker_;
704
+
705
+ Http2ReadContext reader_state_;
706
+ Http2Status ParseAndDiscardHeaders(SliceBuffer&& buffer, bool is_end_headers,
707
+ RefCountedPtr<Stream> stream,
708
+ Http2Status&& original_status,
709
+ DebugLocation whence = {});
710
+ void ReadChannelArgs(const ChannelArgs& channel_args,
711
+ TransportChannelArgs& args);
701
712
  };
702
713
 
703
714
  // Since the corresponding class in CHTTP2 is about 3.9KB, our goal is to