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
@@ -23,14 +23,12 @@
23
23
  #include <limits.h>
24
24
  #include <stdint.h>
25
25
 
26
+ #include <algorithm>
26
27
  #include <iosfwd>
27
28
  #include <optional>
28
29
  #include <string>
29
30
  #include <utility>
30
31
 
31
- #include "absl/functional/function_ref.h"
32
- #include "absl/status/status.h"
33
- #include "absl/strings/string_view.h"
34
32
  #include "src/core/channelz/property_list.h"
35
33
  #include "src/core/ext/transport/chttp2/transport/http2_settings.h"
36
34
  #include "src/core/ext/transport/chttp2/transport/http2_settings_manager.h"
@@ -39,12 +37,11 @@
39
37
  #include "src/core/lib/transport/bdp_estimator.h"
40
38
  #include "src/core/util/grpc_check.h"
41
39
  #include "src/core/util/time.h"
42
-
43
- namespace grpc {
44
- namespace testing {
45
- class TrickledCHTTP2; // to make this a friend
46
- } // namespace testing
47
- } // namespace grpc
40
+ #include "absl/functional/function_ref.h"
41
+ #include "absl/log/log.h"
42
+ #include "absl/status/status.h"
43
+ #include "absl/strings/str_cat.h"
44
+ #include "absl/strings/string_view.h"
48
45
 
