grpc 1.76.0 → 1.78.0.pre1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (763) hide show
  1. checksums.yaml +4 -4
  2. data/Makefile +11 -5
  3. data/include/grpc/credentials.h +6 -1
  4. data/include/grpc/event_engine/memory_allocator.h +2 -0
  5. data/include/grpc/impl/channel_arg_names.h +5 -0
  6. data/include/grpc/support/metrics.h +7 -1
  7. data/src/core/call/call_filters.cc +1 -1
  8. data/src/core/call/call_filters.h +175 -1
  9. data/src/core/call/call_spine.cc +1 -1
  10. data/src/core/call/call_spine.h +27 -5
  11. data/src/core/call/channelz_context.h +30 -0
  12. data/src/core/call/client_call.cc +43 -5
  13. data/src/core/call/client_call.h +6 -3
  14. data/src/core/call/filter_fusion.h +4 -4
  15. data/src/core/call/interception_chain.h +7 -6
  16. data/src/core/call/metadata_batch.cc +49 -55
  17. data/src/core/call/metadata_batch.h +7 -6
  18. data/src/core/call/metadata_info.cc +1 -1
  19. data/src/core/call/parsed_metadata.h +2 -2
  20. data/src/core/call/request_buffer.cc +1 -1
  21. data/src/core/call/security_context.cc +1 -1
  22. data/src/core/call/security_context.h +1 -1
  23. data/src/core/call/server_call.cc +1 -1
  24. data/src/core/call/server_call.h +5 -3
  25. data/src/core/call/simple_slice_based_metadata.h +1 -1
  26. data/src/core/call/status_util.cc +1 -1
  27. data/src/core/channelz/channel_trace.cc +1 -1
  28. data/src/core/channelz/channel_trace.h +3 -3
  29. data/src/core/channelz/channelz.cc +13 -11
  30. data/src/core/channelz/channelz.h +41 -6
  31. data/src/core/channelz/channelz_registry.cc +2 -2
  32. data/src/core/channelz/channelz_registry.h +42 -2
  33. data/src/core/channelz/property_list.h +6 -4
  34. data/src/core/channelz/v2tov1/convert.cc +6 -6
  35. data/src/core/channelz/v2tov1/legacy_api.cc +4 -5
  36. data/src/core/channelz/v2tov1/property_list.cc +1 -1
  37. data/src/core/channelz/ztrace_collector.h +14 -2
  38. data/src/core/client_channel/backup_poller.cc +2 -2
  39. data/src/core/client_channel/buffered_call.cc +140 -0
  40. data/src/core/client_channel/buffered_call.h +104 -0
  41. data/src/core/client_channel/client_channel.cc +124 -71
  42. data/src/core/client_channel/client_channel.h +8 -11
  43. data/src/core/client_channel/client_channel_factory.h +1 -1
  44. data/src/core/client_channel/client_channel_filter.cc +393 -663
  45. data/src/core/client_channel/client_channel_filter.h +57 -150
  46. data/src/core/client_channel/client_channel_internal.h +5 -1
  47. data/src/core/client_channel/client_channel_service_config.cc +43 -3
  48. data/src/core/client_channel/client_channel_service_config.h +12 -1
  49. data/src/core/client_channel/config_selector.h +2 -2
  50. data/src/core/client_channel/connector.h +2 -0
  51. data/src/core/client_channel/dynamic_filters.cc +2 -2
  52. data/src/core/client_channel/global_subchannel_pool.h +1 -1
  53. data/src/core/client_channel/lb_metadata.h +1 -1
  54. data/src/core/client_channel/load_balanced_call_destination.cc +3 -5
  55. data/src/core/client_channel/load_balanced_call_destination.h +1 -1
  56. data/src/core/client_channel/retry_filter.cc +2 -2
  57. data/src/core/client_channel/retry_filter_legacy_call_data.cc +6 -7
  58. data/src/core/client_channel/retry_filter_legacy_call_data.h +6 -8
  59. data/src/core/client_channel/retry_service_config.cc +3 -3
  60. data/src/core/client_channel/retry_service_config.h +1 -1
  61. data/src/core/client_channel/subchannel.cc +106 -17
  62. data/src/core/client_channel/subchannel.h +24 -8
  63. data/src/core/client_channel/subchannel_pool_interface.cc +2 -2
  64. data/src/core/client_channel/subchannel_pool_interface.h +1 -1
  65. data/src/core/client_channel/subchannel_stream_client.cc +1 -1
  66. data/src/core/client_channel/subchannel_stream_client.h +3 -3
  67. data/src/core/config/config_vars.cc +8 -2
  68. data/src/core/config/config_vars.h +5 -0
  69. data/src/core/config/core_configuration.h +1 -1
  70. data/src/core/config/load_config.cc +1 -1
  71. data/src/core/credentials/call/call_credentials.h +2 -2
  72. data/src/core/credentials/call/call_creds_registry.h +1 -1
  73. data/src/core/credentials/call/call_creds_registry_init.cc +2 -2
  74. data/src/core/credentials/call/call_creds_util.cc +3 -3
  75. data/src/core/credentials/call/composite/composite_call_credentials.cc +2 -2
  76. data/src/core/credentials/call/composite/composite_call_credentials.h +1 -1
  77. data/src/core/credentials/call/external/aws_external_account_credentials.cc +6 -6
  78. data/src/core/credentials/call/external/aws_external_account_credentials.h +1 -1
  79. data/src/core/credentials/call/external/external_account_credentials.cc +12 -12
  80. data/src/core/credentials/call/external/external_account_credentials.h +1 -1
  81. data/src/core/credentials/call/external/file_external_account_credentials.cc +3 -3
  82. data/src/core/credentials/call/external/file_external_account_credentials.h +1 -1
  83. data/src/core/credentials/call/external/url_external_account_credentials.cc +6 -6
  84. data/src/core/credentials/call/external/url_external_account_credentials.h +1 -1
  85. data/src/core/credentials/call/gcp_service_account_identity/gcp_service_account_identity_credentials.cc +24 -71
  86. data/src/core/credentials/call/gcp_service_account_identity/gcp_service_account_identity_credentials.h +1 -8
  87. data/src/core/credentials/call/iam/iam_credentials.cc +2 -2
  88. data/src/core/credentials/call/iam/iam_credentials.h +1 -1
  89. data/src/core/credentials/call/json_util.cc +1 -1
  90. data/src/core/credentials/call/jwt/json_token.cc +4 -4
  91. data/src/core/credentials/call/jwt/jwt_credentials.cc +3 -3
  92. data/src/core/credentials/call/jwt/jwt_credentials.h +4 -4
  93. data/src/core/credentials/call/jwt/jwt_verifier.cc +5 -5
  94. data/src/core/credentials/call/jwt_token_file/jwt_token_file_call_credentials.cc +2 -2
  95. data/src/core/credentials/call/jwt_token_file/jwt_token_file_call_credentials.h +3 -3
  96. data/src/core/credentials/call/jwt_util.cc +3 -3
  97. data/src/core/credentials/call/jwt_util.h +1 -1
  98. data/src/core/credentials/call/oauth2/oauth2_credentials.cc +29 -60
  99. data/src/core/credentials/call/oauth2/oauth2_credentials.h +3 -9
  100. data/src/core/credentials/call/plugin/plugin_credentials.cc +4 -4
  101. data/src/core/credentials/call/plugin/plugin_credentials.h +2 -2
  102. data/src/core/credentials/call/token_fetcher/token_fetcher_credentials.cc +46 -0
  103. data/src/core/credentials/call/token_fetcher/token_fetcher_credentials.h +32 -3
  104. data/src/core/credentials/transport/alts/alts_credentials.cc +3 -3
  105. data/src/core/credentials/transport/alts/alts_security_connector.cc +3 -3
  106. data/src/core/credentials/transport/alts/check_gcp_environment_no_op.cc +1 -1
  107. data/src/core/credentials/transport/alts/grpc_alts_credentials_client_options.cc +1 -1
  108. data/src/core/credentials/transport/alts/grpc_alts_credentials_options.h +1 -1
  109. data/src/core/credentials/transport/channel_creds_registry.h +1 -1
  110. data/src/core/credentials/transport/channel_creds_registry_init.cc +1 -1
  111. data/src/core/credentials/transport/composite/composite_channel_credentials.cc +2 -2
  112. data/src/core/credentials/transport/composite/composite_channel_credentials.h +1 -1
  113. data/src/core/credentials/transport/fake/fake_credentials.cc +1 -1
  114. data/src/core/credentials/transport/fake/fake_credentials.h +1 -1
  115. data/src/core/credentials/transport/fake/fake_security_connector.cc +5 -5
  116. data/src/core/credentials/transport/google_default/credentials_generic.cc +2 -2
  117. data/src/core/credentials/transport/google_default/google_default_credentials.cc +5 -11
  118. data/src/core/credentials/transport/google_default/google_default_credentials.h +0 -2
  119. data/src/core/credentials/transport/insecure/insecure_security_connector.h +2 -2
  120. data/src/core/credentials/transport/local/local_security_connector.cc +5 -5
  121. data/src/core/credentials/transport/security_connector.cc +1 -1
  122. data/src/core/credentials/transport/security_connector.h +2 -2
  123. data/src/core/credentials/transport/ssl/ssl_credentials.cc +1 -1
  124. data/src/core/credentials/transport/ssl/ssl_security_connector.cc +5 -5
  125. data/src/core/credentials/transport/tls/certificate_provider_factory.h +1 -1
  126. data/src/core/credentials/transport/tls/certificate_provider_registry.cc +1 -1
  127. data/src/core/credentials/transport/tls/certificate_provider_registry.h +1 -1
  128. data/src/core/credentials/transport/tls/grpc_tls_certificate_distributor.cc +1 -1
  129. data/src/core/credentials/transport/tls/grpc_tls_certificate_distributor.h +2 -2
  130. data/src/core/credentials/transport/tls/grpc_tls_certificate_match.cc +1 -1
  131. data/src/core/credentials/transport/tls/grpc_tls_certificate_provider.cc +3 -3
  132. data/src/core/credentials/transport/tls/grpc_tls_certificate_provider.h +3 -3
  133. data/src/core/credentials/transport/tls/grpc_tls_certificate_verifier.cc +1 -1
  134. data/src/core/credentials/transport/tls/grpc_tls_certificate_verifier.h +2 -2
  135. data/src/core/credentials/transport/tls/grpc_tls_credentials_options.cc +1 -1
  136. data/src/core/credentials/transport/tls/grpc_tls_crl_provider.cc +5 -5
  137. data/src/core/credentials/transport/tls/grpc_tls_crl_provider.h +3 -3
  138. data/src/core/credentials/transport/tls/load_system_roots_supported.cc +1 -1
  139. data/src/core/credentials/transport/tls/spiffe_utils.cc +10 -8
  140. data/src/core/credentials/transport/tls/spiffe_utils.h +2 -2
  141. data/src/core/credentials/transport/tls/ssl_utils.cc +4 -4
  142. data/src/core/credentials/transport/tls/ssl_utils.h +2 -2
  143. data/src/core/credentials/transport/tls/tls_credentials.cc +1 -1
  144. data/src/core/credentials/transport/tls/tls_security_connector.cc +4 -4
  145. data/src/core/credentials/transport/tls/tls_security_connector.h +3 -3
  146. data/src/core/credentials/transport/transport_credentials.cc +1 -1
  147. data/src/core/credentials/transport/transport_credentials.h +2 -2
  148. data/src/core/credentials/transport/xds/xds_credentials.h +1 -1
  149. data/src/core/ext/filters/backend_metrics/backend_metric_filter.cc +2 -2
  150. data/src/core/ext/filters/backend_metrics/backend_metric_filter.h +4 -1
  151. data/src/core/ext/filters/channel_idle/legacy_channel_idle_filter.cc +5 -5
  152. data/src/core/ext/filters/channel_idle/legacy_channel_idle_filter.h +2 -2
  153. data/src/core/ext/filters/fault_injection/fault_injection_filter.cc +7 -7
  154. data/src/core/ext/filters/fault_injection/fault_injection_filter.h +6 -3
  155. data/src/core/ext/filters/fault_injection/fault_injection_service_config_parser.h +1 -1
  156. data/src/core/ext/filters/gcp_authentication/gcp_authentication_filter.cc +1 -1
  157. data/src/core/ext/filters/gcp_authentication/gcp_authentication_filter.h +6 -3
  158. data/src/core/ext/filters/gcp_authentication/gcp_authentication_service_config_parser.h +1 -1
  159. data/src/core/ext/filters/http/client/http_client_filter.cc +6 -6
  160. data/src/core/ext/filters/http/client/http_client_filter.h +4 -1
  161. data/src/core/ext/filters/http/client_authority_filter.cc +2 -2
  162. data/src/core/ext/filters/http/client_authority_filter.h +4 -1
  163. data/src/core/ext/filters/http/http_filters_plugin.cc +1 -1
  164. data/src/core/ext/filters/http/message_compress/compression_filter.cc +3 -3
  165. data/src/core/ext/filters/http/message_compress/compression_filter.h +21 -2
  166. data/src/core/ext/filters/http/server/http_server_filter.cc +3 -3
  167. data/src/core/ext/filters/http/server/http_server_filter.h +4 -1
  168. data/src/core/ext/filters/message_size/message_size_filter.cc +2 -2
  169. data/src/core/ext/filters/message_size/message_size_filter.h +8 -2
  170. data/src/core/ext/filters/rbac/rbac_filter.cc +1 -1
  171. data/src/core/ext/filters/rbac/rbac_filter.h +4 -1
  172. data/src/core/ext/filters/rbac/rbac_service_config_parser.cc +3 -3
  173. data/src/core/ext/filters/rbac/rbac_service_config_parser.h +1 -1
  174. data/src/core/ext/filters/stateful_session/stateful_session_filter.cc +7 -7
  175. data/src/core/ext/filters/stateful_session/stateful_session_filter.h +13 -2
  176. data/src/core/ext/filters/stateful_session/stateful_session_service_config_parser.h +1 -1
  177. data/src/core/ext/transport/chttp2/client/chttp2_connector.cc +50 -37
  178. data/src/core/ext/transport/chttp2/client/chttp2_connector.h +2 -3
  179. data/src/core/ext/transport/chttp2/server/chttp2_server.cc +15 -17
  180. data/src/core/ext/transport/chttp2/server/chttp2_server.h +1 -2
  181. data/src/core/ext/transport/chttp2/transport/bin_decoder.cc +2 -2
  182. data/src/core/ext/transport/chttp2/transport/chttp2_transport.cc +210 -60
  183. data/src/core/ext/transport/chttp2/transport/chttp2_transport.h +10 -2
  184. data/src/core/ext/transport/chttp2/transport/flow_control.cc +39 -4
  185. data/src/core/ext/transport/chttp2/transport/flow_control.h +213 -78
  186. data/src/core/ext/transport/chttp2/transport/flow_control_manager.h +46 -1
  187. data/src/core/ext/transport/chttp2/transport/frame.cc +147 -21
  188. data/src/core/ext/transport/chttp2/transport/frame.h +44 -10
  189. data/src/core/ext/transport/chttp2/transport/frame_data.cc +2 -2
  190. data/src/core/ext/transport/chttp2/transport/frame_data.h +1 -1
  191. data/src/core/ext/transport/chttp2/transport/frame_goaway.cc +2 -2
  192. data/src/core/ext/transport/chttp2/transport/frame_ping.cc +4 -4
  193. data/src/core/ext/transport/chttp2/transport/frame_rst_stream.cc +5 -5
  194. data/src/core/ext/transport/chttp2/transport/frame_security.cc +1 -1
  195. data/src/core/ext/transport/chttp2/transport/frame_settings.cc +7 -15
  196. data/src/core/ext/transport/chttp2/transport/frame_window_update.cc +3 -3
  197. data/src/core/ext/transport/chttp2/transport/goaway.cc +129 -0
  198. data/src/core/ext/transport/chttp2/transport/goaway.h +350 -0
  199. data/src/core/ext/transport/chttp2/transport/header_assembler.h +175 -51
  200. data/src/core/ext/transport/chttp2/transport/hpack_encoder.cc +1 -1
  201. data/src/core/ext/transport/chttp2/transport/hpack_encoder.h +4 -4
  202. data/src/core/ext/transport/chttp2/transport/hpack_parse_result.cc +1 -1
  203. data/src/core/ext/transport/chttp2/transport/hpack_parse_result.h +3 -3
  204. data/src/core/ext/transport/chttp2/transport/hpack_parser.cc +7 -7
  205. data/src/core/ext/transport/chttp2/transport/hpack_parser.h +4 -4
  206. data/src/core/ext/transport/chttp2/transport/hpack_parser_table.cc +4 -4
  207. data/src/core/ext/transport/chttp2/transport/hpack_parser_table.h +1 -1
  208. data/src/core/ext/transport/chttp2/transport/http2_client_transport.cc +1177 -511
  209. data/src/core/ext/transport/chttp2/transport/http2_client_transport.h +264 -174
  210. data/src/core/ext/transport/chttp2/transport/http2_settings.cc +1 -1
  211. data/src/core/ext/transport/chttp2/transport/http2_settings.h +6 -4
  212. data/src/core/ext/transport/chttp2/transport/http2_settings_manager.cc +4 -6
  213. data/src/core/ext/transport/chttp2/transport/http2_settings_manager.h +6 -16
  214. data/src/core/ext/transport/chttp2/transport/http2_settings_promises.h +320 -82
  215. data/src/core/ext/transport/chttp2/transport/http2_status.h +7 -1
  216. data/src/core/ext/transport/chttp2/transport/http2_transport.cc +286 -7
  217. data/src/core/ext/transport/chttp2/transport/http2_transport.h +187 -19
  218. data/src/core/ext/transport/chttp2/transport/http2_ztrace_collector.h +57 -1
  219. data/src/core/ext/transport/chttp2/transport/incoming_metadata_tracker.h +128 -0
  220. data/src/core/ext/transport/chttp2/transport/internal.h +25 -5
  221. data/src/core/ext/transport/chttp2/transport/keepalive.cc +12 -5
  222. data/src/core/ext/transport/chttp2/transport/keepalive.h +14 -10
  223. data/src/core/ext/transport/chttp2/transport/message_assembler.h +24 -15
  224. data/src/core/ext/transport/chttp2/transport/parsing.cc +8 -8
  225. data/src/core/ext/transport/chttp2/transport/ping_callbacks.cc +1 -1
  226. data/src/core/ext/transport/chttp2/transport/ping_callbacks.h +3 -3
  227. data/src/core/ext/transport/chttp2/transport/ping_promise.cc +11 -5
  228. data/src/core/ext/transport/chttp2/transport/ping_promise.h +7 -3
  229. data/src/core/ext/transport/chttp2/transport/ping_rate_policy.cc +1 -1
  230. data/src/core/ext/transport/chttp2/transport/security_frame.cc +31 -0
  231. data/src/core/ext/transport/chttp2/transport/security_frame.h +32 -0
  232. data/src/core/ext/transport/chttp2/transport/stream.h +139 -59
  233. data/src/core/ext/transport/chttp2/transport/stream_data_queue.h +225 -98
  234. data/src/core/ext/transport/chttp2/transport/stream_lists.cc +1 -1
  235. data/src/core/ext/transport/chttp2/transport/transport_common.cc +1 -1
  236. data/src/core/ext/transport/chttp2/transport/transport_common.h +5 -0
  237. data/src/core/ext/transport/chttp2/transport/writable_streams.h +27 -11
  238. data/src/core/ext/transport/chttp2/transport/writing.cc +3 -3
  239. data/src/core/ext/transport/inproc/inproc_transport.cc +8 -2
  240. data/src/core/ext/transport/inproc/legacy_inproc_transport.cc +8 -5
  241. data/src/core/filter/auth/auth_filters.h +7 -1
  242. data/src/core/filter/auth/client_auth_filter.cc +2 -2
  243. data/src/core/filter/auth/server_auth_filter.cc +3 -3
  244. data/src/core/filter/blackboard.h +2 -2
  245. data/src/core/filter/filter_args.h +40 -2
  246. data/src/core/handshaker/endpoint_info/endpoint_info_handshaker.cc +2 -2
  247. data/src/core/handshaker/handshaker.cc +5 -5
  248. data/src/core/handshaker/handshaker.h +2 -2
  249. data/src/core/handshaker/http_connect/http_connect_handshaker.cc +5 -5
  250. data/src/core/handshaker/http_connect/http_proxy_mapper.cc +11 -11
  251. data/src/core/handshaker/http_connect/http_proxy_mapper.h +1 -1
  252. data/src/core/handshaker/http_connect/xds_http_proxy_mapper.cc +1 -1
  253. data/src/core/handshaker/http_connect/xds_http_proxy_mapper.h +1 -1
  254. data/src/core/handshaker/proxy_mapper.h +1 -1
  255. data/src/core/handshaker/proxy_mapper_registry.h +1 -1
  256. data/src/core/handshaker/security/legacy_secure_endpoint.cc +4 -4
  257. data/src/core/handshaker/security/pipelined_secure_endpoint.cc +7 -7
  258. data/src/core/handshaker/security/secure_endpoint.cc +15 -5
  259. data/src/core/handshaker/security/security_handshaker.cc +8 -5
  260. data/src/core/handshaker/security/security_handshaker.h +1 -1
  261. data/src/core/handshaker/tcp_connect/tcp_connect_handshaker.cc +4 -4
  262. data/src/core/lib/address_utils/parse_address.cc +5 -5
  263. data/src/core/lib/address_utils/parse_address.h +2 -2
  264. data/src/core/lib/address_utils/sockaddr_utils.cc +4 -4
  265. data/src/core/lib/address_utils/sockaddr_utils.h +1 -1
  266. data/src/core/lib/channel/channel_args.cc +1 -1
  267. data/src/core/lib/channel/channel_args.h +2 -2
  268. data/src/core/lib/channel/channel_stack.cc +22 -21
  269. data/src/core/lib/channel/channel_stack.h +5 -3
  270. data/src/core/lib/channel/channel_stack_builder.cc +8 -4
  271. data/src/core/lib/channel/channel_stack_builder.h +10 -9
  272. data/src/core/lib/channel/channel_stack_builder_impl.cc +7 -13
  273. data/src/core/lib/channel/channel_stack_builder_impl.h +1 -1
  274. data/src/core/lib/channel/connected_channel.cc +2 -2
  275. data/src/core/lib/channel/promise_based_filter.cc +63 -8
  276. data/src/core/lib/channel/promise_based_filter.h +23 -8
  277. data/src/core/lib/compression/compression_internal.cc +4 -4
  278. data/src/core/lib/compression/compression_internal.h +1 -1
  279. data/src/core/lib/compression/message_compress.cc +1 -1
  280. data/src/core/lib/debug/trace.cc +2 -5
  281. data/src/core/lib/debug/trace.h +10 -0
  282. data/src/core/lib/debug/trace_flags.cc +2 -2
  283. data/src/core/lib/debug/trace_flags.h +1 -1
  284. data/src/core/lib/event_engine/ares_resolver.cc +8 -8
  285. data/src/core/lib/event_engine/ares_resolver.h +4 -4
  286. data/src/core/lib/event_engine/cf_engine/cf_engine.cc +1 -1
  287. data/src/core/lib/event_engine/cf_engine/cfstream_endpoint.cc +2 -2
  288. data/src/core/lib/event_engine/cf_engine/cfstream_endpoint.h +1 -1
  289. data/src/core/lib/event_engine/cf_engine/dns_service_resolver.cc +2 -2
  290. data/src/core/lib/event_engine/cf_engine/dns_service_resolver.h +1 -1
  291. data/src/core/lib/event_engine/channel_args_endpoint_config.h +1 -1
  292. data/src/core/lib/event_engine/default_event_engine.cc +1 -1
  293. data/src/core/lib/event_engine/event_engine.cc +1 -1
  294. data/src/core/lib/event_engine/extensions/channelz.h +1 -1
  295. data/src/core/lib/event_engine/extensions/chaotic_good_extension.h +1 -1
  296. data/src/core/lib/event_engine/extensions/tcp_trace.h +8 -1
  297. data/src/core/lib/event_engine/grpc_polled_fd.h +1 -1
  298. data/src/core/lib/event_engine/memory_allocator_factory.h +1 -1
  299. data/src/core/lib/event_engine/posix_engine/ev_epoll1_linux.cc +4 -4
  300. data/src/core/lib/event_engine/posix_engine/ev_epoll1_linux.h +5 -5
  301. data/src/core/lib/event_engine/posix_engine/ev_poll_posix.cc +5 -5
  302. data/src/core/lib/event_engine/posix_engine/ev_poll_posix.h +3 -3
  303. data/src/core/lib/event_engine/posix_engine/event_poller.h +2 -2
  304. data/src/core/lib/event_engine/posix_engine/event_poller_posix_default.cc +2 -2
  305. data/src/core/lib/event_engine/posix_engine/file_descriptor_collection.cc +1 -1
  306. data/src/core/lib/event_engine/posix_engine/file_descriptor_collection.h +1 -1
  307. data/src/core/lib/event_engine/posix_engine/grpc_polled_fd_posix.h +4 -4
  308. data/src/core/lib/event_engine/posix_engine/internal_errqueue.cc +1 -1
  309. data/src/core/lib/event_engine/posix_engine/lockfree_event.cc +1 -1
  310. data/src/core/lib/event_engine/posix_engine/lockfree_event.h +1 -1
  311. data/src/core/lib/event_engine/posix_engine/native_posix_dns_resolver.cc +3 -3
  312. data/src/core/lib/event_engine/posix_engine/native_posix_dns_resolver.h +1 -1
  313. data/src/core/lib/event_engine/posix_engine/posix_endpoint.cc +5 -5
  314. data/src/core/lib/event_engine/posix_engine/posix_endpoint.h +6 -6
  315. data/src/core/lib/event_engine/posix_engine/posix_engine.cc +7 -7
  316. data/src/core/lib/event_engine/posix_engine/posix_engine.h +7 -7
  317. data/src/core/lib/event_engine/posix_engine/posix_engine_listener.cc +7 -4
  318. data/src/core/lib/event_engine/posix_engine/posix_engine_listener.h +4 -4
  319. data/src/core/lib/event_engine/posix_engine/posix_engine_listener_utils.cc +4 -4
  320. data/src/core/lib/event_engine/posix_engine/posix_engine_listener_utils.h +1 -1
  321. data/src/core/lib/event_engine/posix_engine/posix_interface.h +1 -1
  322. data/src/core/lib/event_engine/posix_engine/posix_interface_posix.cc +5 -5
  323. data/src/core/lib/event_engine/posix_engine/posix_write_event_sink.h +1 -1
  324. data/src/core/lib/event_engine/posix_engine/tcp_socket_utils.h +1 -1
  325. data/src/core/lib/event_engine/posix_engine/timer.h +1 -1
  326. data/src/core/lib/event_engine/posix_engine/timer_manager.cc +2 -2
  327. data/src/core/lib/event_engine/posix_engine/timer_manager.h +1 -1
  328. data/src/core/lib/event_engine/posix_engine/traced_buffer_list.cc +2 -2
  329. data/src/core/lib/event_engine/posix_engine/traced_buffer_list.h +2 -2
  330. data/src/core/lib/event_engine/posix_engine/wakeup_fd_eventfd.cc +1 -1
  331. data/src/core/lib/event_engine/posix_engine/wakeup_fd_eventfd.h +2 -2
  332. data/src/core/lib/event_engine/posix_engine/wakeup_fd_pipe.cc +1 -1
  333. data/src/core/lib/event_engine/posix_engine/wakeup_fd_pipe.h +2 -2
  334. data/src/core/lib/event_engine/posix_engine/wakeup_fd_posix.h +1 -1
  335. data/src/core/lib/event_engine/posix_engine/wakeup_fd_posix_default.cc +2 -2
  336. data/src/core/lib/event_engine/posix_engine/wakeup_fd_posix_default.h +1 -1
  337. data/src/core/lib/event_engine/ref_counted_dns_resolver_interface.h +1 -1
  338. data/src/core/lib/event_engine/tcp_socket_utils.cc +4 -4
  339. data/src/core/lib/event_engine/thread_pool/thread_count.cc +1 -1
  340. data/src/core/lib/event_engine/thread_pool/thread_count.h +1 -1
  341. data/src/core/lib/event_engine/thread_pool/work_stealing_thread_pool.cc +4 -4
  342. data/src/core/lib/event_engine/thread_pool/work_stealing_thread_pool.h +3 -3
  343. data/src/core/lib/event_engine/utils.cc +3 -3
  344. data/src/core/lib/event_engine/utils.h +1 -1
  345. data/src/core/lib/event_engine/windows/grpc_polled_fd_windows.cc +1 -1
  346. data/src/core/lib/event_engine/windows/grpc_polled_fd_windows.h +2 -2
  347. data/src/core/lib/event_engine/windows/iocp.cc +1 -1
  348. data/src/core/lib/event_engine/windows/iocp.h +1 -1
  349. data/src/core/lib/event_engine/windows/native_windows_dns_resolver.cc +5 -2
  350. data/src/core/lib/event_engine/windows/win_socket.cc +1 -1
  351. data/src/core/lib/event_engine/windows/win_socket.h +2 -2
  352. data/src/core/lib/event_engine/windows/windows_endpoint.cc +5 -5
  353. data/src/core/lib/event_engine/windows/windows_engine.cc +4 -4
  354. data/src/core/lib/event_engine/windows/windows_engine.h +3 -3
  355. data/src/core/lib/event_engine/windows/windows_listener.cc +3 -3
  356. data/src/core/lib/event_engine/windows/windows_listener.h +2 -2
  357. data/src/core/lib/event_engine/work_queue/basic_work_queue.h +2 -2
  358. data/src/core/lib/experiments/config.cc +4 -4
  359. data/src/core/lib/experiments/experiments.cc +174 -48
  360. data/src/core/lib/experiments/experiments.h +76 -24
  361. data/src/core/lib/iomgr/buffer_list.cc +1 -1
  362. data/src/core/lib/iomgr/call_combiner.cc +1 -1
  363. data/src/core/lib/iomgr/call_combiner.h +2 -2
  364. data/src/core/lib/iomgr/cfstream_handle.cc +1 -1
  365. data/src/core/lib/iomgr/closure.h +2 -2
  366. data/src/core/lib/iomgr/combiner.cc +2 -2
  367. data/src/core/lib/iomgr/endpoint.h +1 -1
  368. data/src/core/lib/iomgr/endpoint_cfstream.cc +1 -1
  369. data/src/core/lib/iomgr/endpoint_pair_posix.cc +1 -1
  370. data/src/core/lib/iomgr/endpoint_pair_windows.cc +1 -1
  371. data/src/core/lib/iomgr/error.cc +1 -1
  372. data/src/core/lib/iomgr/error.h +2 -2
  373. data/src/core/lib/iomgr/error_cfstream.cc +1 -1
  374. data/src/core/lib/iomgr/ev_apple.cc +1 -1
  375. data/src/core/lib/iomgr/ev_epoll1_linux.cc +4 -4
  376. data/src/core/lib/iomgr/ev_poll_posix.cc +3 -3
  377. data/src/core/lib/iomgr/ev_posix.cc +3 -3
  378. data/src/core/lib/iomgr/event_engine_shims/closure.cc +3 -3
  379. data/src/core/lib/iomgr/event_engine_shims/closure.h +1 -1
  380. data/src/core/lib/iomgr/event_engine_shims/endpoint.cc +5 -5
  381. data/src/core/lib/iomgr/event_engine_shims/tcp_client.cc +2 -2
  382. data/src/core/lib/iomgr/exec_ctx.cc +3 -3
  383. data/src/core/lib/iomgr/exec_ctx.h +1 -1
  384. data/src/core/lib/iomgr/fork_posix.cc +1 -1
  385. data/src/core/lib/iomgr/internal_errqueue.cc +1 -1
  386. data/src/core/lib/iomgr/iocp_windows.cc +1 -1
  387. data/src/core/lib/iomgr/iomgr.cc +1 -1
  388. data/src/core/lib/iomgr/lockfree_event.cc +1 -1
  389. data/src/core/lib/iomgr/polling_entity.cc +1 -1
  390. data/src/core/lib/iomgr/resolve_address.cc +1 -1
  391. data/src/core/lib/iomgr/resolve_address.h +2 -2
  392. data/src/core/lib/iomgr/resolve_address_posix.cc +4 -4
  393. data/src/core/lib/iomgr/resolve_address_windows.cc +1 -1
  394. data/src/core/lib/iomgr/sockaddr_utils_posix.cc +1 -1
  395. data/src/core/lib/iomgr/socket_utils_common_posix.cc +2 -2
  396. data/src/core/lib/iomgr/socket_windows.cc +2 -2
  397. data/src/core/lib/iomgr/tcp_client_cfstream.cc +1 -1
  398. data/src/core/lib/iomgr/tcp_client_posix.cc +3 -3
  399. data/src/core/lib/iomgr/tcp_posix.cc +5 -5
  400. data/src/core/lib/iomgr/tcp_server_posix.cc +20 -9
  401. data/src/core/lib/iomgr/tcp_server_utils_posix.h +1 -1
  402. data/src/core/lib/iomgr/tcp_server_utils_posix_common.cc +2 -2
  403. data/src/core/lib/iomgr/tcp_server_utils_posix_ifaddrs.cc +2 -2
  404. data/src/core/lib/iomgr/tcp_server_windows.cc +2 -2
  405. data/src/core/lib/iomgr/tcp_windows.cc +1 -1
  406. data/src/core/lib/iomgr/timer_generic.cc +3 -3
  407. data/src/core/lib/iomgr/timer_manager.cc +1 -1
  408. data/src/core/lib/iomgr/unix_sockets_posix.cc +1 -1
  409. data/src/core/lib/iomgr/unix_sockets_posix.h +1 -1
  410. data/src/core/lib/iomgr/vsock.cc +1 -1
  411. data/src/core/lib/iomgr/vsock.h +1 -1
  412. data/src/core/lib/iomgr/wakeup_fd_pipe.cc +1 -1
  413. data/src/core/lib/promise/activity.cc +2 -2
  414. data/src/core/lib/promise/activity.h +5 -4
  415. data/src/core/lib/promise/all_ok.h +3 -3
  416. data/src/core/lib/promise/arena_promise.h +47 -6
  417. data/src/core/lib/promise/context.h +1 -1
  418. data/src/core/lib/promise/detail/join_state.h +1 -1
  419. data/src/core/lib/promise/detail/promise_factory.h +1 -1
  420. data/src/core/lib/promise/detail/promise_like.h +1 -1
  421. data/src/core/lib/promise/detail/seq_state.h +3 -3
  422. data/src/core/lib/promise/detail/status.h +1 -1
  423. data/src/core/lib/promise/exec_ctx_wakeup_scheduler.h +1 -1
  424. data/src/core/lib/promise/for_each.h +3 -3
  425. data/src/core/lib/promise/if.h +1 -1
  426. data/src/core/lib/promise/inter_activity_latch.h +3 -3
  427. data/src/core/lib/promise/inter_activity_mutex.h +1 -1
  428. data/src/core/lib/promise/interceptor_list.h +3 -3
  429. data/src/core/lib/promise/latch.h +2 -2
  430. data/src/core/lib/promise/loop.h +2 -2
  431. data/src/core/lib/promise/map.h +2 -2
  432. data/src/core/lib/promise/mpsc.cc +5 -4
  433. data/src/core/lib/promise/observable.h +2 -2
  434. data/src/core/lib/promise/party.cc +14 -8
  435. data/src/core/lib/promise/party.h +11 -4
  436. data/src/core/lib/promise/pipe.h +16 -2
  437. data/src/core/lib/promise/poll.h +2 -2
  438. data/src/core/lib/promise/promise.h +2 -2
  439. data/src/core/lib/promise/sleep.h +1 -1
  440. data/src/core/lib/promise/status_flag.h +2 -2
  441. data/src/core/lib/promise/try_join.h +3 -3
  442. data/src/core/lib/promise/try_seq.h +3 -3
  443. data/src/core/lib/promise/wait_set.h +2 -2
  444. data/src/core/lib/resource_quota/api.cc +1 -1
  445. data/src/core/lib/resource_quota/arena.cc +1 -1
  446. data/src/core/lib/resource_quota/connection_quota.h +1 -1
  447. data/src/core/lib/resource_quota/memory_quota.cc +3 -3
  448. data/src/core/lib/resource_quota/memory_quota.h +9 -5
  449. data/src/core/lib/resource_quota/periodic_update.h +1 -1
  450. data/src/core/lib/resource_quota/resource_quota.cc +8 -0
  451. data/src/core/lib/resource_quota/resource_quota.h +2 -1
  452. data/src/core/lib/resource_quota/stream_quota.cc +22 -0
  453. data/src/core/lib/resource_quota/stream_quota.h +31 -0
  454. data/src/core/lib/resource_quota/telemetry.h +1 -0
  455. data/src/core/lib/resource_quota/thread_quota.h +1 -1
  456. data/src/core/lib/security/authorization/audit_logging.cc +3 -3
  457. data/src/core/lib/security/authorization/audit_logging.h +1 -1
  458. data/src/core/lib/security/authorization/authorization_policy_provider.h +1 -1
  459. data/src/core/lib/security/authorization/evaluate_args.cc +5 -5
  460. data/src/core/lib/security/authorization/evaluate_args.h +1 -1
  461. data/src/core/lib/security/authorization/grpc_server_authz_filter.cc +3 -3
  462. data/src/core/lib/security/authorization/grpc_server_authz_filter.h +4 -1
  463. data/src/core/lib/security/authorization/matchers.cc +2 -2
  464. data/src/core/lib/security/authorization/stdout_logger.cc +1 -1
  465. data/src/core/lib/slice/percent_encoding.cc +1 -1
  466. data/src/core/lib/slice/slice.cc +1 -1
  467. data/src/core/lib/slice/slice.h +2 -2
  468. data/src/core/lib/slice/slice_buffer.cc +1 -1
  469. data/src/core/lib/slice/slice_internal.h +1 -1
  470. data/src/core/lib/surface/call.cc +42 -14
  471. data/src/core/lib/surface/call.h +12 -5
  472. data/src/core/lib/surface/call_log_batch.cc +2 -2
  473. data/src/core/lib/surface/call_utils.cc +5 -5
  474. data/src/core/lib/surface/call_utils.h +83 -18
  475. data/src/core/lib/surface/channel.cc +2 -1
  476. data/src/core/lib/surface/channel.h +13 -3
  477. data/src/core/lib/surface/channel_create.cc +2 -2
  478. data/src/core/lib/surface/channel_create.h +1 -1
  479. data/src/core/lib/surface/channel_init.cc +5 -5
  480. data/src/core/lib/surface/channel_init.h +4 -2
  481. data/src/core/lib/surface/completion_queue.cc +4 -4
  482. data/src/core/lib/surface/filter_stack_call.cc +13 -8
  483. data/src/core/lib/surface/filter_stack_call.h +3 -3
  484. data/src/core/lib/surface/init.cc +4 -4
  485. data/src/core/lib/surface/lame_client.cc +2 -2
  486. data/src/core/lib/surface/lame_client.h +3 -3
  487. data/src/core/lib/surface/legacy_channel.cc +3 -3
  488. data/src/core/lib/surface/legacy_channel.h +1 -1
  489. data/src/core/lib/surface/validate_metadata.cc +2 -2
  490. data/src/core/lib/surface/validate_metadata.h +1 -1
  491. data/src/core/lib/surface/version.cc +2 -2
  492. data/src/core/lib/transport/bdp_estimator.cc +1 -1
  493. data/src/core/lib/transport/bdp_estimator.h +2 -2
  494. data/src/core/lib/transport/connectivity_state.cc +1 -1
  495. data/src/core/lib/transport/connectivity_state.h +2 -2
  496. data/src/core/lib/transport/error_utils.h +1 -1
  497. data/src/core/lib/transport/promise_endpoint.cc +1 -1
  498. data/src/core/lib/transport/promise_endpoint.h +3 -3
  499. data/src/core/lib/transport/timeout_encoding.cc +1 -1
  500. data/src/core/lib/transport/transport.cc +3 -3
  501. data/src/core/lib/transport/transport.h +62 -4
  502. data/src/core/lib/transport/transport_framing_endpoint_extension.h +1 -1
  503. data/src/core/lib/transport/transport_op_string.cc +2 -2
  504. data/src/core/load_balancing/address_filtering.cc +1 -1
  505. data/src/core/load_balancing/address_filtering.h +2 -2
  506. data/src/core/load_balancing/backend_metric_parser.cc +1 -1
  507. data/src/core/load_balancing/backend_metric_parser.h +1 -1
  508. data/src/core/load_balancing/child_policy_handler.cc +4 -4
  509. data/src/core/load_balancing/child_policy_handler.h +2 -2
  510. data/src/core/load_balancing/delegating_helper.h +2 -2
  511. data/src/core/load_balancing/endpoint_list.cc +4 -4
  512. data/src/core/load_balancing/endpoint_list.h +2 -2
  513. data/src/core/load_balancing/grpclb/client_load_reporting_filter.cc +7 -5
  514. data/src/core/load_balancing/grpclb/client_load_reporting_filter.h +5 -1
  515. data/src/core/load_balancing/grpclb/grpclb.cc +13 -24
  516. data/src/core/load_balancing/grpclb/grpclb_client_stats.h +2 -2
  517. data/src/core/load_balancing/grpclb/load_balancer_api.cc +1 -1
  518. data/src/core/load_balancing/grpclb/load_balancer_api.h +1 -1
  519. data/src/core/load_balancing/health_check_client.cc +9 -5
  520. data/src/core/load_balancing/health_check_client_internal.h +3 -3
  521. data/src/core/load_balancing/lb_policy.h +11 -8
  522. data/src/core/load_balancing/lb_policy_factory.h +2 -2
  523. data/src/core/load_balancing/lb_policy_registry.cc +2 -2
  524. data/src/core/load_balancing/lb_policy_registry.h +2 -2
  525. data/src/core/load_balancing/oob_backend_metric.cc +7 -3
  526. data/src/core/load_balancing/oob_backend_metric_internal.h +2 -2
  527. data/src/core/load_balancing/outlier_detection/outlier_detection.cc +7 -15
  528. data/src/core/load_balancing/pick_first/pick_first.cc +48 -18
  529. data/src/core/load_balancing/priority/priority.cc +6 -6
  530. data/src/core/load_balancing/ring_hash/ring_hash.cc +8 -8
  531. data/src/core/load_balancing/rls/rls.cc +10 -10
  532. data/src/core/load_balancing/round_robin/round_robin.cc +7 -7
  533. data/src/core/load_balancing/subchannel_interface.h +2 -2
  534. data/src/core/load_balancing/weighted_round_robin/static_stride_scheduler.cc +1 -1
  535. data/src/core/load_balancing/weighted_round_robin/weighted_round_robin.cc +9 -15
  536. data/src/core/load_balancing/weighted_target/weighted_target.cc +9 -9
  537. data/src/core/load_balancing/xds/cds.cc +5 -5
  538. data/src/core/load_balancing/xds/xds_cluster_impl.cc +22 -39
  539. data/src/core/load_balancing/xds/xds_cluster_manager.cc +6 -6
  540. data/src/core/load_balancing/xds/xds_override_host.cc +10 -10
  541. data/src/core/load_balancing/xds/xds_override_host.h +1 -1
  542. data/src/core/load_balancing/xds/xds_wrr_locality.cc +5 -5
  543. data/src/core/resolver/dns/c_ares/dns_resolver_ares.cc +8 -8
  544. data/src/core/resolver/dns/c_ares/dns_resolver_ares.h +1 -1
  545. data/src/core/resolver/dns/c_ares/grpc_ares_ev_driver.h +1 -1
  546. data/src/core/resolver/dns/c_ares/grpc_ares_ev_driver_posix.cc +2 -2
  547. data/src/core/resolver/dns/c_ares/grpc_ares_ev_driver_windows.cc +2 -2
  548. data/src/core/resolver/dns/c_ares/grpc_ares_wrapper.cc +6 -6
  549. data/src/core/resolver/dns/c_ares/grpc_ares_wrapper.h +2 -2
  550. data/src/core/resolver/dns/dns_resolver_plugin.cc +2 -2
  551. data/src/core/resolver/dns/event_engine/event_engine_client_channel_resolver.cc +8 -8
  552. data/src/core/resolver/dns/event_engine/event_engine_client_channel_resolver.h +1 -1
  553. data/src/core/resolver/dns/event_engine/service_config_helper.cc +2 -2
  554. data/src/core/resolver/dns/native/dns_resolver.cc +7 -7
  555. data/src/core/resolver/endpoint_addresses.cc +4 -4
  556. data/src/core/resolver/endpoint_addresses.h +1 -1
  557. data/src/core/resolver/fake/fake_resolver.cc +1 -1
  558. data/src/core/resolver/fake/fake_resolver.h +3 -3
  559. data/src/core/resolver/google_c2p/google_c2p_resolver.cc +5 -5
  560. data/src/core/resolver/polling_resolver.cc +5 -5
  561. data/src/core/resolver/polling_resolver.h +1 -1
  562. data/src/core/resolver/resolver.h +2 -2
  563. data/src/core/resolver/resolver_factory.h +2 -2
  564. data/src/core/resolver/resolver_registry.cc +1 -1
  565. data/src/core/resolver/resolver_registry.h +1 -1
  566. data/src/core/resolver/sockaddr/sockaddr_resolver.cc +4 -4
  567. data/src/core/resolver/xds/xds_config.cc +1 -1
  568. data/src/core/resolver/xds/xds_config.h +3 -3
  569. data/src/core/resolver/xds/xds_dependency_manager.cc +2 -2
  570. data/src/core/resolver/xds/xds_dependency_manager.h +3 -3
  571. data/src/core/resolver/xds/xds_resolver.cc +16 -13
  572. data/src/core/resolver/xds/xds_resolver_attributes.h +1 -1
  573. data/src/core/server/add_port.cc +2 -2
  574. data/src/core/server/server.cc +9 -5
  575. data/src/core/server/server.h +8 -7
  576. data/src/core/server/server_call_tracer_filter.cc +1 -1
  577. data/src/core/server/server_call_tracer_filter.h +5 -1
  578. data/src/core/server/server_config_selector.h +2 -2
  579. data/src/core/server/server_config_selector_filter.cc +3 -3
  580. data/src/core/server/xds_channel_stack_modifier.cc +3 -2
  581. data/src/core/server/xds_channel_stack_modifier.h +1 -1
  582. data/src/core/server/xds_server_config_fetcher.cc +10 -10
  583. data/src/core/service_config/service_config.h +1 -1
  584. data/src/core/service_config/service_config_channel_arg_filter.h +4 -1
  585. data/src/core/service_config/service_config_impl.cc +3 -3
  586. data/src/core/service_config/service_config_impl.h +2 -2
  587. data/src/core/service_config/service_config_parser.h +1 -1
  588. data/src/core/telemetry/call_tracer.h +2 -2
  589. data/src/core/telemetry/default_tcp_tracer.h +3 -3
  590. data/src/core/telemetry/histogram.h +1 -1
  591. data/src/core/telemetry/instrument.cc +550 -270
  592. data/src/core/telemetry/instrument.h +301 -128
  593. data/src/core/telemetry/metrics.cc +2 -0
  594. data/src/core/telemetry/metrics.h +33 -4
  595. data/src/core/telemetry/stats.h +2 -2
  596. data/src/core/telemetry/stats_data.cc +1 -1
  597. data/src/core/telemetry/stats_data.h +2 -2
  598. data/src/core/transport/auth_context.cc +1 -1
  599. data/src/core/transport/auth_context.h +2 -1
  600. data/src/core/transport/auth_context_comparator_registry.h +1 -1
  601. data/src/core/tsi/alts/crypt/aes_gcm.cc +1 -1
  602. data/src/core/tsi/alts/frame_protector/alts_frame_protector.cc +2 -2
  603. data/src/core/tsi/alts/frame_protector/frame_handler.cc +1 -1
  604. data/src/core/tsi/alts/handshaker/alts_handshaker_client.cc +3 -3
  605. data/src/core/tsi/alts/handshaker/alts_handshaker_client.h +1 -1
  606. data/src/core/tsi/alts/handshaker/alts_tsi_handshaker.cc +9 -7
  607. data/src/core/tsi/alts/handshaker/alts_tsi_utils.cc +1 -1
  608. data/src/core/tsi/alts/handshaker/transport_security_common_api.cc +1 -1
  609. data/src/core/tsi/alts/zero_copy_frame_protector/alts_grpc_integrity_only_record_protocol.cc +1 -1
  610. data/src/core/tsi/alts/zero_copy_frame_protector/alts_grpc_privacy_integrity_record_protocol.cc +11 -3
  611. data/src/core/tsi/alts/zero_copy_frame_protector/alts_grpc_record_protocol.h +10 -0
  612. data/src/core/tsi/alts/zero_copy_frame_protector/alts_grpc_record_protocol_common.cc +9 -1
  613. data/src/core/tsi/alts/zero_copy_frame_protector/alts_grpc_record_protocol_common.h +3 -0
  614. data/src/core/tsi/alts/zero_copy_frame_protector/alts_zero_copy_grpc_protector.cc +15 -2
  615. data/src/core/tsi/fake_transport_security.cc +2 -1
  616. data/src/core/tsi/local_transport_security.cc +1 -1
  617. data/src/core/tsi/ssl/key_logging/ssl_key_logging.cc +1 -1
  618. data/src/core/tsi/ssl/key_logging/ssl_key_logging.h +1 -1
  619. data/src/core/tsi/ssl/session_cache/ssl_session_cache.cc +1 -1
  620. data/src/core/tsi/ssl/session_cache/ssl_session_openssl.cc +1 -1
  621. data/src/core/tsi/ssl_transport_security.cc +6 -6
  622. data/src/core/tsi/ssl_transport_security.h +1 -1
  623. data/src/core/tsi/ssl_transport_security_utils.cc +2 -2
  624. data/src/core/tsi/ssl_transport_security_utils.h +2 -2
  625. data/src/core/tsi/transport_security_grpc.cc +8 -0
  626. data/src/core/tsi/transport_security_grpc.h +15 -0
  627. data/src/core/util/alloc.cc +1 -1
  628. data/src/core/util/backoff.h +1 -1
  629. data/src/core/util/crash.h +1 -1
  630. data/src/core/util/dual_ref_counted.h +2 -2
  631. data/src/core/util/event_log.cc +1 -1
  632. data/src/core/util/event_log.h +3 -3
  633. data/src/core/util/gcp_metadata_query.cc +5 -5
  634. data/src/core/util/gcp_metadata_query.h +2 -2
  635. data/src/core/util/grpc_check.cc +2 -0
  636. data/src/core/util/grpc_check.h +1 -1
  637. data/src/core/util/grpc_if_nametoindex_posix.cc +1 -1
  638. data/src/core/util/grpc_if_nametoindex_unsupported.cc +1 -1
  639. data/src/core/util/http_client/format_request.cc +1 -1
  640. data/src/core/util/http_client/httpcli.cc +3 -3
  641. data/src/core/util/http_client/httpcli.h +4 -4
  642. data/src/core/util/http_client/httpcli_security_connector.cc +4 -4
  643. data/src/core/util/http_client/parser.cc +1 -1
  644. data/src/core/util/json/json_channel_args.h +1 -1
  645. data/src/core/util/json/json_object_loader.h +6 -6
  646. data/src/core/util/json/json_reader.cc +2 -2
  647. data/src/core/util/json/json_reader.h +1 -1
  648. data/src/core/util/json/json_util.h +3 -3
  649. data/src/core/util/json/json_writer.cc +1 -1
  650. data/src/core/util/latent_see.cc +45 -24
  651. data/src/core/util/latent_see.h +192 -24
  652. data/src/core/util/linux/cpu.cc +1 -1
  653. data/src/core/util/load_file.cc +1 -1
  654. data/src/core/util/load_file.h +1 -1
  655. data/src/core/util/log.cc +3 -3
  656. data/src/core/util/lru_cache.h +1 -1
  657. data/src/core/util/matchers.h +1 -1
  658. data/src/core/util/memory_usage.h +3 -3
  659. data/src/core/util/mpscq.h +1 -1
  660. data/src/core/util/notification.h +1 -1
  661. data/src/core/util/posix/cpu.cc +1 -1
  662. data/src/core/util/posix/stat.cc +2 -2
  663. data/src/core/util/posix/thd.cc +2 -2
  664. data/src/core/util/posix/tmpfile.cc +2 -2
  665. data/src/core/util/ref_counted.h +2 -2
  666. data/src/core/util/ref_counted_ptr.h +1 -1
  667. data/src/core/util/ref_counted_string.h +1 -1
  668. data/src/core/util/single_set_ptr.h +3 -1
  669. data/src/core/util/status_helper.cc +8 -8
  670. data/src/core/util/status_helper.h +1 -1
  671. data/src/core/util/string.cc +2 -2
  672. data/src/core/util/sync_abseil.cc +1 -1
  673. data/src/core/util/table.h +1 -1
  674. data/src/core/util/time.cc +1 -1
  675. data/src/core/util/time_precise.cc +1 -1
  676. data/src/core/util/unique_ptr_with_bitset.h +1 -1
  677. data/src/core/util/unique_type_name.h +1 -1
  678. data/src/core/util/upb_utils.h +6 -1
  679. data/src/core/util/validation_errors.cc +2 -2
  680. data/src/core/util/validation_errors.h +2 -3
  681. data/src/core/util/wait_for_single_owner.h +2 -2
  682. data/src/core/util/windows/directory_reader.cc +1 -1
  683. data/src/core/util/windows/stat.cc +2 -2
  684. data/src/core/util/windows/thd.cc +2 -2
  685. data/src/core/util/windows/time.cc +1 -1
  686. data/src/core/util/work_serializer.cc +3 -3
  687. data/src/core/util/work_serializer.h +2 -2
  688. data/src/core/xds/grpc/certificate_provider_store.cc +2 -2
  689. data/src/core/xds/grpc/certificate_provider_store.h +2 -2
  690. data/src/core/xds/grpc/file_watcher_certificate_provider_factory.cc +3 -3
  691. data/src/core/xds/grpc/file_watcher_certificate_provider_factory.h +1 -1
  692. data/src/core/xds/grpc/xds_audit_logger_registry.cc +3 -3
  693. data/src/core/xds/grpc/xds_audit_logger_registry.h +1 -1
  694. data/src/core/xds/grpc/xds_bootstrap_grpc.cc +7 -7
  695. data/src/core/xds/grpc/xds_bootstrap_grpc.h +2 -2
  696. data/src/core/xds/grpc/xds_certificate_provider.cc +1 -1
  697. data/src/core/xds/grpc/xds_certificate_provider.h +2 -2
  698. data/src/core/xds/grpc/xds_client_grpc.cc +5 -5
  699. data/src/core/xds/grpc/xds_client_grpc.h +2 -2
  700. data/src/core/xds/grpc/xds_cluster.cc +2 -2
  701. data/src/core/xds/grpc/xds_cluster.h +1 -1
  702. data/src/core/xds/grpc/xds_cluster_parser.cc +5 -5
  703. data/src/core/xds/grpc/xds_cluster_parser.h +1 -1
  704. data/src/core/xds/grpc/xds_cluster_specifier_plugin.cc +2 -2
  705. data/src/core/xds/grpc/xds_cluster_specifier_plugin.h +1 -1
  706. data/src/core/xds/grpc/xds_common_types.cc +1 -1
  707. data/src/core/xds/grpc/xds_common_types.h +1 -1
  708. data/src/core/xds/grpc/xds_common_types_parser.cc +5 -5
  709. data/src/core/xds/grpc/xds_endpoint.h +2 -2
  710. data/src/core/xds/grpc/xds_endpoint_parser.cc +5 -5
  711. data/src/core/xds/grpc/xds_endpoint_parser.h +1 -1
  712. data/src/core/xds/grpc/xds_health_status.cc +1 -1
  713. data/src/core/xds/grpc/xds_health_status.h +1 -1
  714. data/src/core/xds/grpc/xds_http_fault_filter.cc +4 -4
  715. data/src/core/xds/grpc/xds_http_fault_filter.h +2 -2
  716. data/src/core/xds/grpc/xds_http_filter.h +3 -3
  717. data/src/core/xds/grpc/xds_http_filter_registry.h +2 -2
  718. data/src/core/xds/grpc/xds_http_gcp_authn_filter.cc +3 -3
  719. data/src/core/xds/grpc/xds_http_gcp_authn_filter.h +2 -2
  720. data/src/core/xds/grpc/xds_http_rbac_filter.cc +4 -4
  721. data/src/core/xds/grpc/xds_http_rbac_filter.h +2 -2
  722. data/src/core/xds/grpc/xds_http_stateful_session_filter.cc +3 -3
  723. data/src/core/xds/grpc/xds_http_stateful_session_filter.h +2 -2
  724. data/src/core/xds/grpc/xds_lb_policy_registry.cc +1 -1
  725. data/src/core/xds/grpc/xds_lb_policy_registry.h +1 -1
  726. data/src/core/xds/grpc/xds_listener.cc +2 -2
  727. data/src/core/xds/grpc/xds_listener_parser.cc +6 -6
  728. data/src/core/xds/grpc/xds_listener_parser.h +1 -1
  729. data/src/core/xds/grpc/xds_matcher.cc +1 -1
  730. data/src/core/xds/grpc/xds_matcher.h +3 -3
  731. data/src/core/xds/grpc/xds_matcher_input.h +1 -1
  732. data/src/core/xds/grpc/xds_metadata.cc +1 -1
  733. data/src/core/xds/grpc/xds_metadata.h +3 -3
  734. data/src/core/xds/grpc/xds_metadata_parser.cc +2 -2
  735. data/src/core/xds/grpc/xds_route_config.cc +3 -3
  736. data/src/core/xds/grpc/xds_route_config_parser.cc +8 -8
  737. data/src/core/xds/grpc/xds_route_config_parser.h +1 -1
  738. data/src/core/xds/grpc/xds_routing.cc +4 -4
  739. data/src/core/xds/grpc/xds_routing.h +2 -2
  740. data/src/core/xds/grpc/xds_server_grpc.cc +2 -2
  741. data/src/core/xds/grpc/xds_transport_grpc.cc +1 -1
  742. data/src/core/xds/grpc/xds_transport_grpc.h +2 -2
  743. data/src/core/xds/xds_client/lrs_client.cc +3 -3
  744. data/src/core/xds/xds_client/lrs_client.h +4 -4
  745. data/src/core/xds/xds_client/xds_api.h +1 -1
  746. data/src/core/xds/xds_client/xds_backend_metric_propagation.cc +1 -1
  747. data/src/core/xds/xds_client/xds_backend_metric_propagation.h +1 -1
  748. data/src/core/xds/xds_client/xds_client.cc +8 -8
  749. data/src/core/xds/xds_client/xds_client.h +5 -5
  750. data/src/core/xds/xds_client/xds_locality.h +2 -2
  751. data/src/core/xds/xds_client/xds_resource_type.h +2 -2
  752. data/src/core/xds/xds_client/xds_resource_type_impl.h +1 -1
  753. data/src/core/xds/xds_client/xds_transport.h +2 -2
  754. data/src/ruby/ext/grpc/extconf.rb +14 -12
  755. data/src/ruby/ext/grpc/rb_call.c +0 -1
  756. data/src/ruby/ext/grpc/rb_channel_args.c +0 -1
  757. data/src/ruby/ext/grpc/rb_channel_credentials.c +0 -1
  758. data/src/ruby/ext/grpc/rb_compression_options.c +0 -1
  759. data/src/ruby/ext/grpc/rb_server_credentials.c +0 -1
  760. data/src/ruby/ext/grpc/rb_xds_channel_credentials.c +0 -1
  761. data/src/ruby/ext/grpc/rb_xds_server_credentials.c +0 -1
  762. data/src/ruby/lib/grpc/version.rb +1 -1
  763. metadata +16 -6
