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
@@ -18,41 +18,146 @@
18
18
 
19
19
  #include "src/core/ext/transport/chttp2/transport/http2_transport.h"
20
20
 
21
+ #include <grpc/grpc.h>
22
+ #include <grpc/impl/channel_arg_names.h>
23
+
24
+ #include <algorithm>
25
+ #include <climits>
21
26
  #include <cstdint>
27
+ #include <memory>
28
+ #include <optional>
29
+ #include <string>
22
30
  #include <utility>
31
+ #include <vector>
23
32
 
24
- #include "src/core/call/call_spine.h"
25
33
  #include "src/core/call/metadata_info.h"
26
34
  #include "src/core/channelz/channelz.h"
27
35
  #include "src/core/ext/transport/chttp2/transport/flow_control.h"
28
36
  #include "src/core/ext/transport/chttp2/transport/frame.h"
29
- #include "src/core/lib/promise/mpsc.h"
30
- #include "src/core/lib/promise/party.h"
31
- #include "src/core/lib/transport/promise_endpoint.h"
32
- #include "src/core/lib/transport/transport.h"
37
+ #include "src/core/ext/transport/chttp2/transport/header_assembler.h"
38
+ #include "src/core/ext/transport/chttp2/transport/hpack_parser.h"
39
+ #include "src/core/ext/transport/chttp2/transport/http2_settings.h"
40
+ #include "src/core/ext/transport/chttp2/transport/http2_settings_manager.h"
41
+ #include "src/core/ext/transport/chttp2/transport/http2_settings_promises.h"
42
+ #include "src/core/ext/transport/chttp2/transport/http2_status.h"
43
+ #include "src/core/ext/transport/chttp2/transport/internal_channel_arg_names.h"
44
+ #include "src/core/ext/transport/chttp2/transport/stream.h"
45
+ #include "src/core/lib/channel/channel_args.h"
46
+ #include "src/core/lib/event_engine/tcp_socket_utils.h"
47
+ #include "src/core/lib/slice/slice_buffer.h"
48
+ #include "src/core/util/grpc_check.h"
33
49
  #include "src/core/util/ref_counted_ptr.h"
34
- #include "src/core/util/sync.h"
50
+ #include "src/core/util/time.h"
51
+ #include "absl/log/log.h"
52
+ #include "absl/types/span.h"
35
53
 