49
46
  namespace grpc_core {
50
47
  namespace chttp2 {
@@ -59,11 +56,18 @@ static constexpr const uint32_t kMaxInitialWindowSize = (1u << 30);
59
56
  static constexpr const int64_t kMaxWindowDelta = (1u << 20);
60
57
  static constexpr const int kDefaultPreferredRxCryptoFrameSize = INT_MAX;
61
58
 
59
+ // TODO(tjagtap) [PH2][P2][BDP] Remove this static sleep when the BDP code is
60
+ // done. This needs to be dynamic.
61
+ constexpr Duration kFlowControlPeriodicUpdateTimer = Duration::Seconds(8);
62
+
62
63
  class TransportFlowControl;
63
64
  class StreamFlowControl;
64
65
 
65
66
  enum class StallEdge { kNoChange, kStalled, kUnstalled };
66
67
 
68
+ #define GRPC_HTTP2_FLOW_CONTROL_DLOG \
69
+ DLOG_IF(INFO, GRPC_TRACE_FLAG_ENABLED(http2_ph2_transport))
70
+
67
71
  // Encapsulates a collections of actions the transport needs to take with
68
72
  // regard to flow control. Each action comes with urgencies that tell the
69
73
  // transport how quickly the action must take place.
@@ -72,10 +76,10 @@ class GRPC_MUST_USE_RESULT FlowControlAction {
72
76
  enum class Urgency : uint8_t {
73
77
  // Nothing to be done.
74
78
  NO_ACTION_NEEDED = 0,
75
- // Initiate a write to update the initial window immediately.
79
+ // Initiate a write to send updates immediately.
76
80
  UPDATE_IMMEDIATELY,
77
- // Push the flow control update into a send buffer, to be sent
78
- // out the next time a write is initiated.
81
+ // Queue the flow control update, to be sent out the next time a write is
82
+ // initiated.
79
83
  QUEUE_UPDATE,
80
84
  };
81
85
 
@@ -90,6 +94,8 @@ class GRPC_MUST_USE_RESULT FlowControlAction {
90
94
  Urgency preferred_rx_crypto_frame_size_update() const {
91
95
  return preferred_rx_crypto_frame_size_update_;
92
96
  }
97
+
98
+ // Returns true if any action has UPDATE_IMMEDIATELY urgency.
93
99
  bool AnyUpdateImmediately() const {
94
100
  return send_stream_update_ == Urgency::UPDATE_IMMEDIATELY ||
95
101
  send_transport_update_ == Urgency::UPDATE_IMMEDIATELY ||
@@ -99,12 +105,56 @@ class GRPC_MUST_USE_RESULT FlowControlAction {
99
105
  Urgency::UPDATE_IMMEDIATELY;
100
106
  }
101
107
 
108
+ std::string ImmediateUpdateReasons() const;
109
+
110
+ // Returns the value of SETTINGS_INITIAL_WINDOW_SIZE that we will send to the
111
+ // peer.
102
112
  uint32_t initial_window_size() const { return initial_window_size_; }
113
+ // Returns the value of SETTINGS_MAX_FRAME_SIZE that we will send to the peer.
103
114
  uint32_t max_frame_size() const { return max_frame_size_; }
115
+ // Returns the value of GRPC_PREFERRED_RECEIVE_CRYPTO_FRAME_SIZE that we will
116
+ // send to the peer.
104
117
  uint32_t preferred_rx_crypto_frame_size() const {
105
118
  return preferred_rx_crypto_frame_size_;
106
119
  }
107
120
 
121
+ FlowControlAction& test_only_set_send_initial_window_update(Urgency u,
122
+ uint32_t update) {
123
+ return set_send_initial_window_update(u, update);
124
+ }
125
+ FlowControlAction& test_only_set_send_max_frame_size_update(Urgency u,
126
+ uint32_t update) {
127
+ return set_send_max_frame_size_update(u, update);
128
+ }
129
+ FlowControlAction& test_only_set_preferred_rx_crypto_frame_size_update(
130
+ Urgency u, uint32_t update) {
131
+ return set_preferred_rx_crypto_frame_size_update(u, update);
132
+ }
133
+
134
+ static const char* UrgencyString(Urgency u);
135
+ std::string DebugString() const;
136
+
137
+ void AssertEmpty() { GRPC_CHECK(*this == FlowControlAction()); }
138
+
139
+ bool operator==(const FlowControlAction& other) const {
140
+ return send_stream_update_ == other.send_stream_update_ &&
141
+ send_transport_update_ == other.send_transport_update_ &&
142
+ send_initial_window_update_ == other.send_initial_window_update_ &&
143
+ send_max_frame_size_update_ == other.send_max_frame_size_update_ &&
144
+ (send_initial_window_update_ == Urgency::NO_ACTION_NEEDED ||
145
+ initial_window_size_ == other.initial_window_size_) &&
146
+ (send_max_frame_size_update_ == Urgency::NO_ACTION_NEEDED ||
147
+ max_frame_size_ == other.max_frame_size_) &&
148
+ (preferred_rx_crypto_frame_size_update_ ==
149
+ Urgency::NO_ACTION_NEEDED ||
150
+ preferred_rx_crypto_frame_size_ ==
151
+ other.preferred_rx_crypto_frame_size_);
152
+ }
153
+
154
+ private:
155
+ friend class StreamFlowControl;
156
+ friend class TransportFlowControl;
157
+
108
158
  FlowControlAction& set_send_stream_update(Urgency u) {
109
159
  send_stream_update_ = u;
110
160
  return *this;
@@ -132,27 +182,6 @@ class GRPC_MUST_USE_RESULT FlowControlAction {
132
182
  return *this;
133
183
  }
134
184
 
135
- static const char* UrgencyString(Urgency u);
136
- std::string DebugString() const;
137
-
138
- void AssertEmpty() { GRPC_CHECK(*this == FlowControlAction()); }
139
-
140
- bool operator==(const FlowControlAction& other) const {
141
- return send_stream_update_ == other.send_stream_update_ &&
142
- send_transport_update_ == other.send_transport_update_ &&
143
- send_initial_window_update_ == other.send_initial_window_update_ &&
144
- send_max_frame_size_update_ == other.send_max_frame_size_update_ &&
145
- (send_initial_window_update_ == Urgency::NO_ACTION_NEEDED ||
146
- initial_window_size_ == other.initial_window_size_) &&
147
- (send_max_frame_size_update_ == Urgency::NO_ACTION_NEEDED ||
148
- max_frame_size_ == other.max_frame_size_) &&
149
- (preferred_rx_crypto_frame_size_update_ ==
150
- Urgency::NO_ACTION_NEEDED ||
151
- preferred_rx_crypto_frame_size_ ==
152
- other.preferred_rx_crypto_frame_size_);
153
- }
154
-
155
- private:
156
185
  Urgency send_stream_update_ = Urgency::NO_ACTION_NEEDED;
157
186
  Urgency send_transport_update_ = Urgency::NO_ACTION_NEEDED;
158
187
  Urgency send_initial_window_update_ = Urgency::NO_ACTION_NEEDED;
@@ -168,6 +197,7 @@ std::ostream& operator<<(std::ostream& out, const FlowControlAction& action);
168
197
 
169
198
  // Implementation of flow control that abides to HTTP/2 spec and attempts
170
199
  // to be as performant as possible.
200
+ // This class manages the flow control at a connection level.
171
201
  class TransportFlowControl final {
172
202
  public:
173
203
  explicit TransportFlowControl(absl::string_view name, bool enable_bdp_probe,
@@ -176,16 +206,19 @@ class TransportFlowControl final {
176
206
 
177
207
  bool bdp_probe() const { return enable_bdp_probe_; }
178
208
 
179
- // returns an announce if we should send a transport update to our peer,
180
- // else returns zero; writing_anyway indicates if a write would happen
209
+ // Returns a non-zero announce if we should send a transport update to our
210
+ // peer, else returns zero; writing_anyway indicates if a write would happen
181
211
  // regardless of the send - if it is false and this function returns non-zero,
182
- // this announce will cause a write to occur
212
+ // the caller can send a flow control update.
183
213
  uint32_t DesiredAnnounceSize(bool writing_anyway) const;
184
- // notify that we've actually sent a stream window update
185
- // (should be DesiredAnnounceSize())
214
+
215
+ // Call to update transport flow control state after sending a transport
216
+ // WINDOW_UPDATE with `announce` size. `announce` should be value returned
217
+ // by `DesiredAnnounceSize`.
186
218
  void SentUpdate(uint32_t announce);
187
219
 
188
- // Older API: combines getting the DesiredAnnounceSize() with SentUpdate()
220
+ // Convenience method that combines `DesiredAnnounceSize` and `SentUpdate`.
221
+ // Call to get window increment and update state in one go.
189
222
  uint32_t MaybeSendUpdate(bool writing_anyway) {
190
223
  uint32_t n = DesiredAnnounceSize(writing_anyway);
191
224
  SentUpdate(n);
@@ -193,8 +226,8 @@ class TransportFlowControl final {
193
226
  }
194
227
 
195
228
  // Track an update to the incoming flow control counters - that is how many
196
- // tokens we report to our peer that we're willing to accept.
197
- // Instantiators *must* call MakeAction before destruction of this value.
229
+ // tokens we report to our peer for the data that we are willing to accept.
230
+ // Instantiators *must* call MakeAction before destruction of this object.
198
231
  class IncomingUpdateContext {
199
232
  public:
200
233
  explicit IncomingUpdateContext(TransportFlowControl* tfc) : tfc_(tfc) {}
@@ -202,19 +235,32 @@ class TransportFlowControl final {
202
235
 
203
236
  IncomingUpdateContext(const IncomingUpdateContext&) = delete;
204
237
  IncomingUpdateContext& operator=(const IncomingUpdateContext&) = delete;
238
+ IncomingUpdateContext(IncomingUpdateContext&&) = delete;
239
+ IncomingUpdateContext& operator=(IncomingUpdateContext&&) = delete;
205
240
 
206
241
  // Reads the flow control data and returns an actionable struct that will
207
- // tell chttp2 exactly what it needs to do
242
+ // tell the transport exactly what it needs to do.
208
243
  FlowControlAction MakeAction() {
209
244
  return std::exchange(tfc_, nullptr)->UpdateAction(FlowControlAction());
210
245
  }
211
246
 
212
- // Notify of data receipt. Returns OkStatus if the data was accepted,
213
- // else an error status if the connection should be closed.
247
+ // We have received data from the wire.
248
+ // We check if this data is within our flow control limits or not.
249
+ // If it exceeds the limit, we send an error.
250
+ // RFC9113 : A receiver MAY respond with a stream error or connection
251
+ // error of type FLOW_CONTROL_ERROR if it is unable to accept a frame.
252
+ //
253
+ // This function updates transport window for received data.
254
+ // Call this ONLY IF stream is not available (e.g. already closed) AND
255
+ // transport window must be updated to remain in sync with peer.
256
+ // If stream IS available, call RecvData() on
257
+ // StreamFlowControl::IncomingUpdateContext instead.
214
258
  absl::Status RecvData(
215
259
  int64_t incoming_frame_size, absl::FunctionRef<absl::Status()> stream =
216
260
  []() { return absl::OkStatus(); });
217
261
 
262
+ private:
263
+ friend class StreamFlowControl;
218
264
  // Update a stream announce window delta, keeping track of how much total
219
265
  // positive delta is present on the transport.
220
266
  void UpdateAnnouncedWindowDelta(int64_t* delta, int64_t change) {
@@ -228,7 +274,6 @@ class TransportFlowControl final {
228
274
  }
229
275
  }
230
276
 
231
- private:
232
277
  TransportFlowControl* tfc_;
233
278
  };
234
279
 
@@ -237,9 +282,14 @@ class TransportFlowControl final {
237
282
  class OutgoingUpdateContext {
238
283
  public:
239
284
  explicit OutgoingUpdateContext(TransportFlowControl* tfc) : tfc_(tfc) {}
240
- void StreamSentData(int64_t size) { tfc_->remote_window_ -= size; }
241
285
 
242
- // we have received a WINDOW_UPDATE frame for a transport
286
+ OutgoingUpdateContext(const OutgoingUpdateContext&) = delete;
287
+ OutgoingUpdateContext& operator=(const OutgoingUpdateContext&) = delete;
288
+ OutgoingUpdateContext(OutgoingUpdateContext&&) = delete;
289
+ OutgoingUpdateContext& operator=(OutgoingUpdateContext&&) = delete;
290
+
291
+ // Call this function when a transport-level WINDOW_UPDATE frame is received
292
+ // from peer to increase remote window.
243
293
  void RecvUpdate(uint32_t size) { tfc_->remote_window_ += size; }
244
294
 
245
295
  // Finish the update and check whether we became stalled or unstalled.
@@ -253,29 +303,37 @@ class TransportFlowControl final {
253
303
  }
254
304
 
255
305
  private:
306
+ friend class StreamFlowControl;
307
+ void StreamSentData(int64_t size) { tfc_->remote_window_ -= size; }
308
+
256
309
  TransportFlowControl* tfc_;
257
310
  const bool was_stalled_ = tfc_->remote_window_ <= 0;
258
311
  };
259
312
 
260
313
  // Call periodically (at a low-ish rate, 100ms - 10s makes sense)
261
314
  // to perform more complex flow control calculations and return an action
262
- // to let chttp2 change its parameters
315
+ // to let the transport change its parameters.
316
+ // TODO(tjagtap) [PH2][P2] Plumb with PH2 flow control.
263
317
  FlowControlAction PeriodicUpdate();
264
318
 
265
- int64_t target_window() const;
266
- int64_t target_frame_size() const { return target_frame_size_; }
267
- int64_t target_preferred_rx_crypto_frame_size() const {
268
- return target_preferred_rx_crypto_frame_size_;
319
+ int64_t test_only_target_window() const { return target_window(); }
320
+ int64_t test_only_target_frame_size() const { return target_frame_size(); }
321
+ int64_t test_only_target_preferred_rx_crypto_frame_size() const {
322
+ return target_preferred_rx_crypto_frame_size();
269
323
  }
270
324
 
271
325
  BdpEstimator* bdp_estimator() { return &bdp_estimator_; }
272
326
 
273
- uint32_t acked_init_window() const { return acked_init_window_; }
274
- uint32_t queued_init_window() const { return target_initial_window_size_; }
275
- uint32_t sent_init_window() const { return sent_init_window_; }
327
+ uint32_t test_only_acked_init_window() const { return acked_init_window(); }
328
+ uint32_t test_only_sent_init_window() const { return sent_init_window(); }
276
329
 
330
+ // Call after you prepare and queue a settings frame to send to the peer.
277
331
  void FlushedSettings() { sent_init_window_ = queued_init_window(); }
278
332
 
333
+ // Updates the initial window size that we have acknowledged from the peer.
334
+ // This affects stream-level flow control for data received from the peer.
335
+ // If the new value differs from target_initial_window_size_, we return an
336
+ // action to send an update to the peer with our target.
279
337
  FlowControlAction SetAckedInitialWindow(uint32_t value);
280
338
 
281
339
  void set_target_initial_window_size(uint32_t value) {
@@ -285,16 +343,10 @@ class TransportFlowControl final {
285
343
 
286
344
  // Getters
287
345
  int64_t remote_window() const { return remote_window_; }
288
- int64_t announced_window() const { return announced_window_; }
289
-
290
- int64_t announced_stream_total_over_incoming_window() const {
291
- return announced_stream_total_over_incoming_window_;
292
- }
346
+ int64_t test_only_announced_window() const { return announced_window(); }
293
347
 
294
- void RemoveAnnouncedWindowDelta(int64_t delta) {
295
- if (delta > 0) {
296
- announced_stream_total_over_incoming_window_ -= delta;
297
- }
348
+ int64_t test_only_announced_stream_total_over_incoming_window() const {
349
+ return announced_stream_total_over_incoming_window();
298
350
  }
299
351
 
300
352
  // A snapshot of the flow control stats to export.
@@ -353,7 +405,28 @@ class TransportFlowControl final {
353
405
  }
354
406
 
355
407
  private:
408
+ friend class StreamFlowControl;
409
+
410
+ void RemoveAnnouncedWindowDelta(int64_t delta) {
411
+ if (delta > 0) {
412
+ announced_stream_total_over_incoming_window_ -= delta;
413
+ }
414
+ }
415
+
356
416
  double TargetInitialWindowSizeBasedOnMemoryPressureAndBdp() const;
417
+ int64_t target_window() const;
418
+ int64_t target_frame_size() const { return target_frame_size_; }
419
+ int64_t target_preferred_rx_crypto_frame_size() const {
420
+ return target_preferred_rx_crypto_frame_size_;
421
+ }
422
+ uint32_t acked_init_window() const { return acked_init_window_; }
423
+ uint32_t queued_init_window() const { return target_initial_window_size_; }
424
+ uint32_t sent_init_window() const { return sent_init_window_; }
425
+ int64_t announced_window() const { return announced_window_; }
426
+ int64_t announced_stream_total_over_incoming_window() const {
427
+ return announced_stream_total_over_incoming_window_;
428
+ }
429
+
357
430
  static void UpdateSetting(absl::string_view name, int64_t* desired_value,
358
431
  uint32_t new_desired_value,
359
432
  FlowControlAction* action,
@@ -407,20 +480,50 @@ class StreamFlowControl final {
407
480
  explicit IncomingUpdateContext(StreamFlowControl* sfc)
408
481
  : tfc_upd_(sfc->tfc_), sfc_(sfc) {}
409
482
 
483
+ IncomingUpdateContext(const IncomingUpdateContext&) = delete;
484
+ IncomingUpdateContext& operator=(const IncomingUpdateContext&) = delete;
485
+ IncomingUpdateContext(IncomingUpdateContext&&) = delete;
486
+ IncomingUpdateContext& operator=(IncomingUpdateContext&&) = delete;
487
+
410
488
  FlowControlAction MakeAction() {
411
489
  return sfc_->UpdateAction(tfc_upd_.MakeAction());
412
490
  }
413
491
 
414
- // we have received data from the wire
492
+ // We have received data from the wire.
493
+ // We check if this data is within our flow control limits or not.
494
+ // If it exceeds the limit, we send an error.
495
+ // RFC9113 : A receiver MAY respond with a stream error or connection
496
+ // error of type FLOW_CONTROL_ERROR if it is unable to accept a frame.
497
+ //
498
+ // Updates stream and transport window for received data on an active
499
+ // stream. Calling this updates BOTH windows; do not call
500
+ // TransportFlowControl::IncomingUpdateContext::RecvData() separately.
415
501
  absl::Status RecvData(int64_t incoming_frame_size);
416
502
 
417
- // the application is asking for a certain amount of bytes
503
+ // Informs flow control that the application needs at least
504
+ // `min_progress_size` bytes to make progress on reading the current stream.
505
+ // An example usage of this would be, say we receive the first 1000 bytes of
506
+ // a 2000 byte gRPC message, we can call SetMinProgressSize(1000)
507
+ // TODO(tjagtap) [PH2][P2] Plumb with PH2 flow control.
418
508
  void SetMinProgressSize(int64_t min_progress_size) {
419
509
  sfc_->min_progress_size_ = min_progress_size;
420
510
  }
421
511
 
512
+ // Informs flow control that `pending_size` bytes are buffered and waiting
513
+ // for application to read. Call this when a complete message is assembled
514
+ // but not yet pulled by the application. This helps flow control decide
515
+ // whether to send a WINDOW_UPDATE to the peer.
516
+ // TODO(tjagtap) [PH2][P1] Plumb with PH2 flow control.
422
517
  void SetPendingSize(int64_t pending_size);
423
518
 
519
+ // This is a hack in place till SetPendingSize is fully plumbed. This hack
520
+ // function just pretends that the application needs more bytes. Since we
521
+ // dont actually know how many bytes the application needs, we just want to
522
+ // refill the used up tokens. The only way to refill used up tokens is to
523
+ // call this function for each DATA frame.
524
+ // TODO(tjagtap) [PH2][P1] Remove hack after SetPendingSize is plumbed.
525
+ void HackIncrementPendingSize(int64_t pending_size);
526
+
424
527
  private:
425
528
  TransportFlowControl::IncomingUpdateContext tfc_upd_;
426
529
  StreamFlowControl* const sfc_;
@@ -432,10 +535,18 @@ class StreamFlowControl final {
432
535
  public:
433
536
  explicit OutgoingUpdateContext(StreamFlowControl* sfc)
434
537
  : tfc_upd_(sfc->tfc_), sfc_(sfc) {}
435
- // we have received a WINDOW_UPDATE frame for a stream
538
+
539
+ OutgoingUpdateContext(const OutgoingUpdateContext&) = delete;
540
+ OutgoingUpdateContext& operator=(const OutgoingUpdateContext&) = delete;
541
+ OutgoingUpdateContext(OutgoingUpdateContext&&) = delete;
542
+ OutgoingUpdateContext& operator=(OutgoingUpdateContext&&) = delete;
543
+
544
+ // Call this when a WINDOW_UPDATE frame is received from peer for this
545
+ // stream, to increase send window.
436
546
  void RecvUpdate(uint32_t size) { sfc_->remote_window_delta_ += size; }
437
- // we have sent data on the wire, we must track this in our bookkeeping for
438
- // the remote peer's flow control.
547
+
548
+ // Call this after sending a DATA frame for this stream, to decrease send
549
+ // window based on `outgoing_frame_size`.
439
550
  void SentData(int64_t outgoing_frame_size) {
440
551
  tfc_upd_.StreamSentData(outgoing_frame_size);
441
552
  sfc_->remote_window_delta_ -= outgoing_frame_size;
@@ -446,14 +557,17 @@ class StreamFlowControl final {
446
557
  StreamFlowControl* const sfc_;
447
558
  };
448
559
 
449
- // returns an announce if we should send a stream update to our peer, else
450
- // returns zero
560
+ // Returns a non-zero announce if we should send a stream update to our
561
+ // peer, else returns zero;
451
562
  uint32_t DesiredAnnounceSize() const;
452
- // notify that we've actually sent a stream window update
453
- // (should be DesiredAnnounceSize())
563
+
564
+ // Call after sending stream-level WINDOW_UPDATE to peer to update internal
565
+ // state. Argument should be value previously returned by
566
+ // `DesiredAnnounceSize`.
454
567
  void SentUpdate(uint32_t announce);
455
568
 
456
- // Older API: combines getting the DesiredAnnounceSize() with SentUpdate()
569
+ // Convenience method that combines `DesiredAnnounceSize` and `SentUpdate`.
570
+ // Call to get window increment and update state in one go.
457
571
  uint32_t MaybeSendUpdate() {
458
572
  uint32_t n = DesiredAnnounceSize();
459
573
  SentUpdate(n);
@@ -461,8 +575,10 @@ class StreamFlowControl final {
461
575
  }
462
576
 
463
577
  int64_t remote_window_delta() const { return remote_window_delta_; }
464
- int64_t announced_window_delta() const { return announced_window_delta_; }
465
- int64_t min_progress_size() const { return min_progress_size_; }
578
+ int64_t test_only_announced_window_delta() const {
579
+ return announced_window_delta_;
580
+ }
581
+ int64_t test_only_min_progress_size() const { return min_progress_size_; }
466
582
 
467
583
  // A snapshot of the flow control stats to export.
468
584
  struct Stats {
@@ -476,13 +592,32 @@ class StreamFlowControl final {
476
592
 
477
593
  Stats stats() const {
478
594
  Stats stats;
479
- stats.min_progress_size = min_progress_size();
595
+ stats.min_progress_size = min_progress_size_;
480
596
  stats.remote_window_delta = remote_window_delta();
481
- stats.announced_window_delta = announced_window_delta();
597
+ stats.announced_window_delta = announced_window_delta_;
482
598
  stats.pending_size = pending_size_;
483
599
  return stats;
484
600
  }
485
601
 
602
+ void ReportIfStalled(bool is_client, uint32_t stream_id,
603
+ const Http2Settings& peer_settings) const {
604
+ if (remote_window_delta() + peer_settings.initial_window_size() <= 0 ||
605
+ tfc_->remote_window_ == 0) {
606
+ GRPC_HTTP2_FLOW_CONTROL_DLOG
607
+ << "PH2 " << (is_client ? "CLIENT" : "SERVER")
608
+ << " Flow Control Stalled :"
609
+ << " Settings { peer initial window size="
610
+ << peer_settings.initial_window_size()
611
+ << "}, Transport {remote_window=" << tfc_->remote_window()
612
+ << ", transport announced_window=" << tfc_->announced_window()
613
+ << "}, Stream {stream_id=" << stream_id
614
+ << ", remote_window_delta=" << remote_window_delta()
615
+ << ", remote_window_delta() + peer_settings.initial_window_size() ="
616
+ << (remote_window_delta() + peer_settings.initial_window_size())
617
+ << " }";
618
+ }
619
+ }
620
+
486
621
  private:
487
622
  TransportFlowControl* const tfc_;
488
623
  int64_t min_progress_size_ = 0;
@@ -19,13 +19,15 @@
19
19
  #ifndef GRPC_SRC_CORE_EXT_TRANSPORT_CHTTP2_TRANSPORT_FLOW_CONTROL_MANAGER_H
20
20
  #define GRPC_SRC_CORE_EXT_TRANSPORT_CHTTP2_TRANSPORT_FLOW_CONTROL_MANAGER_H
21
21
 
22
+ #include <algorithm>
22
23
  #include <cstdint>
23
24
  #include <vector>
24
25
 
25
- #include "absl/container/flat_hash_map.h"
26
26
  #include "src/core/ext/transport/chttp2/transport/flow_control.h"
27
27
  #include "src/core/ext/transport/chttp2/transport/frame.h"
28
28
  #include "src/core/ext/transport/chttp2/transport/http2_settings.h"
29
+ #include "src/core/util/grpc_check.h"
30
+ #include "absl/container/flat_hash_map.h"
29
31
 
30
32
  namespace grpc_core {
31
33
  namespace http2 {
@@ -34,6 +36,10 @@ constexpr chttp2::FlowControlAction::Urgency kNoActionNeeded =
34
36
  chttp2::FlowControlAction::Urgency::NO_ACTION_NEEDED;
35
37
  constexpr chttp2::FlowControlAction::Urgency kUpdateImmediately =
36
38
  chttp2::FlowControlAction::Urgency::UPDATE_IMMEDIATELY;
39
+ constexpr int64_t kZero = 0;
40
+
41
+ #define GRPC_HTTP2_FLOW_CONTROL_HELPERS \
42
+ DLOG_IF(INFO, GRPC_TRACE_FLAG_ENABLED(http2_ph2_transport))
37
43
 
38
44
  // Function to update local settings based on FlowControlAction.
39
45
  // This function does the settings related tasks equivalent to
@@ -54,6 +60,45 @@ inline void ActOnFlowControlActionSettings(
54
60
  }
55
61
  }
56
62
 
63
+ // RFC9113 : A sender MUST NOT allow a flow-control window to exceed ((2^31)-1)
64
+ // octets. If a sender receives a WINDOW_UPDATE that causes a flow-control
65
+ // window to exceed this maximum, it MUST terminate either the stream or the
66
+ // connection, as appropriate.
67
+ // While the return value is int64_t for compatibility with CHTTP2 flow control,
68
+ // we dont expect this value to exceed ((2^31)-1) i.e kMaxSize31Bit
69
+ inline int64_t GetStreamFlowControlTokens(
70
+ chttp2::StreamFlowControl& stream_flow_control,
71
+ const Http2Settings& peer_settings) {
72
+ GRPC_DCHECK(stream_flow_control.remote_window_delta() +
73
+ peer_settings.initial_window_size() <=
74
+ RFC9113::kMaxSize31Bit);
75
+ return std::max(kZero, stream_flow_control.remote_window_delta() +
76
+ peer_settings.initial_window_size());
77
+ }
78
+
79
+ inline uint32_t GetMaxPermittedDequeue(
80
+ chttp2::TransportFlowControl& transport_flow_control,
81
+ chttp2::StreamFlowControl& stream_flow_control, const size_t upper_limit,
82
+ const Http2Settings& peer_settings) {
83
+ const int64_t flow_control_tokens =
84
+ std::min(transport_flow_control.remote_window(),
85
+ GetStreamFlowControlTokens(stream_flow_control, peer_settings));
86
+ uint32_t max_dequeue = 0;
87
+ if (flow_control_tokens > 0) {
88
+ max_dequeue = static_cast<uint32_t>(
89
+ std::min({static_cast<size_t>(flow_control_tokens), upper_limit,
90
+ static_cast<size_t>(RFC9113::kMaxSize31Bit - 1)}));
91
+ }
92
+ GRPC_HTTP2_FLOW_CONTROL_HELPERS
93
+ << "GetFlowControlTokens flow_control_tokens = " << flow_control_tokens
94
+ << " upper_limit = " << upper_limit << " max_dequeue = " << max_dequeue;
95
+ return max_dequeue;
96
+ }
97
+
98
+ // TODO(tjagtap) [PH2][P4] : Ensure that the total transport flow control window
99
+ // or stream flow control window does not exceed the max permitted limit of
100
+ // 2^31-1
101
+
57
102
  } // namespace http2
58
103
  } // namespace grpc_core
59
104