@@ -19,59 +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>
22
24
  #include <grpc/support/port_platform.h>
23
25
 
26
+ #include <cstddef>
24
27
  #include <cstdint>
28
+ #include <memory>
29
+ #include <optional>
30
+ #include <string>
25
31
  #include <utility>
32
+ #include <vector>
26
33
 
27
34
  #include "src/core/call/call_spine.h"
35
+ #include "src/core/call/metadata.h"
36
+ #include "src/core/channelz/channelz.h"
28
37
  #include "src/core/ext/transport/chttp2/transport/flow_control.h"
29
- #include "src/core/ext/transport/chttp2/transport/flow_control_manager.h"
30
38
  #include "src/core/ext/transport/chttp2/transport/frame.h"
31
- #include "src/core/ext/transport/chttp2/transport/header_assembler.h"
39
+ #include "src/core/ext/transport/chttp2/transport/goaway.h"
32
40
  #include "src/core/ext/transport/chttp2/transport/hpack_encoder.h"
33
41
  #include "src/core/ext/transport/chttp2/transport/hpack_parser.h"
34
- #include "src/core/ext/transport/chttp2/transport/http2_settings_manager.h"
35
42
  #include "src/core/ext/transport/chttp2/transport/http2_settings_promises.h"
36
43
  #include "src/core/ext/transport/chttp2/transport/http2_status.h"
