grpc 1.75.0 → 1.78.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (839) hide show
  1. checksums.yaml +4 -4
  2. data/Makefile +24 -5
  3. data/include/grpc/credentials.h +27 -6
  4. data/include/grpc/event_engine/memory_allocator.h +2 -0
  5. data/include/grpc/event_engine/memory_request.h +2 -0
  6. data/include/grpc/impl/channel_arg_names.h +5 -0
  7. data/include/grpc/support/metrics.h +7 -1
  8. data/src/core/call/call_filters.cc +5 -5
  9. data/src/core/call/call_filters.h +211 -37
  10. data/src/core/call/call_spine.cc +1 -1
  11. data/src/core/call/call_spine.h +54 -32
  12. data/src/core/call/channelz_context.h +30 -0
  13. data/src/core/call/client_call.cc +49 -10
  14. data/src/core/call/client_call.h +6 -3
  15. data/src/core/call/filter_fusion.h +9 -9
  16. data/src/core/call/interception_chain.h +7 -6
  17. data/src/core/call/metadata_batch.cc +49 -55
  18. data/src/core/call/metadata_batch.h +10 -9
  19. data/src/core/call/metadata_info.cc +1 -1
  20. data/src/core/call/parsed_metadata.h +2 -2
  21. data/src/core/call/request_buffer.cc +1 -1
  22. data/src/core/call/security_context.cc +2 -2
  23. data/src/core/call/security_context.h +1 -1
  24. data/src/core/call/server_call.cc +5 -5
  25. data/src/core/call/server_call.h +6 -4
  26. data/src/core/call/simple_slice_based_metadata.h +1 -1
  27. data/src/core/call/status_util.cc +1 -1
  28. data/src/core/channelz/channel_trace.cc +1 -1
  29. data/src/core/channelz/channel_trace.h +3 -3
  30. data/src/core/channelz/channelz.cc +25 -29
  31. data/src/core/channelz/channelz.h +73 -22
  32. data/src/core/channelz/channelz_registry.cc +2 -2
  33. data/src/core/channelz/channelz_registry.h +53 -2
  34. data/src/core/channelz/property_list.cc +18 -0
  35. data/src/core/channelz/property_list.h +15 -4
  36. data/src/core/channelz/text_encode.cc +66 -0
  37. data/src/core/channelz/text_encode.h +29 -0
  38. data/src/core/channelz/v2tov1/convert.cc +17 -6
  39. data/src/core/channelz/v2tov1/legacy_api.cc +18 -12
  40. data/src/core/channelz/v2tov1/property_list.cc +2 -1
  41. data/src/core/channelz/ztrace_collector.h +260 -87
  42. data/src/core/client_channel/backup_poller.cc +7 -8
  43. data/src/core/client_channel/buffered_call.cc +140 -0
  44. data/src/core/client_channel/buffered_call.h +104 -0
  45. data/src/core/client_channel/client_channel.cc +144 -84
  46. data/src/core/client_channel/client_channel.h +8 -11
  47. data/src/core/client_channel/client_channel_factory.h +1 -1
  48. data/src/core/client_channel/client_channel_filter.cc +424 -686
  49. data/src/core/client_channel/client_channel_filter.h +57 -150
  50. data/src/core/client_channel/client_channel_internal.h +8 -5
  51. data/src/core/client_channel/client_channel_service_config.cc +43 -3
  52. data/src/core/client_channel/client_channel_service_config.h +12 -1
  53. data/src/core/client_channel/config_selector.h +5 -5
  54. data/src/core/client_channel/connector.h +2 -0
  55. data/src/core/client_channel/dynamic_filters.cc +5 -5
  56. data/src/core/client_channel/global_subchannel_pool.cc +0 -37
  57. data/src/core/client_channel/global_subchannel_pool.h +1 -28
  58. data/src/core/client_channel/lb_metadata.h +1 -1
  59. data/src/core/client_channel/load_balanced_call_destination.cc +10 -12
  60. data/src/core/client_channel/load_balanced_call_destination.h +1 -1
  61. data/src/core/client_channel/local_subchannel_pool.cc +4 -4
  62. data/src/core/client_channel/retry_filter.cc +2 -2
  63. data/src/core/client_channel/retry_filter.h +3 -3
  64. data/src/core/client_channel/retry_filter_legacy_call_data.cc +11 -12
  65. data/src/core/client_channel/retry_filter_legacy_call_data.h +6 -8
  66. data/src/core/client_channel/retry_service_config.cc +3 -3
  67. data/src/core/client_channel/retry_service_config.h +1 -1
  68. data/src/core/client_channel/subchannel.cc +114 -25
  69. data/src/core/client_channel/subchannel.h +24 -8
  70. data/src/core/client_channel/subchannel_pool_interface.cc +2 -2
  71. data/src/core/client_channel/subchannel_pool_interface.h +1 -1
  72. data/src/core/client_channel/subchannel_stream_client.cc +5 -5
  73. data/src/core/client_channel/subchannel_stream_client.h +3 -3
  74. data/src/core/config/config_vars.cc +38 -3
  75. data/src/core/config/config_vars.h +26 -0
  76. data/src/core/config/core_configuration.cc +5 -5
  77. data/src/core/config/core_configuration.h +8 -8
  78. data/src/core/config/load_config.cc +13 -1
  79. data/src/core/config/load_config.h +2 -0
  80. data/src/core/credentials/call/call_credentials.h +4 -4
  81. data/src/core/credentials/call/call_creds_registry.h +1 -1
  82. data/src/core/credentials/call/call_creds_registry_init.cc +2 -2
  83. data/src/core/credentials/call/call_creds_util.cc +7 -6
  84. data/src/core/credentials/call/composite/composite_call_credentials.cc +6 -6
  85. data/src/core/credentials/call/composite/composite_call_credentials.h +1 -1
  86. data/src/core/credentials/call/external/aws_external_account_credentials.cc +9 -9
  87. data/src/core/credentials/call/external/aws_external_account_credentials.h +1 -1
  88. data/src/core/credentials/call/external/external_account_credentials.cc +12 -12
  89. data/src/core/credentials/call/external/external_account_credentials.h +1 -1
  90. data/src/core/credentials/call/external/file_external_account_credentials.cc +3 -3
  91. data/src/core/credentials/call/external/file_external_account_credentials.h +1 -1
  92. data/src/core/credentials/call/external/url_external_account_credentials.cc +7 -7
  93. data/src/core/credentials/call/external/url_external_account_credentials.h +1 -1
  94. data/src/core/credentials/call/gcp_service_account_identity/gcp_service_account_identity_credentials.cc +24 -71
  95. data/src/core/credentials/call/gcp_service_account_identity/gcp_service_account_identity_credentials.h +1 -8
  96. data/src/core/credentials/call/iam/iam_credentials.cc +6 -6
  97. data/src/core/credentials/call/iam/iam_credentials.h +1 -1
  98. data/src/core/credentials/call/json_util.cc +1 -1
  99. data/src/core/credentials/call/jwt/json_token.cc +7 -7
  100. data/src/core/credentials/call/jwt/jwt_credentials.cc +5 -5
  101. data/src/core/credentials/call/jwt/jwt_credentials.h +4 -4
  102. data/src/core/credentials/call/jwt/jwt_verifier.cc +19 -18
  103. data/src/core/credentials/call/jwt_token_file/jwt_token_file_call_credentials.cc +2 -2
  104. data/src/core/credentials/call/jwt_token_file/jwt_token_file_call_credentials.h +3 -3
  105. data/src/core/credentials/call/jwt_util.cc +3 -3
  106. data/src/core/credentials/call/jwt_util.h +1 -1
  107. data/src/core/credentials/call/oauth2/oauth2_credentials.cc +49 -72
  108. data/src/core/credentials/call/oauth2/oauth2_credentials.h +3 -9
  109. data/src/core/credentials/call/plugin/plugin_credentials.cc +6 -6
  110. data/src/core/credentials/call/plugin/plugin_credentials.h +2 -2
  111. data/src/core/credentials/call/token_fetcher/token_fetcher_credentials.cc +46 -0
  112. data/src/core/credentials/call/token_fetcher/token_fetcher_credentials.h +32 -3
  113. data/src/core/credentials/transport/alts/alts_credentials.cc +5 -5
  114. data/src/core/credentials/transport/alts/alts_security_connector.cc +17 -15
  115. data/src/core/credentials/transport/alts/check_gcp_environment_no_op.cc +1 -1
  116. data/src/core/credentials/transport/alts/grpc_alts_credentials_client_options.cc +23 -3
  117. data/src/core/credentials/transport/alts/grpc_alts_credentials_options.cc +10 -1
  118. data/src/core/credentials/transport/alts/grpc_alts_credentials_options.h +31 -0
  119. data/src/core/credentials/transport/alts/grpc_alts_credentials_server_options.cc +8 -3
  120. data/src/core/credentials/transport/channel_creds_registry.h +1 -1
  121. data/src/core/credentials/transport/channel_creds_registry_init.cc +1 -1
  122. data/src/core/credentials/transport/composite/composite_channel_credentials.cc +7 -7
  123. data/src/core/credentials/transport/composite/composite_channel_credentials.h +1 -1
  124. data/src/core/credentials/transport/fake/fake_credentials.cc +1 -1
  125. data/src/core/credentials/transport/fake/fake_credentials.h +1 -1
  126. data/src/core/credentials/transport/fake/fake_security_connector.cc +7 -7
  127. data/src/core/credentials/transport/google_default/credentials_generic.cc +2 -2
  128. data/src/core/credentials/transport/google_default/google_default_credentials.cc +83 -39
  129. data/src/core/credentials/transport/google_default/google_default_credentials.h +0 -2
  130. data/src/core/credentials/transport/insecure/insecure_security_connector.cc +3 -3
  131. data/src/core/credentials/transport/insecure/insecure_security_connector.h +2 -2
  132. data/src/core/credentials/transport/local/local_security_connector.cc +13 -13
  133. data/src/core/credentials/transport/security_connector.cc +6 -6
  134. data/src/core/credentials/transport/security_connector.h +2 -2
  135. data/src/core/credentials/transport/ssl/ssl_credentials.cc +13 -13
  136. data/src/core/credentials/transport/ssl/ssl_credentials.h +2 -2
  137. data/src/core/credentials/transport/ssl/ssl_security_connector.cc +8 -8
  138. data/src/core/credentials/transport/tls/certificate_provider_factory.h +1 -1
  139. data/src/core/credentials/transport/tls/certificate_provider_registry.cc +2 -2
  140. data/src/core/credentials/transport/tls/certificate_provider_registry.h +1 -1
  141. data/src/core/credentials/transport/tls/grpc_tls_certificate_distributor.cc +25 -25
  142. data/src/core/credentials/transport/tls/grpc_tls_certificate_distributor.h +2 -2
  143. data/src/core/credentials/transport/tls/grpc_tls_certificate_match.cc +1 -1
  144. data/src/core/credentials/transport/tls/grpc_tls_certificate_provider.cc +8 -8
  145. data/src/core/credentials/transport/tls/grpc_tls_certificate_provider.h +5 -5
  146. data/src/core/credentials/transport/tls/grpc_tls_certificate_verifier.cc +3 -3
  147. data/src/core/credentials/transport/tls/grpc_tls_certificate_verifier.h +4 -4
  148. data/src/core/credentials/transport/tls/grpc_tls_credentials_options.cc +18 -18
  149. data/src/core/credentials/transport/tls/grpc_tls_crl_provider.cc +5 -5
  150. data/src/core/credentials/transport/tls/grpc_tls_crl_provider.h +3 -3
  151. data/src/core/credentials/transport/tls/load_system_roots_supported.cc +1 -1
  152. data/src/core/credentials/transport/tls/spiffe_utils.cc +10 -8
  153. data/src/core/credentials/transport/tls/spiffe_utils.h +2 -2
  154. data/src/core/credentials/transport/tls/ssl_utils.cc +18 -13
  155. data/src/core/credentials/transport/tls/ssl_utils.h +2 -2
  156. data/src/core/credentials/transport/tls/tls_credentials.cc +3 -3
  157. data/src/core/credentials/transport/tls/tls_security_connector.cc +15 -15
  158. data/src/core/credentials/transport/tls/tls_security_connector.h +3 -3
  159. data/src/core/credentials/transport/transport_credentials.cc +3 -3
  160. data/src/core/credentials/transport/transport_credentials.h +4 -4
  161. data/src/core/credentials/transport/xds/xds_credentials.cc +5 -5
  162. data/src/core/credentials/transport/xds/xds_credentials.h +1 -1
  163. data/src/core/ext/filters/backend_metrics/backend_metric_filter.cc +2 -2
  164. data/src/core/ext/filters/backend_metrics/backend_metric_filter.h +4 -1
  165. data/src/core/ext/filters/channel_idle/legacy_channel_idle_filter.cc +6 -4
  166. data/src/core/ext/filters/channel_idle/legacy_channel_idle_filter.h +2 -2
  167. data/src/core/ext/filters/fault_injection/fault_injection_filter.cc +7 -7
  168. data/src/core/ext/filters/fault_injection/fault_injection_filter.h +6 -3
  169. data/src/core/ext/filters/fault_injection/fault_injection_service_config_parser.h +1 -1
  170. data/src/core/ext/filters/gcp_authentication/gcp_authentication_filter.cc +2 -2
  171. data/src/core/ext/filters/gcp_authentication/gcp_authentication_filter.h +6 -3
  172. data/src/core/ext/filters/gcp_authentication/gcp_authentication_service_config_parser.h +1 -1
  173. data/src/core/ext/filters/http/client/http_client_filter.cc +6 -6
  174. data/src/core/ext/filters/http/client/http_client_filter.h +4 -1
  175. data/src/core/ext/filters/http/client_authority_filter.cc +2 -2
  176. data/src/core/ext/filters/http/client_authority_filter.h +4 -1
  177. data/src/core/ext/filters/http/http_filters_plugin.cc +1 -1
  178. data/src/core/ext/filters/http/message_compress/compression_filter.cc +11 -11
  179. data/src/core/ext/filters/http/message_compress/compression_filter.h +24 -5
  180. data/src/core/ext/filters/http/server/http_server_filter.cc +3 -3
  181. data/src/core/ext/filters/http/server/http_server_filter.h +4 -1
  182. data/src/core/ext/filters/message_size/message_size_filter.cc +2 -2
  183. data/src/core/ext/filters/message_size/message_size_filter.h +8 -2
  184. data/src/core/ext/filters/rbac/rbac_filter.cc +1 -1
  185. data/src/core/ext/filters/rbac/rbac_filter.h +4 -1
  186. data/src/core/ext/filters/rbac/rbac_service_config_parser.cc +3 -3
  187. data/src/core/ext/filters/rbac/rbac_service_config_parser.h +1 -1
  188. data/src/core/ext/filters/stateful_session/stateful_session_filter.cc +14 -14
  189. data/src/core/ext/filters/stateful_session/stateful_session_filter.h +13 -2
  190. data/src/core/ext/filters/stateful_session/stateful_session_service_config_parser.h +1 -1
  191. data/src/core/ext/transport/chttp2/alpn/alpn.cc +2 -2
  192. data/src/core/ext/transport/chttp2/client/chttp2_connector.cc +58 -44
  193. data/src/core/ext/transport/chttp2/client/chttp2_connector.h +2 -3
  194. data/src/core/ext/transport/chttp2/server/chttp2_server.cc +25 -24
  195. data/src/core/ext/transport/chttp2/server/chttp2_server.h +1 -2
  196. data/src/core/ext/transport/chttp2/transport/bin_decoder.cc +6 -6
  197. data/src/core/ext/transport/chttp2/transport/bin_encoder.cc +6 -6
  198. data/src/core/ext/transport/chttp2/transport/chttp2_transport.cc +306 -148
  199. data/src/core/ext/transport/chttp2/transport/chttp2_transport.h +10 -2
  200. data/src/core/ext/transport/chttp2/transport/flow_control.cc +42 -7
  201. data/src/core/ext/transport/chttp2/transport/flow_control.h +223 -83
  202. data/src/core/ext/transport/chttp2/transport/flow_control_manager.h +105 -0
  203. data/src/core/ext/transport/chttp2/transport/frame.cc +175 -27
  204. data/src/core/ext/transport/chttp2/transport/frame.h +58 -10
  205. data/src/core/ext/transport/chttp2/transport/frame_data.cc +4 -4
  206. data/src/core/ext/transport/chttp2/transport/frame_data.h +1 -1
  207. data/src/core/ext/transport/chttp2/transport/frame_goaway.cc +5 -5
  208. data/src/core/ext/transport/chttp2/transport/frame_ping.cc +6 -6
  209. data/src/core/ext/transport/chttp2/transport/frame_rst_stream.cc +7 -7
  210. data/src/core/ext/transport/chttp2/transport/frame_security.cc +1 -1
  211. data/src/core/ext/transport/chttp2/transport/frame_settings.cc +7 -15
  212. data/src/core/ext/transport/chttp2/transport/frame_window_update.cc +6 -6
  213. data/src/core/ext/transport/chttp2/transport/goaway.cc +129 -0
  214. data/src/core/ext/transport/chttp2/transport/goaway.h +350 -0
  215. data/src/core/ext/transport/chttp2/transport/header_assembler.h +194 -54
  216. data/src/core/ext/transport/chttp2/transport/hpack_encoder.cc +3 -3
  217. data/src/core/ext/transport/chttp2/transport/hpack_encoder.h +8 -6
  218. data/src/core/ext/transport/chttp2/transport/hpack_encoder_table.cc +8 -8
  219. data/src/core/ext/transport/chttp2/transport/hpack_parse_result.cc +3 -3
  220. data/src/core/ext/transport/chttp2/transport/hpack_parse_result.h +5 -5
  221. data/src/core/ext/transport/chttp2/transport/hpack_parser.cc +34 -34
  222. data/src/core/ext/transport/chttp2/transport/hpack_parser.h +6 -7
  223. data/src/core/ext/transport/chttp2/transport/hpack_parser_table.cc +8 -8
  224. data/src/core/ext/transport/chttp2/transport/hpack_parser_table.h +1 -1
  225. data/src/core/ext/transport/chttp2/transport/http2_client_transport.cc +1475 -632
  226. data/src/core/ext/transport/chttp2/transport/http2_client_transport.h +384 -373
  227. data/src/core/ext/transport/chttp2/transport/http2_settings.cc +1 -1
  228. data/src/core/ext/transport/chttp2/transport/http2_settings.h +6 -4
  229. data/src/core/ext/transport/chttp2/transport/http2_settings_manager.cc +4 -3
  230. data/src/core/ext/transport/chttp2/transport/http2_settings_manager.h +6 -5
  231. data/src/core/ext/transport/chttp2/transport/http2_settings_promises.h +417 -0
  232. data/src/core/ext/transport/chttp2/transport/http2_status.h +7 -1
  233. data/src/core/ext/transport/chttp2/transport/http2_transport.cc +337 -30
  234. data/src/core/ext/transport/chttp2/transport/http2_transport.h +196 -21
  235. data/src/core/ext/transport/chttp2/transport/http2_ztrace_collector.h +172 -72
  236. data/src/core/ext/transport/chttp2/transport/incoming_metadata_tracker.h +128 -0
  237. data/src/core/ext/transport/chttp2/transport/internal.h +31 -19
  238. data/src/core/ext/transport/chttp2/transport/keepalive.cc +12 -5
  239. data/src/core/ext/transport/chttp2/transport/keepalive.h +14 -10
  240. data/src/core/ext/transport/chttp2/transport/message_assembler.h +30 -21
  241. data/src/core/ext/transport/chttp2/transport/parsing.cc +25 -23
  242. data/src/core/ext/transport/chttp2/transport/ping_callbacks.cc +2 -2
  243. data/src/core/ext/transport/chttp2/transport/ping_callbacks.h +3 -3
  244. data/src/core/ext/transport/chttp2/transport/ping_promise.cc +70 -28
  245. data/src/core/ext/transport/chttp2/transport/ping_promise.h +63 -23
  246. data/src/core/ext/transport/chttp2/transport/ping_rate_policy.cc +1 -1
  247. data/src/core/ext/transport/chttp2/transport/security_frame.cc +31 -0
  248. data/src/core/ext/transport/chttp2/transport/security_frame.h +32 -0
  249. data/src/core/ext/transport/chttp2/transport/stream.h +287 -0
  250. data/src/core/ext/transport/chttp2/transport/stream_data_queue.h +476 -208
  251. data/src/core/ext/transport/chttp2/transport/stream_lists.cc +8 -8
  252. data/src/core/ext/transport/chttp2/transport/transport_common.cc +17 -1
  253. data/src/core/ext/transport/chttp2/transport/transport_common.h +57 -0
  254. data/src/core/ext/transport/chttp2/transport/varint.h +2 -2
  255. data/src/core/ext/transport/chttp2/transport/writable_streams.h +202 -84
  256. data/src/core/ext/transport/chttp2/transport/write_size_policy.cc +2 -2
  257. data/src/core/ext/transport/chttp2/transport/writing.cc +6 -6
  258. data/src/core/ext/transport/inproc/inproc_transport.cc +9 -3
  259. data/src/core/ext/transport/inproc/legacy_inproc_transport.cc +11 -8
  260. data/src/core/ext/upb-gen/src/proto/grpc/channelz/v2/service.upb.h +740 -0
  261. data/src/core/ext/upb-gen/src/proto/grpc/channelz/v2/service.upb_minitable.c +218 -0
  262. data/src/core/ext/upb-gen/src/proto/grpc/channelz/v2/service.upb_minitable.h +46 -0
  263. data/src/core/ext/upb-gen/src/proto/grpc/gcp/handshaker.upb.h +87 -55
  264. data/src/core/ext/upb-gen/src/proto/grpc/gcp/handshaker.upb_minitable.c +23 -21
  265. data/src/core/ext/upbdefs-gen/src/proto/grpc/channelz/v2/channelz.upbdefs.c +80 -0
  266. data/src/core/ext/upbdefs-gen/src/proto/grpc/channelz/v2/channelz.upbdefs.h +47 -0
  267. data/src/core/ext/upbdefs-gen/src/proto/grpc/channelz/v2/service.upbdefs.c +129 -0
  268. data/src/core/ext/upbdefs-gen/src/proto/grpc/channelz/v2/service.upbdefs.h +72 -0
  269. data/src/core/filter/auth/auth_filters.h +7 -1
  270. data/src/core/filter/auth/client_auth_filter.cc +2 -2
  271. data/src/core/filter/auth/server_auth_filter.cc +5 -5
  272. data/src/core/filter/blackboard.h +2 -2
  273. data/src/core/filter/filter_args.h +40 -2
  274. data/src/core/handshaker/endpoint_info/endpoint_info_handshaker.cc +2 -2
  275. data/src/core/handshaker/handshaker.cc +8 -8
  276. data/src/core/handshaker/handshaker.h +2 -2
  277. data/src/core/handshaker/http_connect/http_connect_handshaker.cc +5 -5
  278. data/src/core/handshaker/http_connect/http_proxy_mapper.cc +12 -12
  279. data/src/core/handshaker/http_connect/http_proxy_mapper.h +1 -1
  280. data/src/core/handshaker/http_connect/xds_http_proxy_mapper.cc +1 -1
  281. data/src/core/handshaker/http_connect/xds_http_proxy_mapper.h +1 -1
  282. data/src/core/handshaker/proxy_mapper.h +1 -1
  283. data/src/core/handshaker/proxy_mapper_registry.h +1 -1
  284. data/src/core/handshaker/security/legacy_secure_endpoint.cc +6 -6
  285. data/src/core/handshaker/security/pipelined_secure_endpoint.cc +38 -15
  286. data/src/core/handshaker/security/secure_endpoint.cc +31 -11
  287. data/src/core/handshaker/security/security_handshaker.cc +11 -8
  288. data/src/core/handshaker/security/security_handshaker.h +1 -1
  289. data/src/core/handshaker/tcp_connect/tcp_connect_handshaker.cc +6 -6
  290. data/src/core/lib/address_utils/parse_address.cc +5 -5
  291. data/src/core/lib/address_utils/parse_address.h +2 -2
  292. data/src/core/lib/address_utils/sockaddr_utils.cc +4 -4
  293. data/src/core/lib/address_utils/sockaddr_utils.h +1 -1
  294. data/src/core/lib/channel/channel_args.cc +1 -1
  295. data/src/core/lib/channel/channel_args.h +2 -2
  296. data/src/core/lib/channel/channel_stack.cc +29 -25
  297. data/src/core/lib/channel/channel_stack.h +8 -3
  298. data/src/core/lib/channel/channel_stack_builder.cc +8 -4
  299. data/src/core/lib/channel/channel_stack_builder.h +10 -9
  300. data/src/core/lib/channel/channel_stack_builder_impl.cc +8 -13
  301. data/src/core/lib/channel/channel_stack_builder_impl.h +1 -1
  302. data/src/core/lib/channel/connected_channel.cc +4 -4
  303. data/src/core/lib/channel/promise_based_filter.cc +132 -72
  304. data/src/core/lib/channel/promise_based_filter.h +39 -23
  305. data/src/core/lib/compression/compression_internal.cc +6 -6
  306. data/src/core/lib/compression/compression_internal.h +1 -1
  307. data/src/core/lib/compression/message_compress.cc +8 -8
  308. data/src/core/lib/debug/trace.cc +2 -5
  309. data/src/core/lib/debug/trace.h +10 -0
  310. data/src/core/lib/debug/trace_flags.cc +2 -2
  311. data/src/core/lib/debug/trace_flags.h +1 -1
  312. data/src/core/lib/event_engine/ares_resolver.cc +30 -28
  313. data/src/core/lib/event_engine/ares_resolver.h +4 -4
  314. data/src/core/lib/event_engine/cf_engine/cf_engine.cc +3 -3
  315. data/src/core/lib/event_engine/cf_engine/cfstream_endpoint.cc +2 -2
  316. data/src/core/lib/event_engine/cf_engine/cfstream_endpoint.h +1 -1
  317. data/src/core/lib/event_engine/cf_engine/dns_service_resolver.cc +4 -4
  318. data/src/core/lib/event_engine/cf_engine/dns_service_resolver.h +3 -3
  319. data/src/core/lib/event_engine/channel_args_endpoint_config.h +1 -1
  320. data/src/core/lib/event_engine/default_event_engine.cc +1 -1
  321. data/src/core/lib/event_engine/event_engine.cc +1 -1
  322. data/src/core/lib/event_engine/extensions/channelz.h +3 -3
  323. data/src/core/lib/event_engine/extensions/chaotic_good_extension.h +1 -1
  324. data/src/core/lib/event_engine/extensions/supports_fd.h +5 -5
  325. data/src/core/lib/event_engine/extensions/tcp_trace.h +8 -1
  326. data/src/core/lib/event_engine/grpc_polled_fd.h +1 -1
  327. data/src/core/lib/event_engine/memory_allocator_factory.h +1 -1
  328. data/src/core/lib/event_engine/posix_engine/ev_epoll1_linux.cc +12 -12
  329. data/src/core/lib/event_engine/posix_engine/ev_epoll1_linux.h +5 -5
  330. data/src/core/lib/event_engine/posix_engine/ev_poll_posix.cc +15 -15
  331. data/src/core/lib/event_engine/posix_engine/ev_poll_posix.h +3 -3
  332. data/src/core/lib/event_engine/posix_engine/event_poller.h +2 -2
  333. data/src/core/lib/event_engine/posix_engine/event_poller_posix_default.cc +2 -2
  334. data/src/core/lib/event_engine/posix_engine/file_descriptor_collection.cc +1 -1
  335. data/src/core/lib/event_engine/posix_engine/file_descriptor_collection.h +1 -1
  336. data/src/core/lib/event_engine/posix_engine/grpc_polled_fd_posix.h +4 -4
  337. data/src/core/lib/event_engine/posix_engine/internal_errqueue.cc +1 -1
  338. data/src/core/lib/event_engine/posix_engine/lockfree_event.cc +3 -3
  339. data/src/core/lib/event_engine/posix_engine/lockfree_event.h +1 -1
  340. data/src/core/lib/event_engine/posix_engine/native_posix_dns_resolver.cc +3 -3
  341. data/src/core/lib/event_engine/posix_engine/native_posix_dns_resolver.h +1 -1
  342. data/src/core/lib/event_engine/posix_engine/posix_endpoint.cc +28 -27
  343. data/src/core/lib/event_engine/posix_engine/posix_endpoint.h +17 -17
  344. data/src/core/lib/event_engine/posix_engine/posix_engine.cc +175 -177
  345. data/src/core/lib/event_engine/posix_engine/posix_engine.h +40 -61
  346. data/src/core/lib/event_engine/posix_engine/posix_engine_listener.cc +11 -7
  347. data/src/core/lib/event_engine/posix_engine/posix_engine_listener.h +4 -4
  348. data/src/core/lib/event_engine/posix_engine/posix_engine_listener_utils.cc +9 -9
  349. data/src/core/lib/event_engine/posix_engine/posix_engine_listener_utils.h +1 -1
  350. data/src/core/lib/event_engine/posix_engine/posix_interface.h +2 -2
  351. data/src/core/lib/event_engine/posix_engine/posix_interface_posix.cc +5 -5
  352. data/src/core/lib/event_engine/posix_engine/posix_write_event_sink.h +1 -1
  353. data/src/core/lib/event_engine/posix_engine/tcp_socket_utils.cc +1 -1
  354. data/src/core/lib/event_engine/posix_engine/tcp_socket_utils.h +1 -1
  355. data/src/core/lib/event_engine/posix_engine/timer.h +1 -1
  356. data/src/core/lib/event_engine/posix_engine/timer_manager.cc +4 -4
  357. data/src/core/lib/event_engine/posix_engine/timer_manager.h +1 -1
  358. data/src/core/lib/event_engine/posix_engine/traced_buffer_list.cc +2 -2
  359. data/src/core/lib/event_engine/posix_engine/traced_buffer_list.h +2 -2
  360. data/src/core/lib/event_engine/posix_engine/wakeup_fd_eventfd.cc +1 -1
  361. data/src/core/lib/event_engine/posix_engine/wakeup_fd_eventfd.h +2 -2
  362. data/src/core/lib/event_engine/posix_engine/wakeup_fd_pipe.cc +1 -1
  363. data/src/core/lib/event_engine/posix_engine/wakeup_fd_pipe.h +2 -2
  364. data/src/core/lib/event_engine/posix_engine/wakeup_fd_posix.h +1 -1
  365. data/src/core/lib/event_engine/posix_engine/wakeup_fd_posix_default.cc +2 -2
  366. data/src/core/lib/event_engine/posix_engine/wakeup_fd_posix_default.h +1 -1
  367. data/src/core/lib/event_engine/ref_counted_dns_resolver_interface.h +1 -1
  368. data/src/core/lib/event_engine/resolved_address.cc +3 -3
  369. data/src/core/lib/event_engine/shim.cc +8 -11
  370. data/src/core/lib/event_engine/shim.h +2 -1
  371. data/src/core/lib/event_engine/slice.cc +2 -2
  372. data/src/core/lib/event_engine/tcp_socket_utils.cc +15 -15
  373. data/src/core/lib/event_engine/thread_pool/thread_count.cc +1 -1
  374. data/src/core/lib/event_engine/thread_pool/thread_count.h +1 -1
  375. data/src/core/lib/event_engine/thread_pool/work_stealing_thread_pool.cc +11 -11
  376. data/src/core/lib/event_engine/thread_pool/work_stealing_thread_pool.h +3 -3
  377. data/src/core/lib/event_engine/utils.cc +3 -3
  378. data/src/core/lib/event_engine/utils.h +1 -1
  379. data/src/core/lib/event_engine/windows/grpc_polled_fd_windows.cc +32 -32
  380. data/src/core/lib/event_engine/windows/grpc_polled_fd_windows.h +2 -2
  381. data/src/core/lib/event_engine/windows/iocp.cc +11 -11
  382. data/src/core/lib/event_engine/windows/iocp.h +1 -1
  383. data/src/core/lib/event_engine/windows/native_windows_dns_resolver.cc +5 -2
  384. data/src/core/lib/event_engine/windows/win_socket.cc +7 -7
  385. data/src/core/lib/event_engine/windows/win_socket.h +2 -2
  386. data/src/core/lib/event_engine/windows/windows_endpoint.cc +16 -16
  387. data/src/core/lib/event_engine/windows/windows_engine.cc +20 -18
  388. data/src/core/lib/event_engine/windows/windows_engine.h +3 -3
  389. data/src/core/lib/event_engine/windows/windows_listener.cc +10 -10
  390. data/src/core/lib/event_engine/windows/windows_listener.h +2 -2
  391. data/src/core/lib/event_engine/work_queue/basic_work_queue.h +2 -2
  392. data/src/core/lib/experiments/config.cc +4 -4
  393. data/src/core/lib/experiments/experiments.cc +255 -42
  394. data/src/core/lib/experiments/experiments.h +105 -21
  395. data/src/core/lib/iomgr/buffer_list.cc +1 -1
  396. data/src/core/lib/iomgr/call_combiner.cc +4 -4
  397. data/src/core/lib/iomgr/call_combiner.h +2 -2
  398. data/src/core/lib/iomgr/cfstream_handle.cc +1 -1
  399. data/src/core/lib/iomgr/closure.h +2 -2
  400. data/src/core/lib/iomgr/combiner.cc +2 -2
  401. data/src/core/lib/iomgr/endpoint.h +1 -1
  402. data/src/core/lib/iomgr/endpoint_cfstream.cc +7 -7
  403. data/src/core/lib/iomgr/endpoint_pair_posix.cc +6 -6
  404. data/src/core/lib/iomgr/endpoint_pair_windows.cc +16 -15
  405. data/src/core/lib/iomgr/error.cc +1 -1
  406. data/src/core/lib/iomgr/error.h +2 -2
  407. data/src/core/lib/iomgr/error_cfstream.cc +1 -1
  408. data/src/core/lib/iomgr/ev_apple.cc +1 -1
  409. data/src/core/lib/iomgr/ev_epoll1_linux.cc +19 -19
  410. data/src/core/lib/iomgr/ev_poll_posix.cc +14 -14
  411. data/src/core/lib/iomgr/ev_posix.cc +3 -3
  412. data/src/core/lib/iomgr/event_engine_shims/closure.cc +3 -3
  413. data/src/core/lib/iomgr/event_engine_shims/closure.h +1 -1
  414. data/src/core/lib/iomgr/event_engine_shims/endpoint.cc +10 -9
  415. data/src/core/lib/iomgr/event_engine_shims/endpoint.h +1 -1
  416. data/src/core/lib/iomgr/event_engine_shims/tcp_client.cc +2 -2
  417. data/src/core/lib/iomgr/exec_ctx.cc +3 -3
  418. data/src/core/lib/iomgr/exec_ctx.h +1 -1
  419. data/src/core/lib/iomgr/fork_posix.cc +1 -1
  420. data/src/core/lib/iomgr/internal_errqueue.cc +1 -1
  421. data/src/core/lib/iomgr/iocp_windows.cc +9 -9
  422. data/src/core/lib/iomgr/iomgr.cc +1 -1
  423. data/src/core/lib/iomgr/iomgr_windows.cc +3 -3
  424. data/src/core/lib/iomgr/lockfree_event.cc +3 -3
  425. data/src/core/lib/iomgr/polling_entity.cc +4 -4
  426. data/src/core/lib/iomgr/resolve_address.cc +1 -1
  427. data/src/core/lib/iomgr/resolve_address.h +2 -2
  428. data/src/core/lib/iomgr/resolve_address_posix.cc +4 -4
  429. data/src/core/lib/iomgr/resolve_address_windows.cc +1 -1
  430. data/src/core/lib/iomgr/sockaddr_utils_posix.cc +1 -1
  431. data/src/core/lib/iomgr/socket_utils_common_posix.cc +4 -4
  432. data/src/core/lib/iomgr/socket_windows.cc +6 -6
  433. data/src/core/lib/iomgr/tcp_client_cfstream.cc +1 -1
  434. data/src/core/lib/iomgr/tcp_client_posix.cc +7 -7
  435. data/src/core/lib/iomgr/tcp_client_windows.cc +4 -4
  436. data/src/core/lib/iomgr/tcp_posix.cc +47 -47
  437. data/src/core/lib/iomgr/tcp_server.cc +5 -0
  438. data/src/core/lib/iomgr/tcp_server.h +7 -0
  439. data/src/core/lib/iomgr/tcp_server_posix.cc +62 -31
  440. data/src/core/lib/iomgr/tcp_server_utils_posix.h +4 -1
  441. data/src/core/lib/iomgr/tcp_server_utils_posix_common.cc +7 -7
  442. data/src/core/lib/iomgr/tcp_server_utils_posix_ifaddrs.cc +4 -4
  443. data/src/core/lib/iomgr/tcp_server_windows.cc +70 -31
  444. data/src/core/lib/iomgr/tcp_windows.cc +8 -8
  445. data/src/core/lib/iomgr/timer_generic.cc +5 -5
  446. data/src/core/lib/iomgr/timer_manager.cc +3 -3
  447. data/src/core/lib/iomgr/unix_sockets_posix.cc +3 -3
  448. data/src/core/lib/iomgr/unix_sockets_posix.h +1 -1
  449. data/src/core/lib/iomgr/unix_sockets_posix_noop.cc +2 -2
  450. data/src/core/lib/iomgr/vsock.cc +1 -1
  451. data/src/core/lib/iomgr/vsock.h +1 -1
  452. data/src/core/lib/iomgr/wakeup_fd_pipe.cc +1 -1
  453. data/src/core/lib/promise/activity.cc +3 -3
  454. data/src/core/lib/promise/activity.h +11 -10
  455. data/src/core/lib/promise/all_ok.h +3 -3
  456. data/src/core/lib/promise/arena_promise.h +47 -6
  457. data/src/core/lib/promise/context.h +3 -3
  458. data/src/core/lib/promise/detail/join_state.h +10 -10
  459. data/src/core/lib/promise/detail/promise_factory.h +1 -1
  460. data/src/core/lib/promise/detail/promise_like.h +1 -1
  461. data/src/core/lib/promise/detail/seq_state.h +16 -16
  462. data/src/core/lib/promise/detail/status.h +2 -2
  463. data/src/core/lib/promise/exec_ctx_wakeup_scheduler.h +1 -1
  464. data/src/core/lib/promise/for_each.h +8 -8
  465. data/src/core/lib/promise/if.h +1 -1
  466. data/src/core/lib/promise/inter_activity_latch.h +3 -3
  467. data/src/core/lib/promise/inter_activity_mutex.h +1 -1
  468. data/src/core/lib/promise/interceptor_list.h +5 -5
  469. data/src/core/lib/promise/latch.h +9 -9
  470. data/src/core/lib/promise/loop.h +2 -2
  471. data/src/core/lib/promise/map.h +2 -2
  472. data/src/core/lib/promise/mpsc.cc +31 -30
  473. data/src/core/lib/promise/mpsc.h +2 -2
  474. data/src/core/lib/promise/observable.h +6 -6
  475. data/src/core/lib/promise/party.cc +43 -30
  476. data/src/core/lib/promise/party.h +27 -23
  477. data/src/core/lib/promise/pipe.h +31 -17
  478. data/src/core/lib/promise/poll.h +6 -5
  479. data/src/core/lib/promise/promise.h +2 -4
  480. data/src/core/lib/promise/sleep.cc +3 -1
  481. data/src/core/lib/promise/sleep.h +1 -1
  482. data/src/core/lib/promise/status_flag.h +8 -8
  483. data/src/core/lib/promise/try_join.h +5 -5
  484. data/src/core/lib/promise/try_seq.h +5 -5
  485. data/src/core/lib/promise/wait_set.h +2 -2
  486. data/src/core/lib/resource_quota/api.cc +1 -1
  487. data/src/core/lib/resource_quota/arena.cc +1 -1
  488. data/src/core/lib/resource_quota/arena.h +15 -2
  489. data/src/core/lib/resource_quota/connection_quota.cc +9 -7
  490. data/src/core/lib/resource_quota/connection_quota.h +1 -1
  491. data/src/core/lib/resource_quota/memory_quota.cc +48 -27
  492. data/src/core/lib/resource_quota/memory_quota.h +56 -20
  493. data/src/core/lib/resource_quota/periodic_update.h +1 -1
  494. data/src/core/lib/resource_quota/resource_quota.cc +8 -0
  495. data/src/core/lib/resource_quota/resource_quota.h +2 -1
  496. data/src/core/lib/resource_quota/stream_quota.cc +22 -0
  497. data/src/core/lib/resource_quota/stream_quota.h +31 -0
  498. data/src/core/lib/resource_quota/telemetry.h +55 -0
  499. data/src/core/lib/resource_quota/thread_quota.cc +2 -2
  500. data/src/core/lib/resource_quota/thread_quota.h +1 -1
  501. data/src/core/lib/resource_tracker/resource_tracker.cc +33 -0
  502. data/src/core/lib/resource_tracker/resource_tracker.h +46 -0
  503. data/src/core/lib/security/authorization/audit_logging.cc +7 -7
  504. data/src/core/lib/security/authorization/audit_logging.h +1 -1
  505. data/src/core/lib/security/authorization/authorization_policy_provider.h +1 -1
  506. data/src/core/lib/security/authorization/evaluate_args.cc +5 -5
  507. data/src/core/lib/security/authorization/evaluate_args.h +1 -1
  508. data/src/core/lib/security/authorization/grpc_authorization_engine.cc +2 -2
  509. data/src/core/lib/security/authorization/grpc_server_authz_filter.cc +3 -3
  510. data/src/core/lib/security/authorization/grpc_server_authz_filter.h +4 -1
  511. data/src/core/lib/security/authorization/matchers.cc +2 -2
  512. data/src/core/lib/security/authorization/stdout_logger.cc +3 -3
  513. data/src/core/lib/slice/percent_encoding.cc +1 -1
  514. data/src/core/lib/slice/slice.cc +1 -1
  515. data/src/core/lib/slice/slice.h +2 -2
  516. data/src/core/lib/slice/slice_buffer.cc +1 -1
  517. data/src/core/lib/slice/slice_internal.h +1 -1
  518. data/src/core/lib/surface/byte_buffer_reader.cc +2 -2
  519. data/src/core/lib/surface/call.cc +58 -28
  520. data/src/core/lib/surface/call.h +13 -6
  521. data/src/core/lib/surface/call_log_batch.cc +2 -2
  522. data/src/core/lib/surface/call_utils.cc +7 -7
  523. data/src/core/lib/surface/call_utils.h +85 -20
  524. data/src/core/lib/surface/channel.cc +6 -5
  525. data/src/core/lib/surface/channel.h +13 -3
  526. data/src/core/lib/surface/channel_create.cc +12 -8
  527. data/src/core/lib/surface/channel_create.h +1 -1
  528. data/src/core/lib/surface/channel_init.cc +84 -27
  529. data/src/core/lib/surface/channel_init.h +30 -13
  530. data/src/core/lib/surface/completion_queue.cc +21 -20
  531. data/src/core/lib/surface/completion_queue_factory.cc +7 -7
  532. data/src/core/lib/surface/connection_context.h +45 -2
  533. data/src/core/lib/surface/filter_stack_call.cc +25 -31
  534. data/src/core/lib/surface/filter_stack_call.h +6 -7
  535. data/src/core/lib/surface/init.cc +4 -4
  536. data/src/core/lib/surface/lame_client.cc +2 -2
  537. data/src/core/lib/surface/lame_client.h +3 -3
  538. data/src/core/lib/surface/legacy_channel.cc +10 -10
  539. data/src/core/lib/surface/legacy_channel.h +1 -1
  540. data/src/core/lib/surface/validate_metadata.cc +2 -2
  541. data/src/core/lib/surface/validate_metadata.h +3 -3
  542. data/src/core/lib/surface/version.cc +2 -2
  543. data/src/core/lib/transport/bdp_estimator.cc +2 -2
  544. data/src/core/lib/transport/bdp_estimator.h +5 -5
  545. data/src/core/lib/transport/connectivity_state.cc +1 -1
  546. data/src/core/lib/transport/connectivity_state.h +2 -2
  547. data/src/core/lib/transport/error_utils.h +1 -1
  548. data/src/core/lib/transport/promise_endpoint.cc +4 -4
  549. data/src/core/lib/transport/promise_endpoint.h +11 -11
  550. data/src/core/lib/transport/timeout_encoding.cc +4 -4
  551. data/src/core/lib/transport/transport.cc +3 -3
  552. data/src/core/lib/transport/transport.h +62 -4
  553. data/src/core/lib/transport/transport_framing_endpoint_extension.h +1 -1
  554. data/src/core/lib/transport/transport_op_string.cc +2 -2
  555. data/src/core/load_balancing/address_filtering.cc +1 -1
  556. data/src/core/load_balancing/address_filtering.h +2 -2
  557. data/src/core/load_balancing/backend_metric_parser.cc +1 -1
  558. data/src/core/load_balancing/backend_metric_parser.h +1 -1
  559. data/src/core/load_balancing/child_policy_handler.cc +8 -8
  560. data/src/core/load_balancing/child_policy_handler.h +2 -2
  561. data/src/core/load_balancing/delegating_helper.h +2 -2
  562. data/src/core/load_balancing/endpoint_list.cc +6 -6
  563. data/src/core/load_balancing/endpoint_list.h +2 -2
  564. data/src/core/load_balancing/grpclb/client_load_reporting_filter.cc +7 -5
  565. data/src/core/load_balancing/grpclb/client_load_reporting_filter.h +5 -1
  566. data/src/core/load_balancing/grpclb/grpclb.cc +37 -48
  567. data/src/core/load_balancing/grpclb/grpclb_client_stats.h +2 -2
  568. data/src/core/load_balancing/grpclb/load_balancer_api.cc +1 -1
  569. data/src/core/load_balancing/grpclb/load_balancer_api.h +1 -1
  570. data/src/core/load_balancing/health_check_client.cc +13 -9
  571. data/src/core/load_balancing/health_check_client_internal.h +5 -5
  572. data/src/core/load_balancing/lb_policy.h +11 -8
  573. data/src/core/load_balancing/lb_policy_factory.h +2 -2
  574. data/src/core/load_balancing/lb_policy_registry.cc +3 -3
  575. data/src/core/load_balancing/lb_policy_registry.h +2 -2
  576. data/src/core/load_balancing/oob_backend_metric.cc +11 -7
  577. data/src/core/load_balancing/oob_backend_metric_internal.h +4 -4
  578. data/src/core/load_balancing/outlier_detection/outlier_detection.cc +9 -17
  579. data/src/core/load_balancing/pick_first/pick_first.cc +62 -32
  580. data/src/core/load_balancing/priority/priority.cc +29 -30
  581. data/src/core/load_balancing/ring_hash/ring_hash.cc +11 -11
  582. data/src/core/load_balancing/rls/rls.cc +23 -23
  583. data/src/core/load_balancing/round_robin/round_robin.cc +16 -16
  584. data/src/core/load_balancing/subchannel_interface.h +2 -2
  585. data/src/core/load_balancing/weighted_round_robin/static_stride_scheduler.cc +3 -3
  586. data/src/core/load_balancing/weighted_round_robin/weighted_round_robin.cc +42 -41
  587. data/src/core/load_balancing/weighted_target/weighted_target.cc +14 -14
  588. data/src/core/load_balancing/xds/cds.cc +81 -37
  589. data/src/core/load_balancing/xds/xds_cluster_impl.cc +24 -41
  590. data/src/core/load_balancing/xds/xds_cluster_manager.cc +6 -6
  591. data/src/core/load_balancing/xds/xds_override_host.cc +14 -14
  592. data/src/core/load_balancing/xds/xds_override_host.h +1 -1
  593. data/src/core/load_balancing/xds/xds_wrr_locality.cc +5 -5
  594. data/src/core/resolver/dns/c_ares/dns_resolver_ares.cc +8 -8
  595. data/src/core/resolver/dns/c_ares/dns_resolver_ares.h +1 -1
  596. data/src/core/resolver/dns/c_ares/grpc_ares_ev_driver.h +1 -1
  597. data/src/core/resolver/dns/c_ares/grpc_ares_ev_driver_posix.cc +4 -4
  598. data/src/core/resolver/dns/c_ares/grpc_ares_ev_driver_windows.cc +35 -35
  599. data/src/core/resolver/dns/c_ares/grpc_ares_wrapper.cc +16 -16
  600. data/src/core/resolver/dns/c_ares/grpc_ares_wrapper.h +2 -2
  601. data/src/core/resolver/dns/dns_resolver_plugin.cc +8 -5
  602. data/src/core/resolver/dns/event_engine/event_engine_client_channel_resolver.cc +10 -10
  603. data/src/core/resolver/dns/event_engine/event_engine_client_channel_resolver.h +1 -1
  604. data/src/core/resolver/dns/event_engine/service_config_helper.cc +2 -2
  605. data/src/core/resolver/dns/native/dns_resolver.cc +7 -7
  606. data/src/core/resolver/endpoint_addresses.cc +6 -6
  607. data/src/core/resolver/endpoint_addresses.h +4 -1
  608. data/src/core/resolver/fake/fake_resolver.cc +3 -3
  609. data/src/core/resolver/fake/fake_resolver.h +3 -3
  610. data/src/core/resolver/google_c2p/google_c2p_resolver.cc +46 -59
  611. data/src/core/resolver/polling_resolver.cc +8 -8
  612. data/src/core/resolver/polling_resolver.h +1 -1
  613. data/src/core/resolver/resolver.h +2 -2
  614. data/src/core/resolver/resolver_factory.h +2 -2
  615. data/src/core/resolver/resolver_registry.cc +5 -4
  616. data/src/core/resolver/resolver_registry.h +1 -1
  617. data/src/core/resolver/sockaddr/sockaddr_resolver.cc +4 -4
  618. data/src/core/resolver/xds/xds_config.cc +1 -1
  619. data/src/core/resolver/xds/xds_config.h +3 -3
  620. data/src/core/resolver/xds/xds_dependency_manager.cc +7 -7
  621. data/src/core/resolver/xds/xds_dependency_manager.h +3 -3
  622. data/src/core/resolver/xds/xds_resolver.cc +25 -22
  623. data/src/core/resolver/xds/xds_resolver_attributes.h +1 -1
  624. data/src/core/server/add_port.cc +2 -2
  625. data/src/core/server/server.cc +47 -43
  626. data/src/core/server/server.h +8 -7
  627. data/src/core/server/server_call_tracer_filter.cc +1 -1
  628. data/src/core/server/server_call_tracer_filter.h +9 -5
  629. data/src/core/server/server_config_selector.h +2 -2
  630. data/src/core/server/server_config_selector_filter.cc +5 -5
  631. data/src/core/server/xds_channel_stack_modifier.cc +3 -2
  632. data/src/core/server/xds_channel_stack_modifier.h +1 -1
  633. data/src/core/server/xds_server_config_fetcher.cc +19 -18
  634. data/src/core/service_config/service_config.h +1 -1
  635. data/src/core/service_config/service_config_channel_arg_filter.h +4 -1
  636. data/src/core/service_config/service_config_impl.cc +3 -3
  637. data/src/core/service_config/service_config_impl.h +4 -4
  638. data/src/core/service_config/service_config_parser.h +1 -1
  639. data/src/core/telemetry/call_tracer.cc +39 -49
  640. data/src/core/telemetry/call_tracer.h +201 -24
  641. data/src/core/telemetry/default_tcp_tracer.h +3 -3
  642. data/src/core/telemetry/histogram.h +205 -0
  643. data/src/core/telemetry/instrument.cc +999 -0
  644. data/src/core/telemetry/instrument.h +1105 -0
  645. data/src/core/telemetry/metrics.cc +15 -5
  646. data/src/core/telemetry/metrics.h +36 -5
  647. data/src/core/telemetry/stats.h +2 -2
  648. data/src/core/telemetry/stats_data.cc +1 -20
  649. data/src/core/telemetry/stats_data.h +2 -21
  650. data/src/core/transport/auth_context.cc +3 -3
  651. data/src/core/transport/auth_context.h +2 -1
  652. data/src/core/transport/auth_context_comparator_registry.h +1 -1
  653. data/src/core/tsi/alts/crypt/aes_gcm.cc +1 -1
  654. data/src/core/tsi/alts/frame_protector/alts_frame_protector.cc +2 -2
  655. data/src/core/tsi/alts/frame_protector/frame_handler.cc +1 -1
  656. data/src/core/tsi/alts/handshaker/alts_handshaker_client.cc +81 -48
  657. data/src/core/tsi/alts/handshaker/alts_handshaker_client.h +1 -0
  658. data/src/core/tsi/alts/handshaker/alts_shared_resource.cc +3 -3
  659. data/src/core/tsi/alts/handshaker/alts_tsi_handshaker.cc +46 -36
  660. data/src/core/tsi/alts/handshaker/alts_tsi_utils.cc +4 -4
  661. data/src/core/tsi/alts/handshaker/transport_security_common_api.cc +1 -1
  662. data/src/core/tsi/alts/zero_copy_frame_protector/alts_grpc_integrity_only_record_protocol.cc +4 -4
  663. data/src/core/tsi/alts/zero_copy_frame_protector/alts_grpc_privacy_integrity_record_protocol.cc +11 -3
  664. data/src/core/tsi/alts/zero_copy_frame_protector/alts_grpc_record_protocol.h +10 -0
  665. data/src/core/tsi/alts/zero_copy_frame_protector/alts_grpc_record_protocol_common.cc +16 -8
  666. data/src/core/tsi/alts/zero_copy_frame_protector/alts_grpc_record_protocol_common.h +3 -0
  667. data/src/core/tsi/alts/zero_copy_frame_protector/alts_zero_copy_grpc_protector.cc +18 -5
  668. data/src/core/tsi/fake_transport_security.cc +6 -5
  669. data/src/core/tsi/local_transport_security.cc +1 -1
  670. data/src/core/tsi/ssl/key_logging/ssl_key_logging.cc +5 -5
  671. data/src/core/tsi/ssl/key_logging/ssl_key_logging.h +1 -1
  672. data/src/core/tsi/ssl/session_cache/ssl_session_cache.cc +10 -10
  673. data/src/core/tsi/ssl/session_cache/ssl_session_openssl.cc +4 -4
  674. data/src/core/tsi/ssl_transport_security.cc +30 -30
  675. data/src/core/tsi/ssl_transport_security.h +1 -1
  676. data/src/core/tsi/ssl_transport_security_utils.cc +10 -10
  677. data/src/core/tsi/ssl_transport_security_utils.h +2 -2
  678. data/src/core/tsi/transport_security_grpc.cc +8 -0
  679. data/src/core/tsi/transport_security_grpc.h +15 -0
  680. data/src/core/util/alloc.cc +1 -1
  681. data/src/core/util/backoff.h +1 -1
  682. data/src/core/util/chunked_vector.h +4 -4
  683. data/src/core/util/crash.h +1 -1
  684. data/src/core/util/dual_ref_counted.h +2 -2
  685. data/src/core/util/event_log.cc +2 -2
  686. data/src/core/util/event_log.h +3 -3
  687. data/src/core/util/gcp_metadata_query.cc +7 -7
  688. data/src/core/util/gcp_metadata_query.h +2 -2
  689. data/src/core/util/glob.cc +2 -0
  690. data/src/core/util/grpc_check.cc +24 -0
  691. data/src/core/util/grpc_check.h +103 -0
  692. data/src/core/util/grpc_if_nametoindex_posix.cc +1 -1
  693. data/src/core/util/grpc_if_nametoindex_unsupported.cc +1 -1
  694. data/src/core/util/http_client/format_request.cc +1 -1
  695. data/src/core/util/http_client/httpcli.cc +6 -6
  696. data/src/core/util/http_client/httpcli.h +4 -4
  697. data/src/core/util/http_client/httpcli_security_connector.cc +4 -4
  698. data/src/core/util/http_client/parser.cc +4 -4
  699. data/src/core/util/json/json_channel_args.h +1 -1
  700. data/src/core/util/json/json_object_loader.h +6 -6
  701. data/src/core/util/json/json_reader.cc +2 -2
  702. data/src/core/util/json/json_reader.h +1 -1
  703. data/src/core/util/json/json_util.h +3 -3
  704. data/src/core/util/json/json_writer.cc +1 -1
  705. data/src/core/util/latent_see.cc +45 -24
  706. data/src/core/util/latent_see.h +199 -28
  707. data/src/core/util/linux/cpu.cc +1 -1
  708. data/src/core/util/load_file.cc +1 -1
  709. data/src/core/util/load_file.h +1 -1
  710. data/src/core/util/log.cc +3 -3
  711. data/src/core/util/lru_cache.h +4 -4
  712. data/src/core/util/matchers.h +1 -1
  713. data/src/core/util/memory_usage.h +17 -1
  714. data/src/core/util/mpscq.h +1 -1
  715. data/src/core/util/notification.h +1 -1
  716. data/src/core/util/posix/cpu.cc +1 -1
  717. data/src/core/util/posix/directory_reader.cc +3 -2
  718. data/src/core/util/posix/stat.cc +2 -2
  719. data/src/core/util/posix/sync.cc +24 -24
  720. data/src/core/util/posix/thd.cc +2 -2
  721. data/src/core/util/posix/tmpfile.cc +2 -2
  722. data/src/core/util/postmortem_emit.cc +52 -0
  723. data/src/core/util/postmortem_emit.h +30 -0
  724. data/src/core/util/ref_counted.h +2 -2
  725. data/src/core/util/ref_counted_ptr.h +6 -1
  726. data/src/core/util/ref_counted_string.h +1 -1
  727. data/src/core/util/single_set_ptr.h +3 -1
  728. data/src/core/util/status_helper.cc +8 -8
  729. data/src/core/util/status_helper.h +1 -1
  730. data/src/core/util/string.cc +2 -2
  731. data/src/core/util/sync_abseil.cc +1 -1
  732. data/src/core/util/table.h +1 -1
  733. data/src/core/util/time.cc +1 -1
  734. data/src/core/util/time_precise.cc +1 -1
  735. data/src/core/util/trie_lookup.h +170 -0
  736. data/src/core/util/unique_ptr_with_bitset.h +5 -5
  737. data/src/core/util/unique_type_name.h +1 -1
  738. data/src/core/util/upb_utils.h +6 -1
  739. data/src/core/util/validation_errors.cc +2 -2
  740. data/src/core/util/validation_errors.h +2 -3
  741. data/src/core/util/wait_for_single_owner.h +2 -2
  742. data/src/core/util/windows/directory_reader.cc +1 -1
  743. data/src/core/util/windows/stat.cc +2 -2
  744. data/src/core/util/windows/thd.cc +2 -2
  745. data/src/core/util/windows/time.cc +1 -1
  746. data/src/core/util/work_serializer.cc +3 -3
  747. data/src/core/util/work_serializer.h +2 -2
  748. data/src/core/xds/grpc/certificate_provider_store.cc +2 -2
  749. data/src/core/xds/grpc/certificate_provider_store.h +2 -2
  750. data/src/core/xds/grpc/file_watcher_certificate_provider_factory.cc +3 -3
  751. data/src/core/xds/grpc/file_watcher_certificate_provider_factory.h +1 -1
  752. data/src/core/xds/grpc/xds_audit_logger_registry.cc +3 -3
  753. data/src/core/xds/grpc/xds_audit_logger_registry.h +1 -1
  754. data/src/core/xds/grpc/xds_bootstrap_grpc.cc +7 -7
  755. data/src/core/xds/grpc/xds_bootstrap_grpc.h +8 -3
  756. data/src/core/xds/grpc/xds_certificate_provider.cc +4 -4
  757. data/src/core/xds/grpc/xds_certificate_provider.h +2 -2
  758. data/src/core/xds/grpc/xds_client_grpc.cc +39 -20
  759. data/src/core/xds/grpc/xds_client_grpc.h +6 -3
  760. data/src/core/xds/grpc/xds_cluster.cc +2 -2
  761. data/src/core/xds/grpc/xds_cluster.h +1 -1
  762. data/src/core/xds/grpc/xds_cluster_parser.cc +7 -7
  763. data/src/core/xds/grpc/xds_cluster_parser.h +1 -1
  764. data/src/core/xds/grpc/xds_cluster_specifier_plugin.cc +4 -4
  765. data/src/core/xds/grpc/xds_cluster_specifier_plugin.h +1 -1
  766. data/src/core/xds/grpc/xds_common_types.cc +1 -1
  767. data/src/core/xds/grpc/xds_common_types.h +1 -1
  768. data/src/core/xds/grpc/xds_common_types_parser.cc +5 -5
  769. data/src/core/xds/grpc/xds_endpoint.h +2 -2
  770. data/src/core/xds/grpc/xds_endpoint_parser.cc +7 -7
  771. data/src/core/xds/grpc/xds_endpoint_parser.h +1 -1
  772. data/src/core/xds/grpc/xds_health_status.cc +1 -1
  773. data/src/core/xds/grpc/xds_health_status.h +1 -1
  774. data/src/core/xds/grpc/xds_http_fault_filter.cc +4 -4
  775. data/src/core/xds/grpc/xds_http_fault_filter.h +2 -2
  776. data/src/core/xds/grpc/xds_http_filter.h +3 -3
  777. data/src/core/xds/grpc/xds_http_filter_registry.cc +4 -3
  778. data/src/core/xds/grpc/xds_http_filter_registry.h +2 -2
  779. data/src/core/xds/grpc/xds_http_gcp_authn_filter.cc +3 -3
  780. data/src/core/xds/grpc/xds_http_gcp_authn_filter.h +2 -2
  781. data/src/core/xds/grpc/xds_http_rbac_filter.cc +4 -4
  782. data/src/core/xds/grpc/xds_http_rbac_filter.h +2 -2
  783. data/src/core/xds/grpc/xds_http_stateful_session_filter.cc +3 -3
  784. data/src/core/xds/grpc/xds_http_stateful_session_filter.h +2 -2
  785. data/src/core/xds/grpc/xds_lb_policy_registry.cc +1 -1
  786. data/src/core/xds/grpc/xds_lb_policy_registry.h +1 -1
  787. data/src/core/xds/grpc/xds_listener.cc +2 -2
  788. data/src/core/xds/grpc/xds_listener_parser.cc +9 -9
  789. data/src/core/xds/grpc/xds_listener_parser.h +1 -1
  790. data/src/core/xds/grpc/xds_matcher.cc +277 -0
  791. data/src/core/xds/grpc/xds_matcher.h +432 -0
  792. data/src/core/xds/grpc/xds_matcher_action.cc +47 -0
  793. data/src/core/xds/grpc/xds_matcher_action.h +48 -0
  794. data/src/core/xds/grpc/xds_matcher_context.cc +29 -0
  795. data/src/core/xds/grpc/xds_matcher_context.h +46 -0
  796. data/src/core/xds/grpc/xds_matcher_input.cc +79 -0
  797. data/src/core/xds/grpc/xds_matcher_input.h +105 -0
  798. data/src/core/xds/grpc/xds_matcher_parse.cc +356 -0
  799. data/src/core/xds/grpc/xds_matcher_parse.h +39 -0
  800. data/src/core/xds/grpc/xds_metadata.cc +4 -3
  801. data/src/core/xds/grpc/xds_metadata.h +3 -3
  802. data/src/core/xds/grpc/xds_metadata_parser.cc +2 -2
  803. data/src/core/xds/grpc/xds_route_config.cc +3 -3
  804. data/src/core/xds/grpc/xds_route_config_parser.cc +14 -14
  805. data/src/core/xds/grpc/xds_route_config_parser.h +1 -1
  806. data/src/core/xds/grpc/xds_routing.cc +6 -6
  807. data/src/core/xds/grpc/xds_routing.h +2 -2
  808. data/src/core/xds/grpc/xds_server_grpc.cc +2 -2
  809. data/src/core/xds/grpc/xds_transport_grpc.cc +11 -11
  810. data/src/core/xds/grpc/xds_transport_grpc.h +2 -2
  811. data/src/core/xds/xds_client/lrs_client.cc +9 -9
  812. data/src/core/xds/xds_client/lrs_client.h +4 -4
  813. data/src/core/xds/xds_client/xds_api.h +1 -1
  814. data/src/core/xds/xds_client/xds_backend_metric_propagation.cc +1 -1
  815. data/src/core/xds/xds_client/xds_backend_metric_propagation.h +1 -1
  816. data/src/core/xds/xds_client/xds_client.cc +17 -17
  817. data/src/core/xds/xds_client/xds_client.h +5 -5
  818. data/src/core/xds/xds_client/xds_locality.h +2 -2
  819. data/src/core/xds/xds_client/xds_resource_type.h +2 -2
  820. data/src/core/xds/xds_client/xds_resource_type_impl.h +1 -1
  821. data/src/core/xds/xds_client/xds_transport.h +2 -2
  822. data/src/ruby/ext/grpc/extconf.rb +14 -12
  823. data/src/ruby/ext/grpc/rb_call.c +0 -1
  824. data/src/ruby/ext/grpc/rb_channel_args.c +0 -1
  825. data/src/ruby/ext/grpc/rb_channel_credentials.c +0 -1
  826. data/src/ruby/ext/grpc/rb_compression_options.c +0 -1
  827. data/src/ruby/ext/grpc/rb_grpc_imports.generated.h +2 -2
  828. data/src/ruby/ext/grpc/rb_server_credentials.c +0 -1
  829. data/src/ruby/ext/grpc/rb_xds_channel_credentials.c +0 -1
  830. data/src/ruby/ext/grpc/rb_xds_server_credentials.c +0 -1
  831. data/src/ruby/lib/grpc/grpc.rb +7 -9
  832. data/src/ruby/lib/grpc/version.rb +1 -1
  833. data/src/ruby/spec/client_server_spec.rb +1 -1
  834. data/src/ruby/spec/generic/rpc_server_pool_spec.rb +1 -1
  835. data/src/ruby/spec/generic/rpc_server_spec.rb +3 -4
  836. data/src/ruby/spec/spec_helper.rb +1 -1
  837. data/third_party/abseil-cpp/absl/container/internal/node_slot_policy.h +95 -0
  838. data/third_party/abseil-cpp/absl/container/node_hash_map.h +687 -0
  839. metadata +67 -8