36
54
  namespace grpc_core {
37
55
  namespace http2 {
38
56
 
57
+ // All Promise Based HTTP2 Transport TODOs have the tag
58
+ // [PH2][Pn] where n = 0 to 5.
59
+ // This helps to maintain the uniformity for quick lookup and fixing.
60
+ //
61
+ // [PH2][P0] MUST be fixed before the current PR is submitted.
62
+ // [PH2][P1] MUST be fixed before the current sub-project is considered
63
+ // complete.
64
+ // [PH2][P2] MUST be fixed before the current Milestone is considered
65
+ // complete.
66
+ // [PH2][P3] MUST be fixed before Milestone 3 is considered complete.
67
+ // [PH2][P4] Can be fixed after roll out begins. Evaluate these during
68
+ // Milestone 4. Either do the TODOs or delete them.
69
+ // [PH2][P5] Can be fixed after roll out begins. Evaluate these during
70
+ // Milestone 4. Either do the TODOs or delete them.
71
+ // [PH2][EXT] This is a TODO related to a project unrelated to PH2 but happening
72
+ // in parallel.
73
+
74
+ constexpr Duration kDefaultPingTimeout = Duration::Minutes(1);
75
+ constexpr Duration kDefaultKeepaliveTimeout = Duration::Seconds(20);
76
+ constexpr bool kDefaultKeepalivePermitWithoutCalls = false;
77
+ constexpr bool kDefaultEnablePreferredRxCryptoFrameAdvertisement = false;
78
+ constexpr bool kDefaultAckPings = true;
79
+
80
+ constexpr Duration kClientKeepaliveTime = Duration::Infinity();
81
+
82
+ constexpr Duration kServerKeepaliveTime = Duration::Hours(2);
83
+
39
84
  // Experimental : This is just the initial skeleton of class
40
85
  // and it is functions. The code will be written iteratively.
41
86
  // Do not use or edit any of these functions unless you are
42
87
  // familiar with the PH2 project (Moving chttp2 to promises.)
43
88
 
89
+ ///////////////////////////////////////////////////////////////////////////////
90
+ // Settings helpers
91
+
44
92
  void InitLocalSettings(Http2Settings& settings, const bool is_client) {
45
93
  if (is_client) {
46
94
  // gRPC has never supported PUSH_PROMISE and we have no plan to do so in the
47
95
  // future.
48
96
  settings.SetEnablePush(false);
49
- // This is to make it double-sure that server cannot initite a stream.
97
+ // This is to make it double-sure that server cannot initiate a stream.
50
98
  settings.SetMaxConcurrentStreams(0);
51
99
  }
52
100
  settings.SetMaxHeaderListSize(DEFAULT_MAX_HEADER_LIST_SIZE);
53
101
  settings.SetAllowTrueBinaryMetadata(true);
54
102
  }
55
103
 
104
+ ////////////////////////////////////////////////////////////////////////////////
105
+ // Channel Args helpers
106
+ void ReadChannelArgs(const ChannelArgs& channel_args,
107
+ TransportChannelArgs& args, Http2Settings& local_settings,
108
+ chttp2::TransportFlowControl& flow_control,
109
+ bool is_client) {
110
+ ReadSettingsFromChannelArgs(channel_args, local_settings, flow_control,
111
+ is_client);
112
+
113
+ args.max_header_list_size_soft_limit =
114
+ GetSoftLimitFromChannelArgs(channel_args);
115
+ args.keepalive_time = std::max(
116
+ Duration::Milliseconds(1),
117
+ channel_args.GetDurationFromIntMillis(GRPC_ARG_KEEPALIVE_TIME_MS)
118
+ .value_or(is_client ? kClientKeepaliveTime : kServerKeepaliveTime));
119
+ args.keepalive_timeout = std::max(
120
+ Duration::Zero(),
121
+ channel_args.GetDurationFromIntMillis(GRPC_ARG_KEEPALIVE_TIMEOUT_MS)
122
+ .value_or(args.keepalive_time == Duration::Infinity()
123
+ ? Duration::Infinity()
124
+ : kDefaultKeepaliveTimeout));
125
+ args.ping_timeout =
126
+ std::max(Duration::Zero(),
127
+ channel_args.GetDurationFromIntMillis(GRPC_ARG_PING_TIMEOUT_MS)
128
+ .value_or(args.keepalive_time == Duration::Infinity()
129
+ ? Duration::Infinity()
130
+ : kDefaultPingTimeout));
131
+ args.settings_timeout =
132
+ channel_args.GetDurationFromIntMillis(GRPC_ARG_SETTINGS_TIMEOUT)
133
+ .value_or(std::max(args.keepalive_timeout * 2, Duration::Minutes(1)));
134
+
135
+ args.keepalive_permit_without_calls =
136
+ channel_args.GetBool(GRPC_ARG_KEEPALIVE_PERMIT_WITHOUT_CALLS)
137
+ .value_or(kDefaultKeepalivePermitWithoutCalls);
138
+
139
+ args.enable_preferred_rx_crypto_frame_advertisement =
140
+ channel_args
141
+ .GetBool(GRPC_ARG_EXPERIMENTAL_HTTP2_PREFERRED_CRYPTO_FRAME_SIZE)
142
+ .value_or(kDefaultEnablePreferredRxCryptoFrameAdvertisement);
143
+
144
+ args.max_usable_hpack_table_size =
145
+ channel_args.GetInt(GRPC_ARG_HTTP2_HPACK_TABLE_SIZE_ENCODER).value_or(-1);
146
+
147
+ args.initial_sequence_number =
148
+ channel_args.GetInt(GRPC_ARG_HTTP2_INITIAL_SEQUENCE_NUMBER).value_or(-1);
149
+ if (args.initial_sequence_number >= 0 &&
150
+ (args.initial_sequence_number & 1) == 0) {
151
+ LOG(ERROR) << "Initial sequence number MUST be odd. Ignoring the value.";
152
+ args.initial_sequence_number = -1;
153
+ }
154
+
155
+ args.test_only_ack_pings =
156
+ channel_args.GetBool("grpc.http2.ack_pings").value_or(kDefaultAckPings);
157
+
158
+ GRPC_HTTP2_COMMON_DLOG << "ChannelArgs: " << args.DebugString();
159
+ }
160
+
56
161
  void ReadSettingsFromChannelArgs(const ChannelArgs& channel_args,
57
162
  Http2Settings& local_settings,
58
163
  chttp2::TransportFlowControl& flow_control,
@@ -108,6 +213,11 @@ void ReadSettingsFromChannelArgs(const ChannelArgs& channel_args,
108
213
  local_settings.SetAllowSecurityFrame(
109
214
  channel_args.GetBool(GRPC_ARG_SECURITY_FRAME_ALLOWED).value_or(false));
110
215
 
216
+ // TODO(tjagtap) : [PH2][P4] : If max_header_list_size is set only once
217
+ // in the life of a transport, consider making this a data member of
218
+ // class IncomingMetadataTracker instead of accessing via acked settings again
219
+ // and again. Else delete this comment.
220
+
111
221
  GRPC_HTTP2_COMMON_DLOG
112
222
  << "Http2Settings: {"
113
223
  << "header_table_size: " << local_settings.header_table_size()
@@ -124,6 +234,9 @@ void ReadSettingsFromChannelArgs(const ChannelArgs& channel_args,
124
234
  << "}";
125
235
  }
126
236
 
237
+ ///////////////////////////////////////////////////////////////////////////////
238
+ // ChannelZ helpers
239
+
127
240
  RefCountedPtr<channelz::SocketNode> CreateChannelzSocketNode(
128
241
  std::shared_ptr<grpc_event_engine::experimental::EventEngine::Endpoint>
129
242
  event_engine_endpoint,
@@ -145,5 +258,171 @@ RefCountedPtr<channelz::SocketNode> CreateChannelzSocketNode(
145
258
  return nullptr;
146
259
  }
147
260
 
261
+ ///////////////////////////////////////////////////////////////////////////////
262
+ // Flow control helpers
263
+
264
+ void ProcessOutgoingDataFrameFlowControl(
265
+ chttp2::StreamFlowControl& stream_flow_control,
266
+ const uint32_t flow_control_tokens_consumed) {
267
+ if (flow_control_tokens_consumed > 0) {
268
+ chttp2::StreamFlowControl::OutgoingUpdateContext fc_update(
269
+ &stream_flow_control);
270
+ // This updates flow control tokens for both stream and transport flow
271
+ // control.
272
+ fc_update.SentData(flow_control_tokens_consumed);
273
+ }
274
+ }
275
+
276
+ ValueOrHttp2Status<chttp2::FlowControlAction>
277
+ ProcessIncomingDataFrameFlowControl(Http2FrameHeader& frame_header,
278
+ chttp2::TransportFlowControl& flow_control,
279
+ RefCountedPtr<Stream> stream) {
280
+ GRPC_DCHECK_EQ(frame_header.type, 0u);
281
+ if (frame_header.length > 0) {
282
+ if (stream == nullptr) {
283
+ // This flow control bookkeeping needs to happen even though the stream is
284
+ // gone because otherwise we will go out-of-sync with the peer.
285
+ // The flow control numbers should be consistent for both peers.
286
+ chttp2::TransportFlowControl::IncomingUpdateContext transport_fc(
287
+ &flow_control);
288
+ absl::Status fc_status = transport_fc.RecvData(frame_header.length);
289
+ chttp2::FlowControlAction action = transport_fc.MakeAction();
290
+ GRPC_HTTP2_COMMON_DLOG
291
+ << "ProcessIncomingDataFrameFlowControl Transport RecvData status: "
292
+ << fc_status << " action: " << action.DebugString();
293
+ if (!fc_status.ok()) {
294
+ LOG(ERROR) << "Flow control error: " << fc_status.message();
295
+ // RFC9113 : A receiver MAY respond with a stream error or connection
296
+ // error of type FLOW_CONTROL_ERROR if it is unable to accept a frame.
297
+ return Http2Status::Http2ConnectionError(
298
+ Http2ErrorCode::kFlowControlError,
299
+ std::string(fc_status.message()));
300
+ }
301
+ return action;
302
+ } else {
303
+ chttp2::StreamFlowControl::IncomingUpdateContext stream_fc(
304
+ &stream->flow_control);
305
+ absl::Status fc_status = stream_fc.RecvData(frame_header.length);
306
+ chttp2::FlowControlAction action = stream_fc.MakeAction();
307
+ GRPC_HTTP2_COMMON_DLOG
308
+ << "ProcessIncomingDataFrameFlowControl Stream RecvData status: "
309
+ << fc_status << " action: " << action.DebugString();
310
+ if (!fc_status.ok()) {
311
+ LOG(ERROR) << "Flow control error: " << fc_status.message();
312
+ // RFC9113 : A receiver MAY respond with a stream error or connection
313
+ // error of type FLOW_CONTROL_ERROR if it is unable to accept a frame.
314
+ return Http2Status::Http2ConnectionError(
315
+ Http2ErrorCode::kFlowControlError,
316
+ std::string(fc_status.message()));
317
+ }
318
+ // TODO(tjagtap) [PH2][P1][FlowControl] This is a HACK. Fix this.
319
+ stream_fc.HackIncrementPendingSize(frame_header.length);
320
+ return action;
321
+ }
322
+ }
323
+ return chttp2::FlowControlAction();
324
+ }
325
+
326
+ bool ProcessIncomingWindowUpdateFrameFlowControl(
327
+ const Http2WindowUpdateFrame& frame,
328
+ chttp2::TransportFlowControl& flow_control, RefCountedPtr<Stream> stream) {
329
+ if (frame.stream_id != 0) {
330
+ if (stream != nullptr) {
331
+ GRPC_HTTP2_COMMON_DLOG
332
+ << "ProcessIncomingWindowUpdateFrameFlowControl stream "
333
+ << frame.stream_id << " increment " << frame.increment;
334
+ chttp2::StreamFlowControl::OutgoingUpdateContext fc_update(
335
+ &stream->flow_control);
336
+ fc_update.RecvUpdate(frame.increment);
337
+ } else {
338
+ // If stream id is non zero, and stream is nullptr, maybe the stream was
339
+ // closed. Ignore this WINDOW_UPDATE frame.
340
+ GRPC_HTTP2_COMMON_DLOG
341
+ << "ProcessIncomingWindowUpdateFrameFlowControl stream "
342
+ << frame.stream_id << " not found. Ignoring.";
343
+ }
344
+ } else {
345
+ GRPC_HTTP2_COMMON_DLOG
346
+ << "ProcessIncomingWindowUpdateFrameFlowControl transport increment "
347
+ << frame.increment;
348
+ chttp2::TransportFlowControl::OutgoingUpdateContext fc_update(
349
+ &flow_control);
350
+ fc_update.RecvUpdate(frame.increment);
351
+ if (fc_update.Finish() == chttp2::StallEdge::kUnstalled) {
352
+ // If transport moves from kStalled to kUnstalled, streams blocked by
353
+ // transport flow control will become writable. Return true to trigger a
354
+ // write cycle and attempt to send data from these streams.
355
+ // Although it's possible no streams were blocked, triggering an
356
+ // unnecessary write cycle in that super-rare case is acceptable.
357
+ GRPC_HTTP2_COMMON_DLOG << "ProcessIncomingWindowUpdateFrameFlowControl "
358
+ "Transport Unstalled";
359
+ return true;
360
+ }
361
+ }
362
+ return false;
363
+ }
364
+
365
+ void MaybeAddStreamWindowUpdateFrame(RefCountedPtr<Stream> stream,
366
+ std::vector<Http2Frame>& frames) {
367
+ GRPC_HTTP2_COMMON_DLOG << "MaybeAddStreamWindowUpdateFrame stream="
368
+ << ((stream == nullptr)
369
+ ? "null"
370
+ : absl::StrCat(
371
+ stream->GetStreamId(),
372
+ " CanSendWindowUpdateFrames=",
373
+ stream->CanSendWindowUpdateFrames()));
374
+ if (stream != nullptr && stream->CanSendWindowUpdateFrames()) {
375
+ const uint32_t increment = stream->flow_control.MaybeSendUpdate();
376
+ GRPC_HTTP2_COMMON_DLOG
377
+ << "MaybeAddStreamWindowUpdateFrame MaybeSendUpdate { "
378
+ << stream->GetStreamId() << ", " << increment << " }"
379
+ << (increment == 0 ? ". The frame will NOT be sent for increment 0"
380
+ : "");
381
+ if (increment > 0) {
382
+ frames.emplace_back(
383
+ Http2WindowUpdateFrame{stream->GetStreamId(), increment});
384
+ }
385
+ }
386
+ }
387
+
388
+ // /////////////////////////////////////////////////////////////////////////////
389
+ // Header and Continuation frame processing helpers
390
+
391
+ Http2Status ParseAndDiscardHeaders(HPackParser& parser, SliceBuffer&& buffer,
392
+ HeaderAssembler::ParseHeaderArgs args,
393
+ const RefCountedPtr<Stream> stream,
394
+ Http2Status&& original_status) {
395
+ GRPC_HTTP2_COMMON_DLOG << "ParseAndDiscardHeaders buffer "
396
+ "size: "
397
+ << buffer.Length() << " args: " << args.DebugString()
398
+ << " stream_id: "
399
+ << (stream == nullptr ? 0 : stream->GetStreamId())
400
+ << " original_status: "
401
+ << original_status.DebugString();
402
+
403
+ if (stream != nullptr) {
404
+ // Parse all the data in the header assembler
405
+ Http2Status result = stream->header_assembler.ParseAndDiscardHeaders(
406
+ parser, args.is_initial_metadata, args.is_client,
407
+ args.max_header_list_size_soft_limit,
408
+ args.max_header_list_size_hard_limit);
409
+ if (!result.IsOk()) {
410
+ GRPC_DCHECK(result.GetType() ==
411
+ Http2Status::Http2ErrorType::kConnectionError);
412
+ LOG(ERROR) << "Connection Error: " << result;
413
+ return result;
414
+ }
415
+ }
416
+
417
+ if (buffer.Length() == 0) {
418
+ return std::move(original_status);
419
+ }
420
+
421
+ Http2Status status = HeaderAssembler::ParseHeader(
422
+ parser, std::move(buffer), /*grpc_metadata_batch=*/nullptr, args);
423
+
424
+ return (status.IsOk()) ? std::move(original_status) : std::move(status);
425
+ }
426
+
148
427
  } // namespace http2
149
428
  } // namespace grpc_core
@@ -20,21 +20,24 @@
20
20
  #define GRPC_SRC_CORE_EXT_TRANSPORT_CHTTP2_TRANSPORT_HTTP2_TRANSPORT_H
21
21
 
22
22
  #include <cstdint>
23
- #include <utility>
23
+ #include <string>
24
24
 
25
- #include "src/core/call/call_spine.h"
26
- #include "src/core/call/metadata_info.h"
27
25
  #include "src/core/channelz/channelz.h"
28
26
  #include "src/core/ext/transport/chttp2/transport/flow_control.h"
29
27
  #include "src/core/ext/transport/chttp2/transport/frame.h"
28
+ #include "src/core/ext/transport/chttp2/transport/hpack_parser.h"
30
29
  #include "src/core/ext/transport/chttp2/transport/http2_settings.h"
31
- #include "src/core/lib/event_engine/tcp_socket_utils.h"
32
- #include "src/core/lib/promise/mpsc.h"
33
- #include "src/core/lib/promise/party.h"
30
+ #include "src/core/ext/transport/chttp2/transport/http2_settings_manager.h"
31
+ #include "src/core/ext/transport/chttp2/transport/http2_settings_promises.h"
32
+ #include "src/core/ext/transport/chttp2/transport/http2_status.h"
33
+ #include "src/core/ext/transport/chttp2/transport/stream.h"
34
+ #include "src/core/lib/promise/activity.h"
35
+ #include "src/core/lib/promise/context.h"
36
+ #include "src/core/lib/promise/poll.h"
34
37
  #include "src/core/lib/transport/promise_endpoint.h"
35
- #include "src/core/lib/transport/transport.h"
36
38
  #include "src/core/util/ref_counted_ptr.h"
37
- #include "src/core/util/sync.h"
39
+ #include "absl/log/log.h"
40
+ #include "absl/status/status.h"
38
41
 
39
42
  namespace grpc_core {
40
43
  namespace http2 {
@@ -49,34 +52,199 @@ namespace http2 {
49
52
  #define GRPC_HTTP2_CLIENT_DLOG \
50
53
  DLOG_IF(INFO, GRPC_TRACE_FLAG_ENABLED(http2_ph2_transport))
51
54
 
55
+ #define GRPC_HTTP2_CLIENT_ERROR_DLOG \
56
+ LOG_IF(ERROR, GRPC_TRACE_FLAG_ENABLED(http2_ph2_transport))
57
+
52
58
  #define GRPC_HTTP2_COMMON_DLOG \
53
59
  DLOG_IF(INFO, GRPC_TRACE_FLAG_ENABLED(http2_ph2_transport))
54
60
 
55
- // TODO(akshitpatel) : [PH2][P4] : Choose appropriate size later.
56
- constexpr uint32_t kStreamQueueSize = /*1 MB*/ 1024u * 1024u;
57
61
  constexpr uint32_t kMaxWriteSize = /*10 MB*/ 10u * 1024u * 1024u;
58
62
 
59
- enum class HttpStreamState : uint8_t {
60
- // https://www.rfc-editor.org/rfc/rfc9113.html#name-stream-states
61
- kIdle,
62
- kOpen,
63
- kHalfClosedLocal,
64
- kHalfClosedRemote,
65
- kClosed,
63
+ constexpr uint32_t kGoawaySendTimeoutSeconds = 5u;
64
+
65
+ struct CloseStreamArgs {
66
+ bool close_reads;
67
+ bool close_writes;
68
+ };
69
+
70
+ ///////////////////////////////////////////////////////////////////////////////
71
+ // Read and Write helpers
72
+
73
+ class Http2ReadContext {
74
+ public:
75
+ // Signals that the read loop should pause. If it's already paused, this is a
76
+ // no-op.
77
+ void SetPauseReadLoop() {
78
+ // TODO(tjagtap) [PH2][P2][Settings] Plumb with when we receive urgent
79
+ // settings. Example - initial window size 0 is urgent because it indicates
80
+ // extreme memory pressure on the server.
81
+ should_pause_read_loop_ = true;
82
+ }
83
+
84
+ // If SetPauseReadLoop() was called, this returns Pending and
85
+ // registers a waker that will be woken by WakeReadLoop().
86
+ // If SetPauseReadLoop() was not called, this returns OkStatus.
87
+ // This should be polled by the read loop to yield control when requested.
88
+ Poll<absl::Status> MaybePauseReadLoop() {
89
+ if (should_pause_read_loop_) {
90
+ read_loop_waker_ = GetContext<Activity>()->MakeNonOwningWaker();
91
+ return Pending{};
92
+ }
93
+ return absl::OkStatus();
94
+ }
95
+
96
+ // If SetPauseReadLoop() was called, resumes it by
97
+ // waking up the ReadLoop. If not paused, this is a no-op.
98
+ void ResumeReadLoopIfPaused() {
99
+ if (should_pause_read_loop_) {
100
+ should_pause_read_loop_ = false;
101
+ read_loop_waker_.Wakeup();
102
+ }
103
+ }
104
+
105
+ private:
106
+ bool should_pause_read_loop_ = false;
107
+ Waker read_loop_waker_;
108
+ };
109
+
110
+ inline PromiseEndpoint::WriteArgs GetWriteArgs(
111
+ const Http2Settings& peer_settings) {
112
+ PromiseEndpoint::WriteArgs args;
113
+ int max_frame_size = peer_settings.preferred_receive_crypto_message_size();
114
+ // Note: max frame size is 0 if the remote peer does not support adjusting the
115
+ // sending frame size.
116
+ if (max_frame_size == 0) {
117
+ max_frame_size = INT_MAX;
118
+ }
119
+ // `WriteArgs.max_frame_size` is a suggestion to the endpoint implementation
120
+ // to group data to be written into frames of the specified max_frame_size. It
121
+ // is different from HTTP2 SETTINGS_MAX_FRAME_SIZE. That setting limits HTTP2
122
+ // frame payload size.
123
+ args.set_max_frame_size(max_frame_size);
124
+
125
+ // TODO(akshitpatel) [PH2][P1] : Currently only the WriteArgs related to
126
+ // preferred_receive_crypto_message_size have been plumbed. The other write
127
+ // args may need to be plumbed for PH2.
128
+ // CHTTP2 : Reference :
129
+ // File : src/core/ext/transport/chttp2/transport/chttp2_transport.cc
130
+ // Function : write_action
131
+
132
+ return args;
133
+ }
134
+
135
+ ///////////////////////////////////////////////////////////////////////////////
136
+ // Settings helpers
137
+
138
+ void InitLocalSettings(Http2Settings& settings, bool is_client);
139
+
140
+ ////////////////////////////////////////////////////////////////////////////////
141
+ // Channel Args helpers
142
+
143
+ struct TransportChannelArgs {
144
+ Duration keepalive_time;
145
+ Duration keepalive_timeout;
146
+ Duration ping_timeout;
147
+ Duration settings_timeout;
148
+ bool keepalive_permit_without_calls;
149
+ bool enable_preferred_rx_crypto_frame_advertisement;
150
+ // This is used to test peer behaviour when we never send a ping ack.
151
+ bool test_only_ack_pings;
152
+ uint32_t max_header_list_size_soft_limit;
153
+ int max_usable_hpack_table_size;
154
+ int initial_sequence_number;
155
+
156
+ std::string DebugString() const {
157
+ return absl::StrCat(
158
+ "keepalive_time: ", keepalive_time,
159
+ " keepalive_timeout: ", keepalive_timeout,
160
+ " ping_timeout: ", ping_timeout,
161
+ " settings_timeout: ", settings_timeout,
162
+ " keepalive_permit_without_calls: ", keepalive_permit_without_calls,
163
+ " enable_preferred_rx_crypto_frame_advertisement: ",
164
+ enable_preferred_rx_crypto_frame_advertisement,
165
+ " max_header_list_size_soft_limit: ", max_header_list_size_soft_limit,
166
+ " max_usable_hpack_table_size: ", max_usable_hpack_table_size,
167
+ " initial_sequence_number: ", initial_sequence_number,
168
+ " test_only_ack_pings: ", test_only_ack_pings);
169
+ }
66
170
  };
67
171
 
68
- void InitLocalSettings(Http2Settings& settings, const bool is_client);
172
+ void ReadChannelArgs(const ChannelArgs& channel_args,
173
+ TransportChannelArgs& args, Http2Settings& local_settings,
174
+ chttp2::TransportFlowControl& flow_control,
175
+ bool is_client);
69
176
 
70
177
  void ReadSettingsFromChannelArgs(const ChannelArgs& channel_args,
71
178
  Http2Settings& local_settings,
72
179
  chttp2::TransportFlowControl& flow_control,
73
- const bool is_client);
180
+ bool is_client);
181
+
182
+ ///////////////////////////////////////////////////////////////////////////////
183
+ // ChannelZ helpers
74
184
 
75
185
  RefCountedPtr<channelz::SocketNode> CreateChannelzSocketNode(
76
186
  std::shared_ptr<grpc_event_engine::experimental::EventEngine::Endpoint>
77
187
  event_engine_endpoint,
78
188
  const ChannelArgs& args);
79
189
 
190
+ ///////////////////////////////////////////////////////////////////////////////
191
+ // Flow control helpers
192
+
193
+ void ProcessOutgoingDataFrameFlowControl(
194
+ chttp2::StreamFlowControl& stream_flow_control,
195
+ uint32_t flow_control_tokens_consumed);
196
+
197
+ ValueOrHttp2Status<chttp2::FlowControlAction>
198
+ ProcessIncomingDataFrameFlowControl(Http2FrameHeader& frame,
199
+ chttp2::TransportFlowControl& flow_control,
200
+ RefCountedPtr<Stream> stream);
201
+
202
+ // Returns true if a write should be triggered
203
+ bool ProcessIncomingWindowUpdateFrameFlowControl(
204
+ const Http2WindowUpdateFrame& frame,
205
+ chttp2::TransportFlowControl& flow_control, RefCountedPtr<Stream> stream);
206
+
207
+ void MaybeAddStreamWindowUpdateFrame(RefCountedPtr<Stream> stream,
208
+ std::vector<Http2Frame>& frames);
209
+
210
+ ///////////////////////////////////////////////////////////////////////////////
211
+ // Header and Continuation frame processing helpers
212
+
213
+ // This function is used to partially process a HEADER or CONTINUATION frame.
214
+ // `PARTIAL PROCESSING` means reading the payload of a HEADER or CONTINUATION
215
+ // and processing it with the HPACK decoder, and then discarding the payload.
216
+ // This is done to keep the transports HPACK parser in sync with peers HPACK.
217
+ // Scenarios where 'partial processing' is used:
218
+ //
219
+ // Case 1: Received a HEADER/CONTINUATION frame
220
+ // 1. If the frame is invalid ('ParseHeaderFrame'/'ParseContinuationFrame'
221
+ // returns a non-OK status) then it is a connection error. In this case, we
222
+ // do NOT invoke 'partial processing' as the transport is about to be closed
223
+ // anyway.
224
+ // 2. If ParseFramePayload returns a non-OK status, then it is a connection
225
+ // error. In this case, we do NOT invoke 'partial processing' as the
226
+ // transport is about to be closed anyway.
227
+ // 3. If the frame is valid, but lookup stream fails, then we invoke 'partial
228
+ // processing' and pass the current payload through the HPACK decoder. This
229
+ // can happen if the stream was already closed.
230
+ // 4. If the frame is valid, lookup stream succeeds and we fail while processing
231
+ // the frame (be it stream or connection error), we first parse the buffered
232
+ // payload (if any) in the stream through the HPACK decoder and then pass the
233
+ // current payload through the HPACK decoder.
234
+ // Case 2: Stream close
235
+ // 1. If the stream is being aborted by the upper layers or the transport hit
236
+ // a stream error on a stream while reading HEADER/CONTINUATION frames, we
237
+ // invoke 'partial processing' to parse the enqueued buffer (if any) in the
238
+ // stream to keep our HPACK state consistent with the peer right before
239
+ // closing the stream. This is done as the next time a HEADER/CONTINUATION
240
+ // frame is received from the peer, the stream lookup will start failing.
241
+ // This function returns a connection error if HPACK parsing fails. Otherwise,
242
+ // it returns the original status.
243
+ Http2Status ParseAndDiscardHeaders(HPackParser& parser, SliceBuffer&& buffer,
244
+ HeaderAssembler::ParseHeaderArgs args,
245
+ RefCountedPtr<Stream> stream,
246
+ Http2Status&& original_status);
247
+
80
248
  } // namespace http2
81
249
  } // namespace grpc_core
82
250
 
@@ -221,6 +221,62 @@ struct H2EndWriteCycle {
221
221
  }
222
222
  };
223
223
 
224
+ struct H2TcpMetricsTrace {
225
+ std::shared_ptr<
226
+ grpc_event_engine::experimental::EventEngine::Endpoint::TelemetryInfo>
227
+ telemetry_info;
228
+ grpc_event_engine::experimental::EventEngine::Endpoint::WriteEvent event;
229
+ std::vector<
230
+ grpc_event_engine::experimental::EventEngine::Endpoint::WriteMetric>
231
+ metrics;
232
+ absl::Time timestamp;
233
+
234
+ size_t MemoryUsage() const {
235
+ return sizeof(H2TcpMetricsTrace) + metrics.capacity() * sizeof(metrics[0]);
236
+ }
237
+
238
+ channelz::PropertyList ChannelzProperties() const {
239
+ absl::string_view event_string = "unknown";
240
+ switch (event) {
241
+ case grpc_event_engine::experimental::EventEngine::Endpoint::WriteEvent::
242
+ kSendMsg:
243
+ event_string = "send_msg";
244
+ break;
245
+ case grpc_event_engine::experimental::EventEngine::Endpoint::WriteEvent::
246
+ kScheduled:
247
+ event_string = "scheduled";
248
+ break;
249
+ case grpc_event_engine::experimental::EventEngine::Endpoint::WriteEvent::
250
+ kSent:
251
+ event_string = "sent";
252
+ break;
253
+ case grpc_event_engine::experimental::EventEngine::Endpoint::WriteEvent::
254
+ kAcked:
255
+ event_string = "acked";
256
+ break;
257
+ case grpc_event_engine::experimental::EventEngine::Endpoint::WriteEvent::
258
+ kClosed:
259
+ event_string = "closed";
260
+ break;
261
+ default:
262
+ break;
263
+ }
264
+ return channelz::PropertyList()
265
+ .Set("event", event_string)
266
+ .Set("tcp_event_timestamp", timestamp)
267
+ .Merge([this]() {
268
+ channelz::PropertyList props;
269
+ for (const auto& metric : metrics) {
270
+ if (auto key = telemetry_info->GetMetricName(metric.key);
271
+ key.has_value()) {
272
+ props.Set(*key, metric.value);
273
+ }
274
+ }
275
+ return props;
276
+ }());
277
+ }
278
+ };
279
+
224
280
  using Http2ZTraceCollector = channelz::ZTraceCollector<
225
281
  http2_ztrace_collector_detail::Config, H2DataTrace<false>,
226
282
  H2HeaderTrace<false>, H2RstStreamTrace<false>, H2SettingsTrace<false>,
@@ -229,7 +285,7 @@ using Http2ZTraceCollector = channelz::ZTraceCollector<
229
285
  H2RstStreamTrace<true>, H2SettingsTrace<true>, H2PingTrace<true>,
230
286
  H2GoAwayTrace<true>, H2WindowUpdateTrace<true>, H2SecurityTrace<true>,
231
287
  H2UnknownFrameTrace, H2FlowControlStall, H2BeginWriteCycle, H2EndWriteCycle,
232
- H2BeginEndpointWrite>;
288
+ H2BeginEndpointWrite, H2TcpMetricsTrace>;
233
289
 
234
290
  struct PromiseEndpointReadTrace {
235
291
  uint64_t bytes;