37
44
  #include "src/core/ext/transport/chttp2/transport/http2_transport.h"
38
45
  #include "src/core/ext/transport/chttp2/transport/http2_ztrace_collector.h"
46
+ #include "src/core/ext/transport/chttp2/transport/incoming_metadata_tracker.h"
39
47
  #include "src/core/ext/transport/chttp2/transport/keepalive.h"
40
- #include "src/core/ext/transport/chttp2/transport/message_assembler.h"
41
48
  #include "src/core/ext/transport/chttp2/transport/ping_promise.h"
42
49
  #include "src/core/ext/transport/chttp2/transport/stream.h"
50
+ #include "src/core/ext/transport/chttp2/transport/stream_data_queue.h"
43
51
  #include "src/core/ext/transport/chttp2/transport/writable_streams.h"
44
- #include "src/core/lib/promise/inter_activity_mutex.h"
45
- #include "src/core/lib/promise/loop.h"
46
- #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"
47
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"
48
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"
49
68
  #include "src/core/lib/transport/connectivity_state.h"
50
69
  #include "src/core/lib/transport/promise_endpoint.h"
51
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"
52
74
  #include "src/core/util/orphanable.h"
53
75
  #include "src/core/util/ref_counted_ptr.h"
54
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"
55
87
 
56
88
  namespace grpc_core {
57
89
  namespace http2 {
58
90
 
59
- // All Promise Based HTTP2 Transport TODOs have the tag
60
- // [PH2][Pn] where n = 0 to 5.
61
- // This helps to maintain the uniformity for quick lookup and fixing.
62
- //
63
- // [PH2][P0] MUST be fixed before the current PR is submitted.
64
- // [PH2][P1] MUST be fixed before the current sub-project is considered
65
- // complete.
66
- // [PH2][P2] MUST be fixed before the current Milestone is considered
67
- // complete.
68
- // [PH2][P3] MUST be fixed before Milestone 3 is considered complete.
69
- // [PH2][P4] Can be fixed after roll out begins. Evaluate these during
70
- // Milestone 4. Either do the TODOs or delete them.
71
- // [PH2][P5] This MUST be a separate standalone project.
72
- // [PH2][EXT] This is a TODO related to a project unrelated to PH2 but happening
73
- // in parallel.
74
-
75
91
  // Http2 Client Transport Spawns Overview
76
92
 
77
93
  // | Promise Spawn | Max Duration | Promise Resolution | Max Spawns |
@@ -85,23 +101,21 @@ namespace http2 {
85
101
  // Max Party Slots (Always): 3
86
102
  // Max Promise Slots (Worst Case): 4
87
103
 
88
- // Experimental : This is just the initial skeleton of class
89
- // and it is functions. The code will be written iteratively.
104
+ // Experimental : The code will be written iteratively.
90
105
  // Do not use or edit any of these functions unless you are
91
106
  // familiar with the PH2 project (Moving chttp2 to promises.)
92
107
  // TODO(tjagtap) : [PH2][P3] : Update the experimental status of the code before
93
108
  // http2 rollout begins.
94
109
  class Http2ClientTransport final : public ClientTransport,
95
110
  public channelz::DataSource {
96
- // TODO(tjagtap) : [PH2][P3] Move the definitions to the header for better
97
- // inlining. For now definitions are in the cc file to
98
- // reduce cognitive load in the header.
111
+ // TODO(akshitpatel) [PH2][P1] : Functions that need a mutex to be held should
112
+ // have "locked" suffix in function name.
99
113
  public:
100
114
  Http2ClientTransport(
101
115
  PromiseEndpoint endpoint, GRPC_UNUSED const ChannelArgs& channel_args,
102
116
  std::shared_ptr<grpc_event_engine::experimental::EventEngine>
103
117
  event_engine,
104
- grpc_closure* on_receive_settings);
118
+ absl::AnyInvocable<void(absl::StatusOr<uint32_t>)> on_receive_settings);
105
119
 
106
120
  Http2ClientTransport(const Http2ClientTransport&) = delete;
107
121
  Http2ClientTransport& operator=(const Http2ClientTransport&) = delete;
@@ -128,8 +142,10 @@ class Http2ClientTransport final : public ClientTransport,
128
142
  OrphanablePtr<ConnectivityStateWatcherInterface> watcher);
129
143
  void StopConnectivityWatch(ConnectivityStateWatcherInterface* watcher);
130
144
 
145
+ void StartWatch(RefCountedPtr<StateWatcher> watcher) override;
146
+ void StopWatch(RefCountedPtr<StateWatcher> watcher) override;
147
+
131
148
  void Orphan() override;
132
- void AbortWithError();
133
149
 
134
150
  RefCountedPtr<channelz::SocketNode> GetSocketNode() const override {
135
151
  return const_cast<channelz::BaseNode*>(
@@ -143,6 +159,8 @@ class Http2ClientTransport final : public ClientTransport,
143
159
  }
144
160
 
145
161
  void AddData(channelz::DataSink sink) override;
162
+ void SpawnAddChannelzData(RefCountedPtr<Party> party,
163
+ channelz::DataSink sink);
146
164
 
147
165
  auto TestOnlyTriggerWriteCycle() {
148
166
  return Immediate(writable_stream_list_.ForceReadyForWrite());
@@ -150,12 +168,12 @@ class Http2ClientTransport final : public ClientTransport,
150
168
 
151
169
  auto TestOnlySendPing(absl::AnyInvocable<void()> on_initiate,
152
170
  bool important = false) {
153
- return ping_manager_.RequestPing(std::move(on_initiate), important);
171
+ return ping_manager_->RequestPing(std::move(on_initiate), important);
154
172
  }
155
173
 
156
174
  template <typename Factory>
157
- auto TestOnlySpawnPromise(absl::string_view name, Factory factory) {
158
- 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) {});
159
177
  }
160
178
 
161
179
  int64_t TestOnlyTransportFlowControlWindow() {
@@ -173,6 +191,7 @@ class Http2ClientTransport final : public ClientTransport,
173
191
  bool AreTransportFlowControlTokensAvailable() {
174
192
  return flow_control_.remote_window() > 0;
175
193
  }
194
+ void SpawnTransportLoops();
176
195
 
177
196
  private:
178
197
  // Promise factory for processing each type of frame
@@ -199,26 +218,16 @@ class Http2ClientTransport final : public ClientTransport,
199
218
  // Returns a promise that will process one HTTP2 frame.
200
219
  auto ProcessOneFrame(Http2Frame frame);
201
220
 
202
- // Returns a promise that will do the cleanup after the ReadLoop ends.
203
- auto OnReadLoopEnded();
204
-
205
221
  // Writing to the endpoint.
206
222
 
207
223
  // Write time sensitive control frames to the endpoint. Frames sent from here
208
- // will be:
209
- // 1. SETTINGS - This is first because for a new connection, SETTINGS MUST be
210
- // the first frame to be written onto a connection as per
211
- // RFC9113.
212
- // 2. GOAWAY - This is second because if this is the final GoAway, then we may
213
- // not need to send anything else to the peer.
214
- // 3. PING and PING acks.
215
- // 4. WINDOW_UPDATE
216
- // 5. Custom gRPC security frame
224
+ // will be GOAWAY, SETTINGS, PING and PING acks, WINDOW_UPDATE and
225
+ // Custom gRPC security frame.
217
226
  // These frames are written to the endpoint in a single endpoint write. If any
218
227
  // module needs to take action after the write (for cases like spawning
219
228
  // timeout promises), they MUST plug the call in the
220
229
  // NotifyControlFramesWriteDone.
221
- auto WriteControlFrames();
230
+ auto ProcessAndWriteControlFrames();
222
231
 
223
232
  // Notify the control frames modules that the endpoint write is done.
224
233
  void NotifyControlFramesWriteDone();
@@ -227,37 +236,71 @@ class Http2ClientTransport final : public ClientTransport,
227
236
  // the writable streams and write to the endpoint.
228
237
  auto MultiplexerLoop();
229
238
 
230
- // Returns a promise that will do the cleanup after the MultiplexerLoop
231
- // ends.
232
- auto OnMultiplexerLoopEnded();
233
-
234
239
  // Returns a promise to fetch data from the callhandler and pass it further
235
240
  // down towards the endpoint.
236
241
  auto CallOutboundLoop(CallHandler call_handler, RefCountedPtr<Stream> stream,
237
- InterActivityMutex<uint32_t>::Lock lock,
238
242
  ClientMetadataHandle metadata);
239
243
 
244
+ // TODO(akshitpatel) : [PH2][P1] : Make this a synchronous function.
240
245
  // Force triggers a transport write cycle
241
246
  auto TriggerWriteCycle() {
242
247
  return Immediate(writable_stream_list_.ForceReadyForWrite());
243
248
  }
244
249
 
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
+
245
258
  // Processes the flow control action and take necessary steps.
246
259
  void ActOnFlowControlAction(const chttp2::FlowControlAction& action,
247
- uint32_t stream_id);
260
+ RefCountedPtr<Stream> stream);
261
+
262
+ void NotifyStateWatcherOnDisconnectLocked(
263
+ absl::Status status, StateWatcher::DisconnectInfo disconnect_info)
264
+ ABSL_EXCLUSIVE_LOCKS_REQUIRED(&transport_mutex_);
248
265
 
249
266
  RefCountedPtr<Party> general_party_;
267
+ std::shared_ptr<grpc_event_engine::experimental::EventEngine> event_engine_;
250
268
 
251
269
  PromiseEndpoint endpoint_;
252
- Http2SettingsManager settings_;
253
- SettingsTimeoutManager transport_settings_;
270
+ RefCountedPtr<SettingsPromiseManager> settings_;
254
271
 
255
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
+ }
256
299
 
257
- uint32_t NextStreamId(
258
- InterActivityMutex<uint32_t>::Lock& next_stream_id_lock) {
259
- const uint32_t stream_id = *next_stream_id_lock;
260
- 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()) {
261
304
  // TODO(tjagtap) : [PH2][P3] : Handle case if transport runs out of stream
262
305
  // ids
263
306
  // RFC9113 : Stream identifiers cannot be reused. Long-lived connections
@@ -267,22 +310,53 @@ class Http2ClientTransport final : public ClientTransport,
267
310
  // that is unable to establish a new stream identifier can send a GOAWAY
268
311
  // frame so that the client is forced to open a new connection for new
269
312
  // streams.
313
+ return absl::ResourceExhaustedError("No more stream ids available");
270
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
+ }
324
+ }
325
+
271
326
  // RFC9113 : Streams initiated by a client MUST use odd-numbered stream