@@ -48,14 +48,22 @@ grpc_core::Transport* grpc_create_chttp2_transport(
48
48
 
49
49
  /// Takes ownership of \a read_buffer, which (if non-NULL) contains
50
50
  /// leftover bytes previously read from the endpoint (e.g., by handshakers).
51
+ ///
51
52
  /// If non-null, \a notify_on_receive_settings will be scheduled when
52
- /// HTTP/2 settings are received from the peer.
53
+ /// HTTP/2 settings are received from the peer. The argument will be
54
+ /// the peer's MAX_CONCURRENT_STREAMS setting.
55
+ ///
53
56
  /// If non-null, the endpoint will be removed from
54
57
  /// interested_parties_until_recv_settings before
55
58
  /// notify_on_receive_settings is invoked.
59
+ //
60
+ // TODO(roth): Consider using the new StateWatcher API in the connector
61
+ // code instead of supporting notify_on_receive_settings and
62
+ // notify_on_close here. This might be easier after pollset_set goes away.
56
63
  void grpc_chttp2_transport_start_reading(
57
64
  grpc_core::Transport* transport, grpc_slice_buffer* read_buffer,
58
- grpc_closure* notify_on_receive_settings,
65
+ absl::AnyInvocable<void(absl::StatusOr<uint32_t>)>
66
+ notify_on_receive_settings,
59
67
  grpc_pollset_set* interested_parties_until_recv_settings,
60
68
  grpc_closure* notify_on_close);
61
69
 
@@ -23,21 +23,24 @@
23
23
 
24
24
  #include <algorithm>
25
25
  #include <cmath>
26
+ #include <cstdint>
26
27
  #include <ostream>
27
28
  #include <string>
28
29
  #include <tuple>
29
30
  #include <vector>
30
31
 
31
- #include "absl/log/check.h"
32
- #include "absl/log/log.h"
33
- #include "absl/strings/str_cat.h"
34
- #include "absl/strings/str_format.h"
35
- #include "absl/strings/str_join.h"
36
32
  #include "src/core/ext/transport/chttp2/transport/http2_settings.h"
37
33
  #include "src/core/ext/transport/chttp2/transport/http2_settings_manager.h"
38
34
  #include "src/core/lib/experiments/experiments.h"
39
35
  #include "src/core/lib/resource_quota/memory_quota.h"
36
+ #include "src/core/util/grpc_check.h"
40
37
  #include "src/core/util/useful.h"
38
+ #include "absl/log/log.h"
39
+ #include "absl/status/status.h"
40
+ #include "absl/strings/str_cat.h"
41
+ #include "absl/strings/str_format.h"
42
+ #include "absl/strings/str_join.h"
43
+ #include "absl/strings/string_view.h"
41
44
 
42
45
  namespace grpc_core {
43
46
  namespace chttp2 {
@@ -96,6 +99,26 @@ std::ostream& operator<<(std::ostream& out, const FlowControlAction& action) {
96
99
  return out << action.DebugString();
97
100
  }
98
101
 
102
+ std::string FlowControlAction::ImmediateUpdateReasons() const {
103
+ std::string result;
104
+ if (send_stream_update_ == Urgency::UPDATE_IMMEDIATELY) {
105
+ absl::StrAppend(&result, "send_stream_update,");
106
+ }
107
+ if (send_transport_update_ == Urgency::UPDATE_IMMEDIATELY) {
108
+ absl::StrAppend(&result, "send_transport_update,");
109
+ }
110
+ if (send_initial_window_update_ == Urgency::UPDATE_IMMEDIATELY) {
111
+ absl::StrAppend(&result, "send_initial_window_update,");
112
+ }
113
+ if (send_max_frame_size_update_ == Urgency::UPDATE_IMMEDIATELY) {
114
+ absl::StrAppend(&result, "send_max_frame_size_update,");
115
+ }
116
+ if (preferred_rx_crypto_frame_size_update_ == Urgency::UPDATE_IMMEDIATELY) {
117
+ absl::StrAppend(&result, "preferred_rx_crypto_frame_size_update,");
118
+ }
119
+ return result;
120
+ }
121
+
99
122
  TransportFlowControl::TransportFlowControl(absl::string_view name,
100
123
  bool enable_bdp_probe,
101
124
  MemoryOwner* memory_owner)
@@ -333,7 +356,7 @@ void StreamFlowControl::SentUpdate(uint32_t announce) {
333
356
  TransportFlowControl::IncomingUpdateContext tfc_upd(tfc_);
334
357
  pending_size_ = std::nullopt;
335
358
  tfc_upd.UpdateAnnouncedWindowDelta(&announced_window_delta_, announce);
336
- CHECK_EQ(DesiredAnnounceSize(), 0u);
359
+ GRPC_CHECK_EQ(DesiredAnnounceSize(), 0u);
337
360
  std::ignore = tfc_upd.MakeAction();
338
361
  }
339
362
 
@@ -381,9 +404,21 @@ FlowControlAction StreamFlowControl::UpdateAction(FlowControlAction action) {
381
404
  return action;
382
405
  }
383
406
 
407
+ void StreamFlowControl::IncomingUpdateContext::HackIncrementPendingSize(
408
+ int64_t pending_size) {
409
+ GRPC_CHECK_GE(pending_size, 0);
410
+ if (sfc_->pending_size_.has_value()) {
411
+ int64_t final_size = Clamp(sfc_->pending_size_.value() + pending_size,
412
+ int64_t{0}, kMaxWindowUpdateSize);
413
+ *sfc_->pending_size_ = final_size;
414
+ } else {
415
+ sfc_->pending_size_ = pending_size;
416
+ }
417
+ }
418
+
384
419
  void StreamFlowControl::IncomingUpdateContext::SetPendingSize(
385
420
  int64_t pending_size) {
386
- CHECK_GE(pending_size, 0);
421
+ GRPC_CHECK_GE(pending_size, 0);
387
422
  sfc_->pending_size_ = pending_size;
388
423
  }
389
424
 
@@ -23,28 +23,25 @@
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/log/check.h"
33
- #include "absl/status/status.h"
34
- #include "absl/strings/string_view.h"
35
32
  #include "src/core/channelz/property_list.h"
36
33
  #include "src/core/ext/transport/chttp2/transport/http2_settings.h"
37
34
  #include "src/core/ext/transport/chttp2/transport/http2_settings_manager.h"
38
35
  #include "src/core/lib/debug/trace.h"
39
36
  #include "src/core/lib/resource_quota/memory_quota.h"
40
37
  #include "src/core/lib/transport/bdp_estimator.h"
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,15 +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
 
62
- // TODO(ctiller): clean up when flow_control_fixes is enabled by default
63
- static constexpr uint32_t kFrameSize = 1024 * 1024;
64
- static constexpr const uint32_t kMinInitialWindowSize = 128;
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);
65
62
 
66
63
  class TransportFlowControl;
67
64
  class StreamFlowControl;
68
65
 
69
66
  enum class StallEdge { kNoChange, kStalled, kUnstalled };
70
67
 
68
+ #define GRPC_HTTP2_FLOW_CONTROL_DLOG \
69
+ DLOG_IF(INFO, GRPC_TRACE_FLAG_ENABLED(http2_ph2_transport))
70
+
71
71
  // Encapsulates a collections of actions the transport needs to take with
72
72
  // regard to flow control. Each action comes with urgencies that tell the
73
73
  // transport how quickly the action must take place.
@@ -76,10 +76,10 @@ class GRPC_MUST_USE_RESULT FlowControlAction {
76
76
  enum class Urgency : uint8_t {
77
77
  // Nothing to be done.
78
78
  NO_ACTION_NEEDED = 0,
79
- // Initiate a write to update the initial window immediately.
79
+ // Initiate a write to send updates immediately.
80
80
  UPDATE_IMMEDIATELY,
81
- // Push the flow control update into a send buffer, to be sent
82
- // 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.
83
83
  QUEUE_UPDATE,
84
84
  };
85
85
 
@@ -94,12 +94,67 @@ class GRPC_MUST_USE_RESULT FlowControlAction {
94
94
  Urgency preferred_rx_crypto_frame_size_update() const {
95
95
  return preferred_rx_crypto_frame_size_update_;
96
96
  }
97
+
98
+ // Returns true if any action has UPDATE_IMMEDIATELY urgency.
99
+ bool AnyUpdateImmediately() const {
100
+ return send_stream_update_ == Urgency::UPDATE_IMMEDIATELY ||
101
+ send_transport_update_ == Urgency::UPDATE_IMMEDIATELY ||
102
+ send_initial_window_update_ == Urgency::UPDATE_IMMEDIATELY ||
103
+ send_max_frame_size_update_ == Urgency::UPDATE_IMMEDIATELY ||
104
+ preferred_rx_crypto_frame_size_update_ ==
105
+ Urgency::UPDATE_IMMEDIATELY;
106
+ }
107
+
108
+ std::string ImmediateUpdateReasons() const;
109
+
110
+ // Returns the value of SETTINGS_INITIAL_WINDOW_SIZE that we will send to the
111
+ // peer.
97
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.
98
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.
99
117
  uint32_t preferred_rx_crypto_frame_size() const {
100
118
  return preferred_rx_crypto_frame_size_;
101
119
  }
102
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
+
103
158
  FlowControlAction& set_send_stream_update(Urgency u) {
104
159
  send_stream_update_ = u;
105
160
  return *this;
@@ -127,27 +182,6 @@ class GRPC_MUST_USE_RESULT FlowControlAction {
127
182
  return *this;
128
183
  }
129
184
 
130
- static const char* UrgencyString(Urgency u);
131
- std::string DebugString() const;
132
-
133
- void AssertEmpty() { CHECK(*this == FlowControlAction()); }
134
-
135
- bool operator==(const FlowControlAction& other) const {
136
- return send_stream_update_ == other.send_stream_update_ &&
137
- send_transport_update_ == other.send_transport_update_ &&
138
- send_initial_window_update_ == other.send_initial_window_update_ &&
139
- send_max_frame_size_update_ == other.send_max_frame_size_update_ &&
140
- (send_initial_window_update_ == Urgency::NO_ACTION_NEEDED ||
141
- initial_window_size_ == other.initial_window_size_) &&
142
- (send_max_frame_size_update_ == Urgency::NO_ACTION_NEEDED ||
143
- max_frame_size_ == other.max_frame_size_) &&
144
- (preferred_rx_crypto_frame_size_update_ ==
145
- Urgency::NO_ACTION_NEEDED ||
146
- preferred_rx_crypto_frame_size_ ==
147
- other.preferred_rx_crypto_frame_size_);
148
- }
149
-
150
- private:
151
185
  Urgency send_stream_update_ = Urgency::NO_ACTION_NEEDED;
152
186
  Urgency send_transport_update_ = Urgency::NO_ACTION_NEEDED;
153
187
  Urgency send_initial_window_update_ = Urgency::NO_ACTION_NEEDED;
@@ -163,6 +197,7 @@ std::ostream& operator<<(std::ostream& out, const FlowControlAction& action);
163
197
 
164
198
  // Implementation of flow control that abides to HTTP/2 spec and attempts
165
199
  // to be as performant as possible.
200
+ // This class manages the flow control at a connection level.
166
201
  class TransportFlowControl final {
167
202
  public:
168
203
  explicit TransportFlowControl(absl::string_view name, bool enable_bdp_probe,
@@ -171,16 +206,19 @@ class TransportFlowControl final {
171
206
 
172
207
  bool bdp_probe() const { return enable_bdp_probe_; }
173
208
 
174
- // returns an announce if we should send a transport update to our peer,
175
- // 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
176
211
  // regardless of the send - if it is false and this function returns non-zero,
177
- // this announce will cause a write to occur
212
+ // the caller can send a flow control update.
178
213
  uint32_t DesiredAnnounceSize(bool writing_anyway) const;
179
- // notify that we've actually sent a stream window update
180
- // (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`.
181
218
  void SentUpdate(uint32_t announce);
182
219
 
183
- // 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.
184
222
  uint32_t MaybeSendUpdate(bool writing_anyway) {
185
223
  uint32_t n = DesiredAnnounceSize(writing_anyway);
186
224
  SentUpdate(n);
@@ -188,28 +226,41 @@ class TransportFlowControl final {
188
226
  }
189
227
 
190
228
  // Track an update to the incoming flow control counters - that is how many
191
- // tokens we report to our peer that we're willing to accept.
192
- // 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.
193
231
  class IncomingUpdateContext {
194
232
  public:
195
233
  explicit IncomingUpdateContext(TransportFlowControl* tfc) : tfc_(tfc) {}
196
- ~IncomingUpdateContext() { CHECK_EQ(tfc_, nullptr); }
234
+ ~IncomingUpdateContext() { GRPC_CHECK_EQ(tfc_, nullptr); }
197
235
 
198
236
  IncomingUpdateContext(const IncomingUpdateContext&) = delete;
199
237
  IncomingUpdateContext& operator=(const IncomingUpdateContext&) = delete;
238
+ IncomingUpdateContext(IncomingUpdateContext&&) = delete;
239
+ IncomingUpdateContext& operator=(IncomingUpdateContext&&) = delete;
200
240
 
201
241
  // Reads the flow control data and returns an actionable struct that will
202
- // tell chttp2 exactly what it needs to do
242
+ // tell the transport exactly what it needs to do.
203
243
  FlowControlAction MakeAction() {
204
244
  return std::exchange(tfc_, nullptr)->UpdateAction(FlowControlAction());
205
245
  }
206
246
 
207
- // Notify of data receipt. Returns OkStatus if the data was accepted,
208
- // 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.
209
258
  absl::Status RecvData(
210
259
  int64_t incoming_frame_size, absl::FunctionRef<absl::Status()> stream =
211
260
  []() { return absl::OkStatus(); });
212
261
 
262
+ private:
263
+ friend class StreamFlowControl;
213
264
  // Update a stream announce window delta, keeping track of how much total
214
265
  // positive delta is present on the transport.
215
266
  void UpdateAnnouncedWindowDelta(int64_t* delta, int64_t change) {
@@ -223,7 +274,6 @@ class TransportFlowControl final {
223
274
  }
224
275
  }
225
276
 
226
- private:
227
277
  TransportFlowControl* tfc_;
228
278
  };
229
279
 
@@ -232,9 +282,14 @@ class TransportFlowControl final {
232
282
  class OutgoingUpdateContext {
233
283
  public:
234
284
  explicit OutgoingUpdateContext(TransportFlowControl* tfc) : tfc_(tfc) {}
235
- void StreamSentData(int64_t size) { tfc_->remote_window_ -= size; }
236
285
 
237
- // 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.
238
293
  void RecvUpdate(uint32_t size) { tfc_->remote_window_ += size; }
239
294
 
240
295
  // Finish the update and check whether we became stalled or unstalled.
@@ -248,29 +303,37 @@ class TransportFlowControl final {
248
303
  }
249
304
 
250
305
  private:
306
+ friend class StreamFlowControl;
307
+ void StreamSentData(int64_t size) { tfc_->remote_window_ -= size; }
308
+
251
309
  TransportFlowControl* tfc_;
252
310
  const bool was_stalled_ = tfc_->remote_window_ <= 0;
253
311
  };
254
312
 
255
313
  // Call periodically (at a low-ish rate, 100ms - 10s makes sense)
256
314
  // to perform more complex flow control calculations and return an action
257
- // to let chttp2 change its parameters
315
+ // to let the transport change its parameters.
316
+ // TODO(tjagtap) [PH2][P2] Plumb with PH2 flow control.
258
317
  FlowControlAction PeriodicUpdate();
259
318
 
260
- int64_t target_window() const;
261
- int64_t target_frame_size() const { return target_frame_size_; }
262
- int64_t target_preferred_rx_crypto_frame_size() const {
263
- 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();
264
323
  }
265
324
 
266
325
  BdpEstimator* bdp_estimator() { return &bdp_estimator_; }
267
326
 
268
- uint32_t acked_init_window() const { return acked_init_window_; }
269
- uint32_t queued_init_window() const { return target_initial_window_size_; }
270
- 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(); }
271
329
 
330
+ // Call after you prepare and queue a settings frame to send to the peer.
272
331
  void FlushedSettings() { sent_init_window_ = queued_init_window(); }
273
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.
274
337
  FlowControlAction SetAckedInitialWindow(uint32_t value);
275
338
 
276
339
  void set_target_initial_window_size(uint32_t value) {
@@ -280,16 +343,10 @@ class TransportFlowControl final {
280
343
 
281
344
  // Getters
282
345
  int64_t remote_window() const { return remote_window_; }
283
- int64_t announced_window() const { return announced_window_; }
346
+ int64_t test_only_announced_window() const { return announced_window(); }
284
347
 
285
- int64_t announced_stream_total_over_incoming_window() const {
286
- return announced_stream_total_over_incoming_window_;
287
- }
288
-
289
- void RemoveAnnouncedWindowDelta(int64_t delta) {
290
- if (delta > 0) {
291
- announced_stream_total_over_incoming_window_ -= delta;
292
- }
348
+ int64_t test_only_announced_stream_total_over_incoming_window() const {
349
+ return announced_stream_total_over_incoming_window();
293
350
  }
294
351
 
295
352
  // A snapshot of the flow control stats to export.
@@ -348,7 +405,28 @@ class TransportFlowControl final {
348
405
  }
349
406
 
350
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
+
351
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
+
352
430
  static void UpdateSetting(absl::string_view name, int64_t* desired_value,
353
431
  uint32_t new_desired_value,
354
432
  FlowControlAction* action,
@@ -402,20 +480,50 @@ class StreamFlowControl final {
402
480
  explicit IncomingUpdateContext(StreamFlowControl* sfc)
403
481
  : tfc_upd_(sfc->tfc_), sfc_(sfc) {}
404
482
 
483
+ IncomingUpdateContext(const IncomingUpdateContext&) = delete;
484
+ IncomingUpdateContext& operator=(const IncomingUpdateContext&) = delete;
485
+ IncomingUpdateContext(IncomingUpdateContext&&) = delete;
486
+ IncomingUpdateContext& operator=(IncomingUpdateContext&&) = delete;
487
+
405
488
  FlowControlAction MakeAction() {
406
489
  return sfc_->UpdateAction(tfc_upd_.MakeAction());
407
490
  }
408
491
 
409
- // 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.
410
501
  absl::Status RecvData(int64_t incoming_frame_size);
411
502
 
412
- // 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.
413
508
  void SetMinProgressSize(int64_t min_progress_size) {
414
509
  sfc_->min_progress_size_ = min_progress_size;
415
510
  }
416
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.
417
517
  void SetPendingSize(int64_t pending_size);
418
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
+
419
527
  private:
420
528
  TransportFlowControl::IncomingUpdateContext tfc_upd_;
421
529
  StreamFlowControl* const sfc_;
@@ -427,10 +535,18 @@ class StreamFlowControl final {
427
535
  public:
428
536
  explicit OutgoingUpdateContext(StreamFlowControl* sfc)
429
537
  : tfc_upd_(sfc->tfc_), sfc_(sfc) {}
430
- // 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.
431
546
  void RecvUpdate(uint32_t size) { sfc_->remote_window_delta_ += size; }
432
- // we have sent data on the wire, we must track this in our bookkeeping for
433
- // 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`.
434
550
  void SentData(int64_t outgoing_frame_size) {
435
551
  tfc_upd_.StreamSentData(outgoing_frame_size);
436
552
  sfc_->remote_window_delta_ -= outgoing_frame_size;
@@ -441,14 +557,17 @@ class StreamFlowControl final {
441
557
  StreamFlowControl* const sfc_;
442
558
  };
443
559
 
444
- // returns an announce if we should send a stream update to our peer, else
445
- // returns zero
560
+ // Returns a non-zero announce if we should send a stream update to our
561
+ // peer, else returns zero;
446
562
  uint32_t DesiredAnnounceSize() const;
447
- // notify that we've actually sent a stream window update
448
- // (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`.
449
567
  void SentUpdate(uint32_t announce);
450
568
 
451
- // 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.
452
571
  uint32_t MaybeSendUpdate() {
453
572
  uint32_t n = DesiredAnnounceSize();
454
573
  SentUpdate(n);
@@ -456,8 +575,10 @@ class StreamFlowControl final {
456
575
  }
457
576
 
458
577
  int64_t remote_window_delta() const { return remote_window_delta_; }
459
- int64_t announced_window_delta() const { return announced_window_delta_; }
460
- 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_; }
461
582
 
462
583
  // A snapshot of the flow control stats to export.
463
584
  struct Stats {
@@ -471,13 +592,32 @@ class StreamFlowControl final {
471
592
 
472
593
  Stats stats() const {
473
594
  Stats stats;
474
- stats.min_progress_size = min_progress_size();
595
+ stats.min_progress_size = min_progress_size_;
475
596
  stats.remote_window_delta = remote_window_delta();
476
- stats.announced_window_delta = announced_window_delta();
597
+ stats.announced_window_delta = announced_window_delta_;
477
598
  stats.pending_size = pending_size_;
478
599
  return stats;
479
600
  }
480
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
+
481
621
  private:
482
622
  TransportFlowControl* const tfc_;
483
623
  int64_t min_progress_size_ = 0;