272
327
  // identifiers.
273
- (*next_stream_id_lock) += 2;
274
- 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;
275
337
  }
276
338
 
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);
353
+
277
354
  Mutex transport_mutex_;
278
- // TODO(tjagtap) : [PH2][P2] : Add to map in StartCall and clean this
279
- // mapping up in the on_done of the CallInitiator or CallHandler
355
+
280
356
  absl::flat_hash_map<uint32_t, RefCountedPtr<Stream>> stream_list_
281
357
  ABSL_GUARDED_BY(transport_mutex_);
282
358
 
283
- // Mutex to preserve the order of headers being sent out for new streams.
284
- // This also tracks the stream_id for creating new streams.
285
- InterActivityMutex<uint32_t> stream_id_mutex_;
359
+ uint32_t next_stream_id_;
286
360
  HPackCompressor encoder_;
287
361
  HPackParser parser_;
288
362
  bool is_transport_closed_ ABSL_GUARDED_BY(transport_mutex_) = false;
@@ -298,78 +372,47 @@ class Http2ClientTransport final : public ClientTransport,
298
372
  std::move(promise));
299
373
  }
300
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);
389
+
301
390
  ConnectivityStateTracker state_tracker_ ABSL_GUARDED_BY(transport_mutex_){
302
391
  "http2_client", GRPC_CHANNEL_READY};
303
392
 
304
- std::optional<RefCountedPtr<Stream>> MakeStream(CallHandler call_handler,
305
- uint32_t stream_id);
393
+ RefCountedPtr<StateWatcher> watcher_ ABSL_GUARDED_BY(transport_mutex_);
306
394
 
307
- struct CloseStreamArgs {
308
- bool close_reads;
309
- bool close_writes;
310
- };
395
+ // Runs on the call party.
396
+ std::optional<RefCountedPtr<Stream>> MakeStream(CallHandler call_handler);
311
397
 
312
398
  // This function MUST be idempotent.
313
399
  void CloseStream(RefCountedPtr<Stream> stream, CloseStreamArgs args,
314
400
  DebugLocation whence = {});
315
401
 
316
- void BeginCloseStream(uint32_t stream_id,
402
+ void BeginCloseStream(RefCountedPtr<Stream> stream,
317
403
  std::optional<uint32_t> reset_stream_error_code,
318
404
  ServerMetadataHandle&& metadata,
319
405
  DebugLocation whence = {});
320
406
 
321
407
  RefCountedPtr<Stream> LookupStream(uint32_t stream_id);
322
408
 
323
- auto EndpointReadSlice(const size_t num_bytes) {
324
- return Map(endpoint_.ReadSlice(num_bytes),
325
- [self = RefAsSubclass<Http2ClientTransport>(),
326
- num_bytes](absl::StatusOr<Slice> status) {
327
- if (status.ok()) {
328
- self->keepalive_manager_.GotData();
329
- self->ztrace_collector_->Append(
330
- PromiseEndpointReadTrace{num_bytes});
331
- }
332
- return status;
333
- });
334
- }
409
+ auto EndpointReadSlice(const size_t num_bytes);
410
+ auto EndpointRead(const size_t num_bytes);
335
411
 
336
412
  // HTTP2 Settings
337
- void MarkPeerSettingsResolved() {
338
- settings_.SetPreviousSettingsPromiseResolved(true);
339
- }
340
- auto WaitForSettingsTimeoutDone() {
341
- return [self = RefAsSubclass<Http2ClientTransport>()](absl::Status status) {
342
- if (!status.ok()) {
343
- GRPC_UNUSED absl::Status result = self->HandleError(
344
- std::nullopt, Http2Status::Http2ConnectionError(
345
- Http2ErrorCode::kProtocolError,
346
- std::string(RFC9113::kSettingsTimeout)));
347
- } else {
348
- self->MarkPeerSettingsResolved();
349
- }
350
- };
351
- }
352
- // TODO(tjagtap) : [PH2][P1] : Plumbing. Call this after the SETTINGS frame
353
- // has been written to endpoint_.
354
- void SpawnWaitForSettingsTimeout() {
355
- settings_.SetPreviousSettingsPromiseResolved(false);
356
- general_party_->Spawn("WaitForSettingsTimeout",
357
- transport_settings_.WaitForSettingsTimeout(),
358
- WaitForSettingsTimeoutDone());
359
- }
360
-
361
- auto EndpointRead(const size_t num_bytes) {
362
- return Map(endpoint_.Read(num_bytes),
363
- [self = RefAsSubclass<Http2ClientTransport>(),
364
- num_bytes](absl::StatusOr<SliceBuffer> status) {
365
- if (status.ok()) {
366
- self->keepalive_manager_.GotData();
367
- self->ztrace_collector_->Append(
368
- PromiseEndpointReadTrace{num_bytes});
369
- }
370
- return status;
371
- });
372
- }
413
+ auto WaitForSettingsTimeoutOnDone();
414
+ void MaybeSpawnWaitForSettingsTimeout();
415
+ void EnforceLatestIncomingSettings();
373
416
 
374
417
  // This function MUST run on the transport party.
375
418
  void CloseTransport();
@@ -388,18 +431,22 @@ class Http2ClientTransport final : public ClientTransport,
388
431
  absl::Status HandleError(const std::optional<uint32_t> stream_id,
389
432
  Http2Status status, DebugLocation whence = {}) {
390
433
  auto error_type = status.GetType();
391
- DCHECK(error_type != Http2Status::Http2ErrorType::kOk);
434
+ GRPC_DCHECK(error_type != Http2Status::Http2ErrorType::kOk);
392
435
 
393
436
  if (error_type == Http2Status::Http2ErrorType::kStreamError) {
394
- LOG(ERROR) << "Stream Error: " << status.DebugString();
395
- DCHECK(stream_id.has_value());
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.
396
441
  BeginCloseStream(
397
- *stream_id,
398
- Http2ErrorCodeToRstFrameErrorCode(status.GetStreamErrorCode()),
399
- ServerMetadataFromStatus(status.GetAbslStreamError()), whence);
442
+ LookupStream(stream_id.value()),
443
+ Http2ErrorCodeToFrameErrorCode(status.GetStreamErrorCode()),
444
+ CancelledServerMetadataFromStatus(status.GetAbslStreamError()),
445
+ whence);
400
446
  return absl::OkStatus();
401
447
  } else if (error_type == Http2Status::Http2ErrorType::kConnectionError) {
402
- LOG(ERROR) << "Connection Error: " << status.DebugString();
448
+ GRPC_HTTP2_CLIENT_ERROR_DLOG << "Connection Error: "
449
+ << status.DebugString();
403
450
  absl::Status absl_status = status.GetAbslConnectionError();
404
451
  MaybeSpawnCloseTransport(std::move(status), whence);
405
452
  return absl_status;
@@ -408,13 +455,8 @@ class Http2ClientTransport final : public ClientTransport,
408
455
  }
409
456
 
410
457
  bool should_reset_ping_clock_;
411
- bool incoming_header_in_progress_;
412
- bool incoming_header_end_stream_;
413
458
  bool is_first_write_;
414
- uint32_t incoming_header_stream_id_;
415
- grpc_closure* on_receive_settings_;
416
-
417
- uint32_t max_header_list_size_soft_limit_;
459
+ IncomingMetadataTracker incoming_headers_;
418
460
 
419
461
  // The target number of bytes to write in a single write cycle. We may not
420
462
  // always honour this max_write_size. We MAY overshoot it at most once per
@@ -436,39 +478,49 @@ class Http2ClientTransport final : public ClientTransport,
436
478
  size_t GetMaxWriteSize() const { return max_write_size_; }
437
479
 
438
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;
486
+
487
+ void SetMaxAllowedStreamId(uint32_t max_allowed_stream_id);
488
+
489
+ bool CanCloseTransportLocked() const
490
+ ABSL_EXCLUSIVE_LOCKS_REQUIRED(transport_mutex_);
439
491
 
440
492
  // Ping related members
441
- // TODO(akshitpatel) : [PH2][P2] : Consider removing the timeout related
442
- // members.
443
- // Duration between two consecutive keepalive pings
444
- const Duration keepalive_time_;
445
- // Duration to wait for a keepalive ping ack before triggering timeout. This
446
- // only takes effect if the assigned value is less than the ping timeout.
447
- const Duration keepalive_timeout_;
448
- // Duration to wait for ping ack before triggering timeout
449
- const Duration ping_timeout_;
450
- PingManager ping_manager_;
451
- 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_;
452
499
 
453
500
  // Flags
454
501
  bool keepalive_permit_without_calls_;
455
502
 
456
503
  auto SendPing(absl::AnyInvocable<void()> on_initiate, bool important) {
457
- return ping_manager_.RequestPing(std::move(on_initiate), important);
504
+ return ping_manager_->RequestPing(std::move(on_initiate), important);
458
505
  }
459
- auto WaitForPingAck() { return ping_manager_.WaitForPingAck(); }
506
+ auto WaitForPingAck() { return ping_manager_->WaitForPingAck(); }
460
507
 
461
- void MaybeGetSettingsFrame(SliceBuffer& output_buf) {
462
- std::optional<Http2Frame> settings_frame = settings_.MaybeSendUpdate();
463
- if (settings_frame.has_value()) {
464
- Serialize(absl::Span<Http2Frame>(&settings_frame.value(), 1), output_buf);
465
- }
466
- }
508
+ void MaybeGetWindowUpdateFrames(SliceBuffer& output_buf);
509
+
510
+ void ReportDisconnection(const absl::Status& status,
511
+ StateWatcher::DisconnectInfo disconnect_info,
512
+ const char* reason);
513
+
514
+ void ReportDisconnectionLocked(const absl::Status& status,
515
+ StateWatcher::DisconnectInfo disconnect_info,
516
+ const char* reason)
517
+ ABSL_EXCLUSIVE_LOCKS_REQUIRED(&transport_mutex_);
467
518
 
468
519
  // Ping Helper functions
469
520
  Duration NextAllowedPingInterval() {
470
521
  MutexLock lock(&transport_mutex_);
471
- return (!keepalive_permit_without_calls_ && stream_list_.empty())
522
+ return (!keepalive_permit_without_calls_ &&
523
+ GetActiveStreamCountLocked() == 0)
472
524
  ? Duration::Hours(2)
473
525
  : Duration::Seconds(1);
474
526
  }
@@ -476,7 +528,7 @@ class Http2ClientTransport final : public ClientTransport,
476
528
  auto AckPing(uint64_t opaque_data) {
477
529
  bool valid_ping_ack_received = true;
478
530
 
479
- if (!ping_manager_.AckPing(opaque_data)) {
531
+ if (!ping_manager_->AckPing(opaque_data)) {
480
532
  GRPC_HTTP2_CLIENT_DLOG << "Unknown ping response received for ping id="
481
533
  << opaque_data;
482
534
  valid_ping_ack_received = false;
@@ -488,13 +540,10 @@ class Http2ClientTransport final : public ClientTransport,
488
540
  // When this happens, it becomes important to ensure that if a ping ack
489
541
  // is received and there is an "important" outstanding ping request, we
490
542
  // should retry to send it out now.
491
- valid_ping_ack_received && ping_manager_.ImportantPingRequested(),
543
+ valid_ping_ack_received && ping_manager_->ImportantPingRequested(),
492
544
  [self = RefAsSubclass<Http2ClientTransport>()] {
493
545
  return Map(self->TriggerWriteCycle(), [](const absl::Status status) {
494
- return (status.ok())
495
- ? Http2Status::Ok()
496
- : Http2Status::AbslConnectionError(
497
- status.code(), std::string(status.message()));
546
+ return ToHttpOkOrConnError(status);
498
547
  });
499
548
  },
500
549
  [] { return Immediate(Http2Status::Ok()); });
@@ -513,9 +562,7 @@ class Http2ClientTransport final : public ClientTransport,
513
562
  }
514
563
 
515
564
  Promise<absl::Status> PingTimeout() override {
516
- // TODO(akshitpatel) : [PH2][P2] : Trigger goaway here.
517
- // Returns a promise that resolves once goaway is sent.
518
- LOG(INFO) << "Ping timeout at time: " << Timestamp::Now();
565
+ GRPC_HTTP2_CLIENT_DLOG << "Ping timeout at time: " << Timestamp::Now();
519
566
 
520
567
  // TODO(akshitpatel) : [PH2][P2] : The error code here has been chosen
521
568
  // based on CHTTP2's usage of GRPC_STATUS_UNAVAILABLE (which corresponds
@@ -523,8 +570,9 @@ class Http2ClientTransport final : public ClientTransport,
523
570
  // kRefusedStream doesn't seem to fit this case. We should revisit this
524
571
  // and update the error code.
525
572
  return Immediate(transport_->HandleError(
526
- std::nullopt, Http2Status::Http2ConnectionError(
527
- Http2ErrorCode::kRefusedStream, "Ping timeout")));
573
+ std::nullopt,
574
+ Http2Status::Http2ConnectionError(Http2ErrorCode::kRefusedStream,
575
+ GRPC_CHTTP2_PING_TIMEOUT_STR)));
528
576
  }
529
577
 
530
578
  private:
@@ -554,8 +602,7 @@ class Http2ClientTransport final : public ClientTransport,
554
602
  });
555
603
  }
556
604
  Promise<absl::Status> OnKeepAliveTimeout() override {
557
- // TODO(akshitpatel) : [PH2][P2] : Trigger goaway here.
558
- LOG(INFO) << "Keepalive timeout triggered";
605
+ GRPC_HTTP2_CLIENT_DLOG << "Keepalive timeout triggered";
559
606
 
560
607
  // TODO(akshitpatel) : [PH2][P2] : The error code here has been chosen
561
608
  // based on CHTTP2's usage of GRPC_STATUS_UNAVAILABLE (which corresponds
@@ -563,9 +610,9 @@ class Http2ClientTransport final : public ClientTransport,
563
610
  // kRefusedStream doesn't seem to fit this case. We should revisit this
564
611
  // and update the error code.
565
612
  return Immediate(transport_->HandleError(
566
- std::nullopt,
567
- Http2Status::Http2ConnectionError(Http2ErrorCode::kRefusedStream,
568
- "Keepalive timeout")));
613
+ std::nullopt, Http2Status::Http2ConnectionError(
614
+ Http2ErrorCode::kRefusedStream,
615
+ GRPC_CHTTP2_KEEPALIVE_TIMEOUT_STR)));
569
616
  }
570
617
 
571
618
  bool NeedToSendKeepAlivePing() override {
@@ -573,7 +620,7 @@ class Http2ClientTransport final : public ClientTransport,
573
620
  {
574
621
  MutexLock lock(&transport_->transport_mutex_);
575
622
  need_to_send_ping = (transport_->keepalive_permit_without_calls_ ||
576
- !transport_->stream_list_.empty());
623
+ transport_->GetActiveStreamCountLocked() > 0);
577
624
  }
578
625
  return need_to_send_ping;
579
626
  }
@@ -585,11 +632,44 @@ class Http2ClientTransport final : public ClientTransport,
585
632
  Http2ClientTransport* transport_;
586
633
  };
587
634
 
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
+
588
667
  WritableStreams<RefCountedPtr<Stream>> writable_stream_list_;
589
668
 
590
669
  absl::Status MaybeAddStreamToWritableStreamList(
591
670
  const RefCountedPtr<Stream> stream,
592
- const StreamDataQueue<ClientMetadataHandle>::EnqueueResult result) {
671
+ const StreamDataQueue<ClientMetadataHandle>::StreamWritabilityUpdate
672
+ result) {
593
673
  if (result.became_writable) {
594
674
  GRPC_HTTP2_CLIENT_DLOG
595
675
  << "Http2ClientTransport MaybeAddStreamToWritableStreamList "
@@ -613,12 +693,22 @@ class Http2ClientTransport final : public ClientTransport,
613
693
 
614
694
  /// Based on channel args, preferred_rx_crypto_frame_sizes are advertised to
615
695
  /// the peer
616
- // TODO(tjagtap) : [PH2][P1] : Plumb this with the necessary frame size flow
617
- // control workflow corresponding to grpc_chttp2_act_on_flowctl_action
618
- GRPC_UNUSED bool enable_preferred_rx_crypto_frame_advertisement_;
696
+ bool enable_preferred_rx_crypto_frame_advertisement_;
619
697
  MemoryOwner memory_owner_;
620
698
  chttp2::TransportFlowControl flow_control_;
621
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);
622
712
  };
623
713
 
624
714
  // Since the corresponding class in CHTTP2 is about 3.9KB, our goal is to