grpc 1.76.0 → 1.78.0.pre1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (763) hide show
  1. checksums.yaml +4 -4
  2. data/Makefile +11 -5
  3. data/include/grpc/credentials.h +6 -1
  4. data/include/grpc/event_engine/memory_allocator.h +2 -0
  5. data/include/grpc/impl/channel_arg_names.h +5 -0
  6. data/include/grpc/support/metrics.h +7 -1
  7. data/src/core/call/call_filters.cc +1 -1
  8. data/src/core/call/call_filters.h +175 -1
  9. data/src/core/call/call_spine.cc +1 -1
  10. data/src/core/call/call_spine.h +27 -5
  11. data/src/core/call/channelz_context.h +30 -0
  12. data/src/core/call/client_call.cc +43 -5
  13. data/src/core/call/client_call.h +6 -3
  14. data/src/core/call/filter_fusion.h +4 -4
  15. data/src/core/call/interception_chain.h +7 -6
  16. data/src/core/call/metadata_batch.cc +49 -55
  17. data/src/core/call/metadata_batch.h +7 -6
  18. data/src/core/call/metadata_info.cc +1 -1
  19. data/src/core/call/parsed_metadata.h +2 -2
  20. data/src/core/call/request_buffer.cc +1 -1
  21. data/src/core/call/security_context.cc +1 -1
  22. data/src/core/call/security_context.h +1 -1
  23. data/src/core/call/server_call.cc +1 -1
  24. data/src/core/call/server_call.h +5 -3
  25. data/src/core/call/simple_slice_based_metadata.h +1 -1
  26. data/src/core/call/status_util.cc +1 -1
  27. data/src/core/channelz/channel_trace.cc +1 -1
  28. data/src/core/channelz/channel_trace.h +3 -3
  29. data/src/core/channelz/channelz.cc +13 -11
  30. data/src/core/channelz/channelz.h +41 -6
  31. data/src/core/channelz/channelz_registry.cc +2 -2
  32. data/src/core/channelz/channelz_registry.h +42 -2
  33. data/src/core/channelz/property_list.h +6 -4
  34. data/src/core/channelz/v2tov1/convert.cc +6 -6
  35. data/src/core/channelz/v2tov1/legacy_api.cc +4 -5
  36. data/src/core/channelz/v2tov1/property_list.cc +1 -1
  37. data/src/core/channelz/ztrace_collector.h +14 -2
  38. data/src/core/client_channel/backup_poller.cc +2 -2
  39. data/src/core/client_channel/buffered_call.cc +140 -0
  40. data/src/core/client_channel/buffered_call.h +104 -0
  41. data/src/core/client_channel/client_channel.cc +124 -71
  42. data/src/core/client_channel/client_channel.h +8 -11
  43. data/src/core/client_channel/client_channel_factory.h +1 -1
  44. data/src/core/client_channel/client_channel_filter.cc +393 -663
  45. data/src/core/client_channel/client_channel_filter.h +57 -150
  46. data/src/core/client_channel/client_channel_internal.h +5 -1
  47. data/src/core/client_channel/client_channel_service_config.cc +43 -3
  48. data/src/core/client_channel/client_channel_service_config.h +12 -1
  49. data/src/core/client_channel/config_selector.h +2 -2
  50. data/src/core/client_channel/connector.h +2 -0
  51. data/src/core/client_channel/dynamic_filters.cc +2 -2
  52. data/src/core/client_channel/global_subchannel_pool.h +1 -1
  53. data/src/core/client_channel/lb_metadata.h +1 -1
  54. data/src/core/client_channel/load_balanced_call_destination.cc +3 -5
  55. data/src/core/client_channel/load_balanced_call_destination.h +1 -1
  56. data/src/core/client_channel/retry_filter.cc +2 -2
  57. data/src/core/client_channel/retry_filter_legacy_call_data.cc +6 -7
  58. data/src/core/client_channel/retry_filter_legacy_call_data.h +6 -8
  59. data/src/core/client_channel/retry_service_config.cc +3 -3
  60. data/src/core/client_channel/retry_service_config.h +1 -1
  61. data/src/core/client_channel/subchannel.cc +106 -17
  62. data/src/core/client_channel/subchannel.h +24 -8
  63. data/src/core/client_channel/subchannel_pool_interface.cc +2 -2
  64. data/src/core/client_channel/subchannel_pool_interface.h +1 -1
  65. data/src/core/client_channel/subchannel_stream_client.cc +1 -1
  66. data/src/core/client_channel/subchannel_stream_client.h +3 -3
  67. data/src/core/config/config_vars.cc +8 -2
  68. data/src/core/config/config_vars.h +5 -0
  69. data/src/core/config/core_configuration.h +1 -1
  70. data/src/core/config/load_config.cc +1 -1
  71. data/src/core/credentials/call/call_credentials.h +2 -2
  72. data/src/core/credentials/call/call_creds_registry.h +1 -1
  73. data/src/core/credentials/call/call_creds_registry_init.cc +2 -2
  74. data/src/core/credentials/call/call_creds_util.cc +3 -3
  75. data/src/core/credentials/call/composite/composite_call_credentials.cc +2 -2
  76. data/src/core/credentials/call/composite/composite_call_credentials.h +1 -1
  77. data/src/core/credentials/call/external/aws_external_account_credentials.cc +6 -6
  78. data/src/core/credentials/call/external/aws_external_account_credentials.h +1 -1
  79. data/src/core/credentials/call/external/external_account_credentials.cc +12 -12
  80. data/src/core/credentials/call/external/external_account_credentials.h +1 -1
  81. data/src/core/credentials/call/external/file_external_account_credentials.cc +3 -3
  82. data/src/core/credentials/call/external/file_external_account_credentials.h +1 -1
  83. data/src/core/credentials/call/external/url_external_account_credentials.cc +6 -6
  84. data/src/core/credentials/call/external/url_external_account_credentials.h +1 -1
  85. data/src/core/credentials/call/gcp_service_account_identity/gcp_service_account_identity_credentials.cc +24 -71
  86. data/src/core/credentials/call/gcp_service_account_identity/gcp_service_account_identity_credentials.h +1 -8
  87. data/src/core/credentials/call/iam/iam_credentials.cc +2 -2
  88. data/src/core/credentials/call/iam/iam_credentials.h +1 -1
  89. data/src/core/credentials/call/json_util.cc +1 -1
  90. data/src/core/credentials/call/jwt/json_token.cc +4 -4
  91. data/src/core/credentials/call/jwt/jwt_credentials.cc +3 -3
  92. data/src/core/credentials/call/jwt/jwt_credentials.h +4 -4
  93. data/src/core/credentials/call/jwt/jwt_verifier.cc +5 -5
  94. data/src/core/credentials/call/jwt_token_file/jwt_token_file_call_credentials.cc +2 -2
  95. data/src/core/credentials/call/jwt_token_file/jwt_token_file_call_credentials.h +3 -3
  96. data/src/core/credentials/call/jwt_util.cc +3 -3
  97. data/src/core/credentials/call/jwt_util.h +1 -1
  98. data/src/core/credentials/call/oauth2/oauth2_credentials.cc +29 -60
  99. data/src/core/credentials/call/oauth2/oauth2_credentials.h +3 -9
  100. data/src/core/credentials/call/plugin/plugin_credentials.cc +4 -4
  101. data/src/core/credentials/call/plugin/plugin_credentials.h +2 -2
  102. data/src/core/credentials/call/token_fetcher/token_fetcher_credentials.cc +46 -0
  103. data/src/core/credentials/call/token_fetcher/token_fetcher_credentials.h +32 -3
  104. data/src/core/credentials/transport/alts/alts_credentials.cc +3 -3
  105. data/src/core/credentials/transport/alts/alts_security_connector.cc +3 -3
  106. data/src/core/credentials/transport/alts/check_gcp_environment_no_op.cc +1 -1
  107. data/src/core/credentials/transport/alts/grpc_alts_credentials_client_options.cc +1 -1
  108. data/src/core/credentials/transport/alts/grpc_alts_credentials_options.h +1 -1
  109. data/src/core/credentials/transport/channel_creds_registry.h +1 -1
  110. data/src/core/credentials/transport/channel_creds_registry_init.cc +1 -1
  111. data/src/core/credentials/transport/composite/composite_channel_credentials.cc +2 -2
  112. data/src/core/credentials/transport/composite/composite_channel_credentials.h +1 -1
  113. data/src/core/credentials/transport/fake/fake_credentials.cc +1 -1
  114. data/src/core/credentials/transport/fake/fake_credentials.h +1 -1
  115. data/src/core/credentials/transport/fake/fake_security_connector.cc +5 -5
  116. data/src/core/credentials/transport/google_default/credentials_generic.cc +2 -2
  117. data/src/core/credentials/transport/google_default/google_default_credentials.cc +5 -11
  118. data/src/core/credentials/transport/google_default/google_default_credentials.h +0 -2
  119. data/src/core/credentials/transport/insecure/insecure_security_connector.h +2 -2
  120. data/src/core/credentials/transport/local/local_security_connector.cc +5 -5
  121. data/src/core/credentials/transport/security_connector.cc +1 -1
  122. data/src/core/credentials/transport/security_connector.h +2 -2
  123. data/src/core/credentials/transport/ssl/ssl_credentials.cc +1 -1
  124. data/src/core/credentials/transport/ssl/ssl_security_connector.cc +5 -5
  125. data/src/core/credentials/transport/tls/certificate_provider_factory.h +1 -1
  126. data/src/core/credentials/transport/tls/certificate_provider_registry.cc +1 -1
  127. data/src/core/credentials/transport/tls/certificate_provider_registry.h +1 -1
  128. data/src/core/credentials/transport/tls/grpc_tls_certificate_distributor.cc +1 -1
  129. data/src/core/credentials/transport/tls/grpc_tls_certificate_distributor.h +2 -2
  130. data/src/core/credentials/transport/tls/grpc_tls_certificate_match.cc +1 -1
  131. data/src/core/credentials/transport/tls/grpc_tls_certificate_provider.cc +3 -3
  132. data/src/core/credentials/transport/tls/grpc_tls_certificate_provider.h +3 -3
  133. data/src/core/credentials/transport/tls/grpc_tls_certificate_verifier.cc +1 -1
  134. data/src/core/credentials/transport/tls/grpc_tls_certificate_verifier.h +2 -2
  135. data/src/core/credentials/transport/tls/grpc_tls_credentials_options.cc +1 -1
  136. data/src/core/credentials/transport/tls/grpc_tls_crl_provider.cc +5 -5
  137. data/src/core/credentials/transport/tls/grpc_tls_crl_provider.h +3 -3
  138. data/src/core/credentials/transport/tls/load_system_roots_supported.cc +1 -1
  139. data/src/core/credentials/transport/tls/spiffe_utils.cc +10 -8
  140. data/src/core/credentials/transport/tls/spiffe_utils.h +2 -2
  141. data/src/core/credentials/transport/tls/ssl_utils.cc +4 -4
  142. data/src/core/credentials/transport/tls/ssl_utils.h +2 -2
  143. data/src/core/credentials/transport/tls/tls_credentials.cc +1 -1
  144. data/src/core/credentials/transport/tls/tls_security_connector.cc +4 -4
  145. data/src/core/credentials/transport/tls/tls_security_connector.h +3 -3
  146. data/src/core/credentials/transport/transport_credentials.cc +1 -1
  147. data/src/core/credentials/transport/transport_credentials.h +2 -2
  148. data/src/core/credentials/transport/xds/xds_credentials.h +1 -1
  149. data/src/core/ext/filters/backend_metrics/backend_metric_filter.cc +2 -2
  150. data/src/core/ext/filters/backend_metrics/backend_metric_filter.h +4 -1
  151. data/src/core/ext/filters/channel_idle/legacy_channel_idle_filter.cc +5 -5
  152. data/src/core/ext/filters/channel_idle/legacy_channel_idle_filter.h +2 -2
  153. data/src/core/ext/filters/fault_injection/fault_injection_filter.cc +7 -7
  154. data/src/core/ext/filters/fault_injection/fault_injection_filter.h +6 -3
  155. data/src/core/ext/filters/fault_injection/fault_injection_service_config_parser.h +1 -1
  156. data/src/core/ext/filters/gcp_authentication/gcp_authentication_filter.cc +1 -1
  157. data/src/core/ext/filters/gcp_authentication/gcp_authentication_filter.h +6 -3
  158. data/src/core/ext/filters/gcp_authentication/gcp_authentication_service_config_parser.h +1 -1
  159. data/src/core/ext/filters/http/client/http_client_filter.cc +6 -6
  160. data/src/core/ext/filters/http/client/http_client_filter.h +4 -1
  161. data/src/core/ext/filters/http/client_authority_filter.cc +2 -2
  162. data/src/core/ext/filters/http/client_authority_filter.h +4 -1
  163. data/src/core/ext/filters/http/http_filters_plugin.cc +1 -1
  164. data/src/core/ext/filters/http/message_compress/compression_filter.cc +3 -3
  165. data/src/core/ext/filters/http/message_compress/compression_filter.h +21 -2
  166. data/src/core/ext/filters/http/server/http_server_filter.cc +3 -3
  167. data/src/core/ext/filters/http/server/http_server_filter.h +4 -1
  168. data/src/core/ext/filters/message_size/message_size_filter.cc +2 -2
  169. data/src/core/ext/filters/message_size/message_size_filter.h +8 -2
  170. data/src/core/ext/filters/rbac/rbac_filter.cc +1 -1
  171. data/src/core/ext/filters/rbac/rbac_filter.h +4 -1
  172. data/src/core/ext/filters/rbac/rbac_service_config_parser.cc +3 -3
  173. data/src/core/ext/filters/rbac/rbac_service_config_parser.h +1 -1
  174. data/src/core/ext/filters/stateful_session/stateful_session_filter.cc +7 -7
  175. data/src/core/ext/filters/stateful_session/stateful_session_filter.h +13 -2
  176. data/src/core/ext/filters/stateful_session/stateful_session_service_config_parser.h +1 -1
  177. data/src/core/ext/transport/chttp2/client/chttp2_connector.cc +50 -37
  178. data/src/core/ext/transport/chttp2/client/chttp2_connector.h +2 -3
  179. data/src/core/ext/transport/chttp2/server/chttp2_server.cc +15 -17
  180. data/src/core/ext/transport/chttp2/server/chttp2_server.h +1 -2
  181. data/src/core/ext/transport/chttp2/transport/bin_decoder.cc +2 -2
  182. data/src/core/ext/transport/chttp2/transport/chttp2_transport.cc +210 -60
  183. data/src/core/ext/transport/chttp2/transport/chttp2_transport.h +10 -2
  184. data/src/core/ext/transport/chttp2/transport/flow_control.cc +39 -4
  185. data/src/core/ext/transport/chttp2/transport/flow_control.h +213 -78
  186. data/src/core/ext/transport/chttp2/transport/flow_control_manager.h +46 -1
  187. data/src/core/ext/transport/chttp2/transport/frame.cc +147 -21
  188. data/src/core/ext/transport/chttp2/transport/frame.h +44 -10
  189. data/src/core/ext/transport/chttp2/transport/frame_data.cc +2 -2
  190. data/src/core/ext/transport/chttp2/transport/frame_data.h +1 -1
  191. data/src/core/ext/transport/chttp2/transport/frame_goaway.cc +2 -2
  192. data/src/core/ext/transport/chttp2/transport/frame_ping.cc +4 -4
  193. data/src/core/ext/transport/chttp2/transport/frame_rst_stream.cc +5 -5
  194. data/src/core/ext/transport/chttp2/transport/frame_security.cc +1 -1
  195. data/src/core/ext/transport/chttp2/transport/frame_settings.cc +7 -15
  196. data/src/core/ext/transport/chttp2/transport/frame_window_update.cc +3 -3
  197. data/src/core/ext/transport/chttp2/transport/goaway.cc +129 -0
  198. data/src/core/ext/transport/chttp2/transport/goaway.h +350 -0
  199. data/src/core/ext/transport/chttp2/transport/header_assembler.h +175 -51
  200. data/src/core/ext/transport/chttp2/transport/hpack_encoder.cc +1 -1
  201. data/src/core/ext/transport/chttp2/transport/hpack_encoder.h +4 -4
  202. data/src/core/ext/transport/chttp2/transport/hpack_parse_result.cc +1 -1
  203. data/src/core/ext/transport/chttp2/transport/hpack_parse_result.h +3 -3
  204. data/src/core/ext/transport/chttp2/transport/hpack_parser.cc +7 -7
  205. data/src/core/ext/transport/chttp2/transport/hpack_parser.h +4 -4
  206. data/src/core/ext/transport/chttp2/transport/hpack_parser_table.cc +4 -4
  207. data/src/core/ext/transport/chttp2/transport/hpack_parser_table.h +1 -1
  208. data/src/core/ext/transport/chttp2/transport/http2_client_transport.cc +1177 -511
  209. data/src/core/ext/transport/chttp2/transport/http2_client_transport.h +264 -174
  210. data/src/core/ext/transport/chttp2/transport/http2_settings.cc +1 -1
  211. data/src/core/ext/transport/chttp2/transport/http2_settings.h +6 -4
  212. data/src/core/ext/transport/chttp2/transport/http2_settings_manager.cc +4 -6
  213. data/src/core/ext/transport/chttp2/transport/http2_settings_manager.h +6 -16
  214. data/src/core/ext/transport/chttp2/transport/http2_settings_promises.h +320 -82
  215. data/src/core/ext/transport/chttp2/transport/http2_status.h +7 -1
  216. data/src/core/ext/transport/chttp2/transport/http2_transport.cc +286 -7
  217. data/src/core/ext/transport/chttp2/transport/http2_transport.h +187 -19
  218. data/src/core/ext/transport/chttp2/transport/http2_ztrace_collector.h +57 -1
  219. data/src/core/ext/transport/chttp2/transport/incoming_metadata_tracker.h +128 -0
  220. data/src/core/ext/transport/chttp2/transport/internal.h +25 -5
  221. data/src/core/ext/transport/chttp2/transport/keepalive.cc +12 -5
  222. data/src/core/ext/transport/chttp2/transport/keepalive.h +14 -10
  223. data/src/core/ext/transport/chttp2/transport/message_assembler.h +24 -15
  224. data/src/core/ext/transport/chttp2/transport/parsing.cc +8 -8
  225. data/src/core/ext/transport/chttp2/transport/ping_callbacks.cc +1 -1
  226. data/src/core/ext/transport/chttp2/transport/ping_callbacks.h +3 -3
  227. data/src/core/ext/transport/chttp2/transport/ping_promise.cc +11 -5
  228. data/src/core/ext/transport/chttp2/transport/ping_promise.h +7 -3
  229. data/src/core/ext/transport/chttp2/transport/ping_rate_policy.cc +1 -1
  230. data/src/core/ext/transport/chttp2/transport/security_frame.cc +31 -0
  231. data/src/core/ext/transport/chttp2/transport/security_frame.h +32 -0
  232. data/src/core/ext/transport/chttp2/transport/stream.h +139 -59
  233. data/src/core/ext/transport/chttp2/transport/stream_data_queue.h +225 -98
  234. data/src/core/ext/transport/chttp2/transport/stream_lists.cc +1 -1
  235. data/src/core/ext/transport/chttp2/transport/transport_common.cc +1 -1
  236. data/src/core/ext/transport/chttp2/transport/transport_common.h +5 -0
  237. data/src/core/ext/transport/chttp2/transport/writable_streams.h +27 -11
  238. data/src/core/ext/transport/chttp2/transport/writing.cc +3 -3
  239. data/src/core/ext/transport/inproc/inproc_transport.cc +8 -2
  240. data/src/core/ext/transport/inproc/legacy_inproc_transport.cc +8 -5
  241. data/src/core/filter/auth/auth_filters.h +7 -1
  242. data/src/core/filter/auth/client_auth_filter.cc +2 -2
  243. data/src/core/filter/auth/server_auth_filter.cc +3 -3
  244. data/src/core/filter/blackboard.h +2 -2
  245. data/src/core/filter/filter_args.h +40 -2
  246. data/src/core/handshaker/endpoint_info/endpoint_info_handshaker.cc +2 -2
  247. data/src/core/handshaker/handshaker.cc +5 -5
  248. data/src/core/handshaker/handshaker.h +2 -2
  249. data/src/core/handshaker/http_connect/http_connect_handshaker.cc +5 -5
  250. data/src/core/handshaker/http_connect/http_proxy_mapper.cc +11 -11
  251. data/src/core/handshaker/http_connect/http_proxy_mapper.h +1 -1
  252. data/src/core/handshaker/http_connect/xds_http_proxy_mapper.cc +1 -1
  253. data/src/core/handshaker/http_connect/xds_http_proxy_mapper.h +1 -1
  254. data/src/core/handshaker/proxy_mapper.h +1 -1
  255. data/src/core/handshaker/proxy_mapper_registry.h +1 -1
  256. data/src/core/handshaker/security/legacy_secure_endpoint.cc +4 -4
  257. data/src/core/handshaker/security/pipelined_secure_endpoint.cc +7 -7
  258. data/src/core/handshaker/security/secure_endpoint.cc +15 -5
  259. data/src/core/handshaker/security/security_handshaker.cc +8 -5
  260. data/src/core/handshaker/security/security_handshaker.h +1 -1
  261. data/src/core/handshaker/tcp_connect/tcp_connect_handshaker.cc +4 -4
  262. data/src/core/lib/address_utils/parse_address.cc +5 -5
  263. data/src/core/lib/address_utils/parse_address.h +2 -2
  264. data/src/core/lib/address_utils/sockaddr_utils.cc +4 -4
  265. data/src/core/lib/address_utils/sockaddr_utils.h +1 -1
  266. data/src/core/lib/channel/channel_args.cc +1 -1
  267. data/src/core/lib/channel/channel_args.h +2 -2
  268. data/src/core/lib/channel/channel_stack.cc +22 -21
  269. data/src/core/lib/channel/channel_stack.h +5 -3
  270. data/src/core/lib/channel/channel_stack_builder.cc +8 -4
  271. data/src/core/lib/channel/channel_stack_builder.h +10 -9
  272. data/src/core/lib/channel/channel_stack_builder_impl.cc +7 -13
  273. data/src/core/lib/channel/channel_stack_builder_impl.h +1 -1
  274. data/src/core/lib/channel/connected_channel.cc +2 -2
  275. data/src/core/lib/channel/promise_based_filter.cc +63 -8
  276. data/src/core/lib/channel/promise_based_filter.h +23 -8
  277. data/src/core/lib/compression/compression_internal.cc +4 -4
  278. data/src/core/lib/compression/compression_internal.h +1 -1
  279. data/src/core/lib/compression/message_compress.cc +1 -1
  280. data/src/core/lib/debug/trace.cc +2 -5
  281. data/src/core/lib/debug/trace.h +10 -0
  282. data/src/core/lib/debug/trace_flags.cc +2 -2
  283. data/src/core/lib/debug/trace_flags.h +1 -1
  284. data/src/core/lib/event_engine/ares_resolver.cc +8 -8
  285. data/src/core/lib/event_engine/ares_resolver.h +4 -4
  286. data/src/core/lib/event_engine/cf_engine/cf_engine.cc +1 -1
  287. data/src/core/lib/event_engine/cf_engine/cfstream_endpoint.cc +2 -2
  288. data/src/core/lib/event_engine/cf_engine/cfstream_endpoint.h +1 -1
  289. data/src/core/lib/event_engine/cf_engine/dns_service_resolver.cc +2 -2
  290. data/src/core/lib/event_engine/cf_engine/dns_service_resolver.h +1 -1
  291. data/src/core/lib/event_engine/channel_args_endpoint_config.h +1 -1
  292. data/src/core/lib/event_engine/default_event_engine.cc +1 -1
  293. data/src/core/lib/event_engine/event_engine.cc +1 -1
  294. data/src/core/lib/event_engine/extensions/channelz.h +1 -1
  295. data/src/core/lib/event_engine/extensions/chaotic_good_extension.h +1 -1
  296. data/src/core/lib/event_engine/extensions/tcp_trace.h +8 -1
  297. data/src/core/lib/event_engine/grpc_polled_fd.h +1 -1
  298. data/src/core/lib/event_engine/memory_allocator_factory.h +1 -1
  299. data/src/core/lib/event_engine/posix_engine/ev_epoll1_linux.cc +4 -4
  300. data/src/core/lib/event_engine/posix_engine/ev_epoll1_linux.h +5 -5
  301. data/src/core/lib/event_engine/posix_engine/ev_poll_posix.cc +5 -5
  302. data/src/core/lib/event_engine/posix_engine/ev_poll_posix.h +3 -3
  303. data/src/core/lib/event_engine/posix_engine/event_poller.h +2 -2
  304. data/src/core/lib/event_engine/posix_engine/event_poller_posix_default.cc +2 -2
  305. data/src/core/lib/event_engine/posix_engine/file_descriptor_collection.cc +1 -1
  306. data/src/core/lib/event_engine/posix_engine/file_descriptor_collection.h +1 -1
  307. data/src/core/lib/event_engine/posix_engine/grpc_polled_fd_posix.h +4 -4
  308. data/src/core/lib/event_engine/posix_engine/internal_errqueue.cc +1 -1
  309. data/src/core/lib/event_engine/posix_engine/lockfree_event.cc +1 -1
  310. data/src/core/lib/event_engine/posix_engine/lockfree_event.h +1 -1
  311. data/src/core/lib/event_engine/posix_engine/native_posix_dns_resolver.cc +3 -3
  312. data/src/core/lib/event_engine/posix_engine/native_posix_dns_resolver.h +1 -1
  313. data/src/core/lib/event_engine/posix_engine/posix_endpoint.cc +5 -5
  314. data/src/core/lib/event_engine/posix_engine/posix_endpoint.h +6 -6
  315. data/src/core/lib/event_engine/posix_engine/posix_engine.cc +7 -7
  316. data/src/core/lib/event_engine/posix_engine/posix_engine.h +7 -7
  317. data/src/core/lib/event_engine/posix_engine/posix_engine_listener.cc +7 -4
  318. data/src/core/lib/event_engine/posix_engine/posix_engine_listener.h +4 -4
  319. data/src/core/lib/event_engine/posix_engine/posix_engine_listener_utils.cc +4 -4
  320. data/src/core/lib/event_engine/posix_engine/posix_engine_listener_utils.h +1 -1
  321. data/src/core/lib/event_engine/posix_engine/posix_interface.h +1 -1
  322. data/src/core/lib/event_engine/posix_engine/posix_interface_posix.cc +5 -5
  323. data/src/core/lib/event_engine/posix_engine/posix_write_event_sink.h +1 -1
  324. data/src/core/lib/event_engine/posix_engine/tcp_socket_utils.h +1 -1
  325. data/src/core/lib/event_engine/posix_engine/timer.h +1 -1
  326. data/src/core/lib/event_engine/posix_engine/timer_manager.cc +2 -2
  327. data/src/core/lib/event_engine/posix_engine/timer_manager.h +1 -1
  328. data/src/core/lib/event_engine/posix_engine/traced_buffer_list.cc +2 -2
  329. data/src/core/lib/event_engine/posix_engine/traced_buffer_list.h +2 -2
  330. data/src/core/lib/event_engine/posix_engine/wakeup_fd_eventfd.cc +1 -1
  331. data/src/core/lib/event_engine/posix_engine/wakeup_fd_eventfd.h +2 -2
  332. data/src/core/lib/event_engine/posix_engine/wakeup_fd_pipe.cc +1 -1
  333. data/src/core/lib/event_engine/posix_engine/wakeup_fd_pipe.h +2 -2
  334. data/src/core/lib/event_engine/posix_engine/wakeup_fd_posix.h +1 -1
  335. data/src/core/lib/event_engine/posix_engine/wakeup_fd_posix_default.cc +2 -2
  336. data/src/core/lib/event_engine/posix_engine/wakeup_fd_posix_default.h +1 -1
  337. data/src/core/lib/event_engine/ref_counted_dns_resolver_interface.h +1 -1
  338. data/src/core/lib/event_engine/tcp_socket_utils.cc +4 -4
  339. data/src/core/lib/event_engine/thread_pool/thread_count.cc +1 -1
  340. data/src/core/lib/event_engine/thread_pool/thread_count.h +1 -1
  341. data/src/core/lib/event_engine/thread_pool/work_stealing_thread_pool.cc +4 -4
  342. data/src/core/lib/event_engine/thread_pool/work_stealing_thread_pool.h +3 -3
  343. data/src/core/lib/event_engine/utils.cc +3 -3
  344. data/src/core/lib/event_engine/utils.h +1 -1
  345. data/src/core/lib/event_engine/windows/grpc_polled_fd_windows.cc +1 -1
  346. data/src/core/lib/event_engine/windows/grpc_polled_fd_windows.h +2 -2
  347. data/src/core/lib/event_engine/windows/iocp.cc +1 -1
  348. data/src/core/lib/event_engine/windows/iocp.h +1 -1
  349. data/src/core/lib/event_engine/windows/native_windows_dns_resolver.cc +5 -2
  350. data/src/core/lib/event_engine/windows/win_socket.cc +1 -1
  351. data/src/core/lib/event_engine/windows/win_socket.h +2 -2
  352. data/src/core/lib/event_engine/windows/windows_endpoint.cc +5 -5
  353. data/src/core/lib/event_engine/windows/windows_engine.cc +4 -4
  354. data/src/core/lib/event_engine/windows/windows_engine.h +3 -3
  355. data/src/core/lib/event_engine/windows/windows_listener.cc +3 -3
  356. data/src/core/lib/event_engine/windows/windows_listener.h +2 -2
  357. data/src/core/lib/event_engine/work_queue/basic_work_queue.h +2 -2
  358. data/src/core/lib/experiments/config.cc +4 -4
  359. data/src/core/lib/experiments/experiments.cc +174 -48
  360. data/src/core/lib/experiments/experiments.h +76 -24
  361. data/src/core/lib/iomgr/buffer_list.cc +1 -1
  362. data/src/core/lib/iomgr/call_combiner.cc +1 -1
  363. data/src/core/lib/iomgr/call_combiner.h +2 -2
  364. data/src/core/lib/iomgr/cfstream_handle.cc +1 -1
  365. data/src/core/lib/iomgr/closure.h +2 -2
  366. data/src/core/lib/iomgr/combiner.cc +2 -2
  367. data/src/core/lib/iomgr/endpoint.h +1 -1
  368. data/src/core/lib/iomgr/endpoint_cfstream.cc +1 -1
  369. data/src/core/lib/iomgr/endpoint_pair_posix.cc +1 -1
  370. data/src/core/lib/iomgr/endpoint_pair_windows.cc +1 -1
  371. data/src/core/lib/iomgr/error.cc +1 -1
  372. data/src/core/lib/iomgr/error.h +2 -2
  373. data/src/core/lib/iomgr/error_cfstream.cc +1 -1
  374. data/src/core/lib/iomgr/ev_apple.cc +1 -1
  375. data/src/core/lib/iomgr/ev_epoll1_linux.cc +4 -4
  376. data/src/core/lib/iomgr/ev_poll_posix.cc +3 -3
  377. data/src/core/lib/iomgr/ev_posix.cc +3 -3
  378. data/src/core/lib/iomgr/event_engine_shims/closure.cc +3 -3
  379. data/src/core/lib/iomgr/event_engine_shims/closure.h +1 -1
  380. data/src/core/lib/iomgr/event_engine_shims/endpoint.cc +5 -5
  381. data/src/core/lib/iomgr/event_engine_shims/tcp_client.cc +2 -2
  382. data/src/core/lib/iomgr/exec_ctx.cc +3 -3
  383. data/src/core/lib/iomgr/exec_ctx.h +1 -1
  384. data/src/core/lib/iomgr/fork_posix.cc +1 -1
  385. data/src/core/lib/iomgr/internal_errqueue.cc +1 -1
  386. data/src/core/lib/iomgr/iocp_windows.cc +1 -1
  387. data/src/core/lib/iomgr/iomgr.cc +1 -1
  388. data/src/core/lib/iomgr/lockfree_event.cc +1 -1
  389. data/src/core/lib/iomgr/polling_entity.cc +1 -1
  390. data/src/core/lib/iomgr/resolve_address.cc +1 -1
  391. data/src/core/lib/iomgr/resolve_address.h +2 -2
  392. data/src/core/lib/iomgr/resolve_address_posix.cc +4 -4
  393. data/src/core/lib/iomgr/resolve_address_windows.cc +1 -1
  394. data/src/core/lib/iomgr/sockaddr_utils_posix.cc +1 -1
  395. data/src/core/lib/iomgr/socket_utils_common_posix.cc +2 -2
  396. data/src/core/lib/iomgr/socket_windows.cc +2 -2
  397. data/src/core/lib/iomgr/tcp_client_cfstream.cc +1 -1
  398. data/src/core/lib/iomgr/tcp_client_posix.cc +3 -3
  399. data/src/core/lib/iomgr/tcp_posix.cc +5 -5
  400. data/src/core/lib/iomgr/tcp_server_posix.cc +20 -9
  401. data/src/core/lib/iomgr/tcp_server_utils_posix.h +1 -1
  402. data/src/core/lib/iomgr/tcp_server_utils_posix_common.cc +2 -2
  403. data/src/core/lib/iomgr/tcp_server_utils_posix_ifaddrs.cc +2 -2
  404. data/src/core/lib/iomgr/tcp_server_windows.cc +2 -2
  405. data/src/core/lib/iomgr/tcp_windows.cc +1 -1
  406. data/src/core/lib/iomgr/timer_generic.cc +3 -3
  407. data/src/core/lib/iomgr/timer_manager.cc +1 -1
  408. data/src/core/lib/iomgr/unix_sockets_posix.cc +1 -1
  409. data/src/core/lib/iomgr/unix_sockets_posix.h +1 -1
  410. data/src/core/lib/iomgr/vsock.cc +1 -1
  411. data/src/core/lib/iomgr/vsock.h +1 -1
  412. data/src/core/lib/iomgr/wakeup_fd_pipe.cc +1 -1
  413. data/src/core/lib/promise/activity.cc +2 -2
  414. data/src/core/lib/promise/activity.h +5 -4
  415. data/src/core/lib/promise/all_ok.h +3 -3
  416. data/src/core/lib/promise/arena_promise.h +47 -6
  417. data/src/core/lib/promise/context.h +1 -1
  418. data/src/core/lib/promise/detail/join_state.h +1 -1
  419. data/src/core/lib/promise/detail/promise_factory.h +1 -1
  420. data/src/core/lib/promise/detail/promise_like.h +1 -1
  421. data/src/core/lib/promise/detail/seq_state.h +3 -3
  422. data/src/core/lib/promise/detail/status.h +1 -1
  423. data/src/core/lib/promise/exec_ctx_wakeup_scheduler.h +1 -1
  424. data/src/core/lib/promise/for_each.h +3 -3
  425. data/src/core/lib/promise/if.h +1 -1
  426. data/src/core/lib/promise/inter_activity_latch.h +3 -3
  427. data/src/core/lib/promise/inter_activity_mutex.h +1 -1
  428. data/src/core/lib/promise/interceptor_list.h +3 -3
  429. data/src/core/lib/promise/latch.h +2 -2
  430. data/src/core/lib/promise/loop.h +2 -2
  431. data/src/core/lib/promise/map.h +2 -2
  432. data/src/core/lib/promise/mpsc.cc +5 -4
  433. data/src/core/lib/promise/observable.h +2 -2
  434. data/src/core/lib/promise/party.cc +14 -8
  435. data/src/core/lib/promise/party.h +11 -4
  436. data/src/core/lib/promise/pipe.h +16 -2
  437. data/src/core/lib/promise/poll.h +2 -2
  438. data/src/core/lib/promise/promise.h +2 -2
  439. data/src/core/lib/promise/sleep.h +1 -1
  440. data/src/core/lib/promise/status_flag.h +2 -2
  441. data/src/core/lib/promise/try_join.h +3 -3
  442. data/src/core/lib/promise/try_seq.h +3 -3
  443. data/src/core/lib/promise/wait_set.h +2 -2
  444. data/src/core/lib/resource_quota/api.cc +1 -1
  445. data/src/core/lib/resource_quota/arena.cc +1 -1
  446. data/src/core/lib/resource_quota/connection_quota.h +1 -1
  447. data/src/core/lib/resource_quota/memory_quota.cc +3 -3
  448. data/src/core/lib/resource_quota/memory_quota.h +9 -5
  449. data/src/core/lib/resource_quota/periodic_update.h +1 -1
  450. data/src/core/lib/resource_quota/resource_quota.cc +8 -0
  451. data/src/core/lib/resource_quota/resource_quota.h +2 -1
  452. data/src/core/lib/resource_quota/stream_quota.cc +22 -0
  453. data/src/core/lib/resource_quota/stream_quota.h +31 -0
  454. data/src/core/lib/resource_quota/telemetry.h +1 -0
  455. data/src/core/lib/resource_quota/thread_quota.h +1 -1
  456. data/src/core/lib/security/authorization/audit_logging.cc +3 -3
  457. data/src/core/lib/security/authorization/audit_logging.h +1 -1
  458. data/src/core/lib/security/authorization/authorization_policy_provider.h +1 -1
  459. data/src/core/lib/security/authorization/evaluate_args.cc +5 -5
  460. data/src/core/lib/security/authorization/evaluate_args.h +1 -1
  461. data/src/core/lib/security/authorization/grpc_server_authz_filter.cc +3 -3
  462. data/src/core/lib/security/authorization/grpc_server_authz_filter.h +4 -1
  463. data/src/core/lib/security/authorization/matchers.cc +2 -2
  464. data/src/core/lib/security/authorization/stdout_logger.cc +1 -1
  465. data/src/core/lib/slice/percent_encoding.cc +1 -1
  466. data/src/core/lib/slice/slice.cc +1 -1
  467. data/src/core/lib/slice/slice.h +2 -2
  468. data/src/core/lib/slice/slice_buffer.cc +1 -1
  469. data/src/core/lib/slice/slice_internal.h +1 -1
  470. data/src/core/lib/surface/call.cc +42 -14
  471. data/src/core/lib/surface/call.h +12 -5
  472. data/src/core/lib/surface/call_log_batch.cc +2 -2
  473. data/src/core/lib/surface/call_utils.cc +5 -5
  474. data/src/core/lib/surface/call_utils.h +83 -18
  475. data/src/core/lib/surface/channel.cc +2 -1
  476. data/src/core/lib/surface/channel.h +13 -3
  477. data/src/core/lib/surface/channel_create.cc +2 -2
  478. data/src/core/lib/surface/channel_create.h +1 -1
  479. data/src/core/lib/surface/channel_init.cc +5 -5
  480. data/src/core/lib/surface/channel_init.h +4 -2
  481. data/src/core/lib/surface/completion_queue.cc +4 -4
  482. data/src/core/lib/surface/filter_stack_call.cc +13 -8
  483. data/src/core/lib/surface/filter_stack_call.h +3 -3
  484. data/src/core/lib/surface/init.cc +4 -4
  485. data/src/core/lib/surface/lame_client.cc +2 -2
  486. data/src/core/lib/surface/lame_client.h +3 -3
  487. data/src/core/lib/surface/legacy_channel.cc +3 -3
  488. data/src/core/lib/surface/legacy_channel.h +1 -1
  489. data/src/core/lib/surface/validate_metadata.cc +2 -2
  490. data/src/core/lib/surface/validate_metadata.h +1 -1
  491. data/src/core/lib/surface/version.cc +2 -2
  492. data/src/core/lib/transport/bdp_estimator.cc +1 -1
  493. data/src/core/lib/transport/bdp_estimator.h +2 -2
  494. data/src/core/lib/transport/connectivity_state.cc +1 -1
  495. data/src/core/lib/transport/connectivity_state.h +2 -2
  496. data/src/core/lib/transport/error_utils.h +1 -1
  497. data/src/core/lib/transport/promise_endpoint.cc +1 -1
  498. data/src/core/lib/transport/promise_endpoint.h +3 -3
  499. data/src/core/lib/transport/timeout_encoding.cc +1 -1
  500. data/src/core/lib/transport/transport.cc +3 -3
  501. data/src/core/lib/transport/transport.h +62 -4
  502. data/src/core/lib/transport/transport_framing_endpoint_extension.h +1 -1
  503. data/src/core/lib/transport/transport_op_string.cc +2 -2
  504. data/src/core/load_balancing/address_filtering.cc +1 -1
  505. data/src/core/load_balancing/address_filtering.h +2 -2
  506. data/src/core/load_balancing/backend_metric_parser.cc +1 -1
  507. data/src/core/load_balancing/backend_metric_parser.h +1 -1
  508. data/src/core/load_balancing/child_policy_handler.cc +4 -4
  509. data/src/core/load_balancing/child_policy_handler.h +2 -2
  510. data/src/core/load_balancing/delegating_helper.h +2 -2
  511. data/src/core/load_balancing/endpoint_list.cc +4 -4
  512. data/src/core/load_balancing/endpoint_list.h +2 -2
  513. data/src/core/load_balancing/grpclb/client_load_reporting_filter.cc +7 -5
  514. data/src/core/load_balancing/grpclb/client_load_reporting_filter.h +5 -1
  515. data/src/core/load_balancing/grpclb/grpclb.cc +13 -24
  516. data/src/core/load_balancing/grpclb/grpclb_client_stats.h +2 -2
  517. data/src/core/load_balancing/grpclb/load_balancer_api.cc +1 -1
  518. data/src/core/load_balancing/grpclb/load_balancer_api.h +1 -1
  519. data/src/core/load_balancing/health_check_client.cc +9 -5
  520. data/src/core/load_balancing/health_check_client_internal.h +3 -3
  521. data/src/core/load_balancing/lb_policy.h +11 -8
  522. data/src/core/load_balancing/lb_policy_factory.h +2 -2
  523. data/src/core/load_balancing/lb_policy_registry.cc +2 -2
  524. data/src/core/load_balancing/lb_policy_registry.h +2 -2
  525. data/src/core/load_balancing/oob_backend_metric.cc +7 -3
  526. data/src/core/load_balancing/oob_backend_metric_internal.h +2 -2
  527. data/src/core/load_balancing/outlier_detection/outlier_detection.cc +7 -15
  528. data/src/core/load_balancing/pick_first/pick_first.cc +48 -18
  529. data/src/core/load_balancing/priority/priority.cc +6 -6
  530. data/src/core/load_balancing/ring_hash/ring_hash.cc +8 -8
  531. data/src/core/load_balancing/rls/rls.cc +10 -10
  532. data/src/core/load_balancing/round_robin/round_robin.cc +7 -7
  533. data/src/core/load_balancing/subchannel_interface.h +2 -2
  534. data/src/core/load_balancing/weighted_round_robin/static_stride_scheduler.cc +1 -1
  535. data/src/core/load_balancing/weighted_round_robin/weighted_round_robin.cc +9 -15
  536. data/src/core/load_balancing/weighted_target/weighted_target.cc +9 -9
  537. data/src/core/load_balancing/xds/cds.cc +5 -5
  538. data/src/core/load_balancing/xds/xds_cluster_impl.cc +22 -39
  539. data/src/core/load_balancing/xds/xds_cluster_manager.cc +6 -6
  540. data/src/core/load_balancing/xds/xds_override_host.cc +10 -10
  541. data/src/core/load_balancing/xds/xds_override_host.h +1 -1
  542. data/src/core/load_balancing/xds/xds_wrr_locality.cc +5 -5
  543. data/src/core/resolver/dns/c_ares/dns_resolver_ares.cc +8 -8
  544. data/src/core/resolver/dns/c_ares/dns_resolver_ares.h +1 -1
  545. data/src/core/resolver/dns/c_ares/grpc_ares_ev_driver.h +1 -1
  546. data/src/core/resolver/dns/c_ares/grpc_ares_ev_driver_posix.cc +2 -2
  547. data/src/core/resolver/dns/c_ares/grpc_ares_ev_driver_windows.cc +2 -2
  548. data/src/core/resolver/dns/c_ares/grpc_ares_wrapper.cc +6 -6
  549. data/src/core/resolver/dns/c_ares/grpc_ares_wrapper.h +2 -2
  550. data/src/core/resolver/dns/dns_resolver_plugin.cc +2 -2
  551. data/src/core/resolver/dns/event_engine/event_engine_client_channel_resolver.cc +8 -8
  552. data/src/core/resolver/dns/event_engine/event_engine_client_channel_resolver.h +1 -1
  553. data/src/core/resolver/dns/event_engine/service_config_helper.cc +2 -2
  554. data/src/core/resolver/dns/native/dns_resolver.cc +7 -7
  555. data/src/core/resolver/endpoint_addresses.cc +4 -4
  556. data/src/core/resolver/endpoint_addresses.h +1 -1
  557. data/src/core/resolver/fake/fake_resolver.cc +1 -1
  558. data/src/core/resolver/fake/fake_resolver.h +3 -3
  559. data/src/core/resolver/google_c2p/google_c2p_resolver.cc +5 -5
  560. data/src/core/resolver/polling_resolver.cc +5 -5
  561. data/src/core/resolver/polling_resolver.h +1 -1
  562. data/src/core/resolver/resolver.h +2 -2
  563. data/src/core/resolver/resolver_factory.h +2 -2
  564. data/src/core/resolver/resolver_registry.cc +1 -1
  565. data/src/core/resolver/resolver_registry.h +1 -1
  566. data/src/core/resolver/sockaddr/sockaddr_resolver.cc +4 -4
  567. data/src/core/resolver/xds/xds_config.cc +1 -1
  568. data/src/core/resolver/xds/xds_config.h +3 -3
  569. data/src/core/resolver/xds/xds_dependency_manager.cc +2 -2
  570. data/src/core/resolver/xds/xds_dependency_manager.h +3 -3
  571. data/src/core/resolver/xds/xds_resolver.cc +16 -13
  572. data/src/core/resolver/xds/xds_resolver_attributes.h +1 -1
  573. data/src/core/server/add_port.cc +2 -2
  574. data/src/core/server/server.cc +9 -5
  575. data/src/core/server/server.h +8 -7
  576. data/src/core/server/server_call_tracer_filter.cc +1 -1
  577. data/src/core/server/server_call_tracer_filter.h +5 -1
  578. data/src/core/server/server_config_selector.h +2 -2
  579. data/src/core/server/server_config_selector_filter.cc +3 -3
  580. data/src/core/server/xds_channel_stack_modifier.cc +3 -2
  581. data/src/core/server/xds_channel_stack_modifier.h +1 -1
  582. data/src/core/server/xds_server_config_fetcher.cc +10 -10
  583. data/src/core/service_config/service_config.h +1 -1
  584. data/src/core/service_config/service_config_channel_arg_filter.h +4 -1
  585. data/src/core/service_config/service_config_impl.cc +3 -3
  586. data/src/core/service_config/service_config_impl.h +2 -2
  587. data/src/core/service_config/service_config_parser.h +1 -1
  588. data/src/core/telemetry/call_tracer.h +2 -2
  589. data/src/core/telemetry/default_tcp_tracer.h +3 -3
  590. data/src/core/telemetry/histogram.h +1 -1
  591. data/src/core/telemetry/instrument.cc +550 -270
  592. data/src/core/telemetry/instrument.h +301 -128
  593. data/src/core/telemetry/metrics.cc +2 -0
  594. data/src/core/telemetry/metrics.h +33 -4
  595. data/src/core/telemetry/stats.h +2 -2
  596. data/src/core/telemetry/stats_data.cc +1 -1
  597. data/src/core/telemetry/stats_data.h +2 -2
  598. data/src/core/transport/auth_context.cc +1 -1
  599. data/src/core/transport/auth_context.h +2 -1
  600. data/src/core/transport/auth_context_comparator_registry.h +1 -1
  601. data/src/core/tsi/alts/crypt/aes_gcm.cc +1 -1
  602. data/src/core/tsi/alts/frame_protector/alts_frame_protector.cc +2 -2
  603. data/src/core/tsi/alts/frame_protector/frame_handler.cc +1 -1
  604. data/src/core/tsi/alts/handshaker/alts_handshaker_client.cc +3 -3
  605. data/src/core/tsi/alts/handshaker/alts_handshaker_client.h +1 -1
  606. data/src/core/tsi/alts/handshaker/alts_tsi_handshaker.cc +9 -7
  607. data/src/core/tsi/alts/handshaker/alts_tsi_utils.cc +1 -1
  608. data/src/core/tsi/alts/handshaker/transport_security_common_api.cc +1 -1
  609. data/src/core/tsi/alts/zero_copy_frame_protector/alts_grpc_integrity_only_record_protocol.cc +1 -1
  610. data/src/core/tsi/alts/zero_copy_frame_protector/alts_grpc_privacy_integrity_record_protocol.cc +11 -3
  611. data/src/core/tsi/alts/zero_copy_frame_protector/alts_grpc_record_protocol.h +10 -0
  612. data/src/core/tsi/alts/zero_copy_frame_protector/alts_grpc_record_protocol_common.cc +9 -1
  613. data/src/core/tsi/alts/zero_copy_frame_protector/alts_grpc_record_protocol_common.h +3 -0
  614. data/src/core/tsi/alts/zero_copy_frame_protector/alts_zero_copy_grpc_protector.cc +15 -2
  615. data/src/core/tsi/fake_transport_security.cc +2 -1
  616. data/src/core/tsi/local_transport_security.cc +1 -1
  617. data/src/core/tsi/ssl/key_logging/ssl_key_logging.cc +1 -1
  618. data/src/core/tsi/ssl/key_logging/ssl_key_logging.h +1 -1
  619. data/src/core/tsi/ssl/session_cache/ssl_session_cache.cc +1 -1
  620. data/src/core/tsi/ssl/session_cache/ssl_session_openssl.cc +1 -1
  621. data/src/core/tsi/ssl_transport_security.cc +6 -6
  622. data/src/core/tsi/ssl_transport_security.h +1 -1
  623. data/src/core/tsi/ssl_transport_security_utils.cc +2 -2
  624. data/src/core/tsi/ssl_transport_security_utils.h +2 -2
  625. data/src/core/tsi/transport_security_grpc.cc +8 -0
  626. data/src/core/tsi/transport_security_grpc.h +15 -0
  627. data/src/core/util/alloc.cc +1 -1
  628. data/src/core/util/backoff.h +1 -1
  629. data/src/core/util/crash.h +1 -1
  630. data/src/core/util/dual_ref_counted.h +2 -2
  631. data/src/core/util/event_log.cc +1 -1
  632. data/src/core/util/event_log.h +3 -3
  633. data/src/core/util/gcp_metadata_query.cc +5 -5
  634. data/src/core/util/gcp_metadata_query.h +2 -2
  635. data/src/core/util/grpc_check.cc +2 -0
  636. data/src/core/util/grpc_check.h +1 -1
  637. data/src/core/util/grpc_if_nametoindex_posix.cc +1 -1
  638. data/src/core/util/grpc_if_nametoindex_unsupported.cc +1 -1
  639. data/src/core/util/http_client/format_request.cc +1 -1
  640. data/src/core/util/http_client/httpcli.cc +3 -3
  641. data/src/core/util/http_client/httpcli.h +4 -4
  642. data/src/core/util/http_client/httpcli_security_connector.cc +4 -4
  643. data/src/core/util/http_client/parser.cc +1 -1
  644. data/src/core/util/json/json_channel_args.h +1 -1
  645. data/src/core/util/json/json_object_loader.h +6 -6
  646. data/src/core/util/json/json_reader.cc +2 -2
  647. data/src/core/util/json/json_reader.h +1 -1
  648. data/src/core/util/json/json_util.h +3 -3
  649. data/src/core/util/json/json_writer.cc +1 -1
  650. data/src/core/util/latent_see.cc +45 -24
  651. data/src/core/util/latent_see.h +192 -24
  652. data/src/core/util/linux/cpu.cc +1 -1
  653. data/src/core/util/load_file.cc +1 -1
  654. data/src/core/util/load_file.h +1 -1
  655. data/src/core/util/log.cc +3 -3
  656. data/src/core/util/lru_cache.h +1 -1
  657. data/src/core/util/matchers.h +1 -1
  658. data/src/core/util/memory_usage.h +3 -3
  659. data/src/core/util/mpscq.h +1 -1
  660. data/src/core/util/notification.h +1 -1
  661. data/src/core/util/posix/cpu.cc +1 -1
  662. data/src/core/util/posix/stat.cc +2 -2
  663. data/src/core/util/posix/thd.cc +2 -2
  664. data/src/core/util/posix/tmpfile.cc +2 -2
  665. data/src/core/util/ref_counted.h +2 -2
  666. data/src/core/util/ref_counted_ptr.h +1 -1
  667. data/src/core/util/ref_counted_string.h +1 -1
  668. data/src/core/util/single_set_ptr.h +3 -1
  669. data/src/core/util/status_helper.cc +8 -8
  670. data/src/core/util/status_helper.h +1 -1
  671. data/src/core/util/string.cc +2 -2
  672. data/src/core/util/sync_abseil.cc +1 -1
  673. data/src/core/util/table.h +1 -1
  674. data/src/core/util/time.cc +1 -1
  675. data/src/core/util/time_precise.cc +1 -1
  676. data/src/core/util/unique_ptr_with_bitset.h +1 -1
  677. data/src/core/util/unique_type_name.h +1 -1
  678. data/src/core/util/upb_utils.h +6 -1
  679. data/src/core/util/validation_errors.cc +2 -2
  680. data/src/core/util/validation_errors.h +2 -3
  681. data/src/core/util/wait_for_single_owner.h +2 -2
  682. data/src/core/util/windows/directory_reader.cc +1 -1
  683. data/src/core/util/windows/stat.cc +2 -2
  684. data/src/core/util/windows/thd.cc +2 -2
  685. data/src/core/util/windows/time.cc +1 -1
  686. data/src/core/util/work_serializer.cc +3 -3
  687. data/src/core/util/work_serializer.h +2 -2
  688. data/src/core/xds/grpc/certificate_provider_store.cc +2 -2
  689. data/src/core/xds/grpc/certificate_provider_store.h +2 -2
  690. data/src/core/xds/grpc/file_watcher_certificate_provider_factory.cc +3 -3
  691. data/src/core/xds/grpc/file_watcher_certificate_provider_factory.h +1 -1
  692. data/src/core/xds/grpc/xds_audit_logger_registry.cc +3 -3
  693. data/src/core/xds/grpc/xds_audit_logger_registry.h +1 -1
  694. data/src/core/xds/grpc/xds_bootstrap_grpc.cc +7 -7
  695. data/src/core/xds/grpc/xds_bootstrap_grpc.h +2 -2
  696. data/src/core/xds/grpc/xds_certificate_provider.cc +1 -1
  697. data/src/core/xds/grpc/xds_certificate_provider.h +2 -2
  698. data/src/core/xds/grpc/xds_client_grpc.cc +5 -5
  699. data/src/core/xds/grpc/xds_client_grpc.h +2 -2
  700. data/src/core/xds/grpc/xds_cluster.cc +2 -2
  701. data/src/core/xds/grpc/xds_cluster.h +1 -1
  702. data/src/core/xds/grpc/xds_cluster_parser.cc +5 -5
  703. data/src/core/xds/grpc/xds_cluster_parser.h +1 -1
  704. data/src/core/xds/grpc/xds_cluster_specifier_plugin.cc +2 -2
  705. data/src/core/xds/grpc/xds_cluster_specifier_plugin.h +1 -1
  706. data/src/core/xds/grpc/xds_common_types.cc +1 -1
  707. data/src/core/xds/grpc/xds_common_types.h +1 -1
  708. data/src/core/xds/grpc/xds_common_types_parser.cc +5 -5
  709. data/src/core/xds/grpc/xds_endpoint.h +2 -2
  710. data/src/core/xds/grpc/xds_endpoint_parser.cc +5 -5
  711. data/src/core/xds/grpc/xds_endpoint_parser.h +1 -1
  712. data/src/core/xds/grpc/xds_health_status.cc +1 -1
  713. data/src/core/xds/grpc/xds_health_status.h +1 -1
  714. data/src/core/xds/grpc/xds_http_fault_filter.cc +4 -4
  715. data/src/core/xds/grpc/xds_http_fault_filter.h +2 -2
  716. data/src/core/xds/grpc/xds_http_filter.h +3 -3
  717. data/src/core/xds/grpc/xds_http_filter_registry.h +2 -2
  718. data/src/core/xds/grpc/xds_http_gcp_authn_filter.cc +3 -3
  719. data/src/core/xds/grpc/xds_http_gcp_authn_filter.h +2 -2
  720. data/src/core/xds/grpc/xds_http_rbac_filter.cc +4 -4
  721. data/src/core/xds/grpc/xds_http_rbac_filter.h +2 -2
  722. data/src/core/xds/grpc/xds_http_stateful_session_filter.cc +3 -3
  723. data/src/core/xds/grpc/xds_http_stateful_session_filter.h +2 -2
  724. data/src/core/xds/grpc/xds_lb_policy_registry.cc +1 -1
  725. data/src/core/xds/grpc/xds_lb_policy_registry.h +1 -1
  726. data/src/core/xds/grpc/xds_listener.cc +2 -2
  727. data/src/core/xds/grpc/xds_listener_parser.cc +6 -6
  728. data/src/core/xds/grpc/xds_listener_parser.h +1 -1
  729. data/src/core/xds/grpc/xds_matcher.cc +1 -1
  730. data/src/core/xds/grpc/xds_matcher.h +3 -3
  731. data/src/core/xds/grpc/xds_matcher_input.h +1 -1
  732. data/src/core/xds/grpc/xds_metadata.cc +1 -1
  733. data/src/core/xds/grpc/xds_metadata.h +3 -3
  734. data/src/core/xds/grpc/xds_metadata_parser.cc +2 -2
  735. data/src/core/xds/grpc/xds_route_config.cc +3 -3
  736. data/src/core/xds/grpc/xds_route_config_parser.cc +8 -8
  737. data/src/core/xds/grpc/xds_route_config_parser.h +1 -1
  738. data/src/core/xds/grpc/xds_routing.cc +4 -4
  739. data/src/core/xds/grpc/xds_routing.h +2 -2
  740. data/src/core/xds/grpc/xds_server_grpc.cc +2 -2
  741. data/src/core/xds/grpc/xds_transport_grpc.cc +1 -1
  742. data/src/core/xds/grpc/xds_transport_grpc.h +2 -2
  743. data/src/core/xds/xds_client/lrs_client.cc +3 -3
  744. data/src/core/xds/xds_client/lrs_client.h +4 -4
  745. data/src/core/xds/xds_client/xds_api.h +1 -1
  746. data/src/core/xds/xds_client/xds_backend_metric_propagation.cc +1 -1
  747. data/src/core/xds/xds_client/xds_backend_metric_propagation.h +1 -1
  748. data/src/core/xds/xds_client/xds_client.cc +8 -8
  749. data/src/core/xds/xds_client/xds_client.h +5 -5
  750. data/src/core/xds/xds_client/xds_locality.h +2 -2
  751. data/src/core/xds/xds_client/xds_resource_type.h +2 -2
  752. data/src/core/xds/xds_client/xds_resource_type_impl.h +1 -1
  753. data/src/core/xds/xds_client/xds_transport.h +2 -2
  754. data/src/ruby/ext/grpc/extconf.rb +14 -12
  755. data/src/ruby/ext/grpc/rb_call.c +0 -1
  756. data/src/ruby/ext/grpc/rb_channel_args.c +0 -1
  757. data/src/ruby/ext/grpc/rb_channel_credentials.c +0 -1
  758. data/src/ruby/ext/grpc/rb_compression_options.c +0 -1
  759. data/src/ruby/ext/grpc/rb_server_credentials.c +0 -1
  760. data/src/ruby/ext/grpc/rb_xds_channel_credentials.c +0 -1
  761. data/src/ruby/ext/grpc/rb_xds_server_credentials.c +0 -1
  762. data/src/ruby/lib/grpc/version.rb +1 -1
  763. metadata +16 -6
@@ -19,13 +19,35 @@
19
19
  #ifndef GRPC_SRC_CORE_EXT_TRANSPORT_CHTTP2_TRANSPORT_STREAM_DATA_QUEUE_H
20
20
  #define GRPC_SRC_CORE_EXT_TRANSPORT_CHTTP2_TRANSPORT_STREAM_DATA_QUEUE_H
21
21
 
22
+ #include <grpc/support/port_platform.h>
23
+
24
+ #include <algorithm>
25
+ #include <cstddef>
26
+ #include <cstdint>
27
+ #include <limits>
28
+ #include <optional>
22
29
  #include <queue>
30
+ #include <string>
31
+ #include <utility>
32
+ #include <variant>
33
+ #include <vector>
23
34
 
24
- #include "absl/log/log.h"
35
+ #include "src/core/call/message.h"
36
+ #include "src/core/ext/transport/chttp2/transport/frame.h"
25
37
  #include "src/core/ext/transport/chttp2/transport/header_assembler.h"
38
+ #include "src/core/ext/transport/chttp2/transport/hpack_encoder.h"
39
+ #include "src/core/ext/transport/chttp2/transport/http2_status.h"
26
40
  #include "src/core/ext/transport/chttp2/transport/message_assembler.h"
27
41
  #include "src/core/ext/transport/chttp2/transport/transport_common.h"
42
+ #include "src/core/lib/promise/activity.h"
43
+ #include "src/core/lib/promise/context.h"
44
+ #include "src/core/lib/promise/poll.h"
45
+ #include "src/core/lib/slice/slice_buffer.h"
28
46
  #include "src/core/util/grpc_check.h"
47
+ #include "src/core/util/ref_counted.h"
48
+ #include "src/core/util/sync.h"
49
+ #include "absl/log/log.h"
50
+ #include "absl/status/status.h"
29
51
 
30
52
  namespace grpc_core {
31
53
  namespace http2 {
@@ -50,7 +72,7 @@ class SimpleQueue {
50
72
  // with tokens = 0. Enqueues with tokens = 0 are primarily for sending
51
73
  // metadata as flow control does not apply to them. This function is NOT
52
74
  // thread safe.
53
- Poll<absl::StatusOr<bool>> Enqueue(T& data, const uint32_t tokens) {
75
+ Poll<bool> Enqueue(T& data, const uint32_t tokens) {
54
76
  return PollEnqueue(data, tokens);
55
77
  }
56
78
 
@@ -81,8 +103,13 @@ class SimpleQueue {
81
103
  // Clears the queue. This function is NOT thread safe.
82
104
  void Clear() { std::queue<Entry>().swap(queue_); }
83
105
 
106
+ inline std::optional<uint32_t> GetNextEntryTokens() const {
107
+ return queue_.empty() ? std::nullopt
108
+ : std::make_optional(queue_.front().tokens);
109
+ }
110
+
84
111
  private:
85
- Poll<absl::StatusOr<bool>> PollEnqueue(T& data, const uint32_t tokens) {
112
+ Poll<bool> PollEnqueue(T& data, const uint32_t tokens) {
86
113
  GRPC_STREAM_DATA_QUEUE_DEBUG << "Enqueueing data. Data tokens: " << tokens;
87
114
  const uint32_t max_tokens_consumed_threshold =
88
115
  max_tokens_ >= tokens ? max_tokens_ - tokens : 0;
@@ -93,7 +120,7 @@ class SimpleQueue {
93
120
  GRPC_STREAM_DATA_QUEUE_DEBUG
94
121
  << "Enqueue successful. Data tokens: " << tokens
95
122
  << " Current tokens consumed: " << tokens_consumed_;
96
- return /*became_non_empty*/ (queue_.size() == 1);
123
+ return /*became_non_empty=*/(queue_.size() == 1);
97
124
  }
98
125
 
99
126
  GRPC_STREAM_DATA_QUEUE_DEBUG
@@ -106,6 +133,11 @@ class SimpleQueue {
106
133
 
107
134
  inline absl::StatusOr<bool> ImmediateEnqueueInternal(T data,
108
135
  const uint32_t tokens) {
136
+ GRPC_DCHECK_LE(tokens_consumed_,
137
+ std::numeric_limits<uint32_t>::max() - tokens);
138
+ if (tokens_consumed_ > std::numeric_limits<uint32_t>::max() - tokens) {
139
+ return absl::InternalError("Tokens consumed overflowed.");
140
+ }
109
141
  tokens_consumed_ += tokens;
110
142
  queue_.emplace(Entry{std::move(data), tokens});
111
143
  GRPC_STREAM_DATA_QUEUE_DEBUG
@@ -170,18 +202,12 @@ class SimpleQueue {
170
202
  template <typename MetadataHandle>
171
203
  class StreamDataQueue : public RefCounted<StreamDataQueue<MetadataHandle>> {
172
204
  public:
173
- explicit StreamDataQueue(const bool is_client, const uint32_t stream_id,
174
- const uint32_t queue_size,
175
- bool allow_true_binary_metadata)
176
- : stream_id_(stream_id),
205
+ explicit StreamDataQueue(const bool is_client, const uint32_t queue_size)
206
+ : stream_id_(0),
177
207
  is_client_(is_client),
178
208
  queue_(queue_size),
179
- initial_metadata_disassembler_(stream_id,
180
- /*is_trailing_metadata=*/false,
181
- allow_true_binary_metadata),
182
- trailing_metadata_disassembler_(stream_id,
183
- /*is_trailing_metadata=*/true,
184
- allow_true_binary_metadata) {};
209
+ initial_metadata_disassembler_(/*is_trailing_metadata=*/false),
210
+ trailing_metadata_disassembler_(/*is_trailing_metadata=*/true) {};
185
211
  ~StreamDataQueue() = default;
186
212
 
187
213
  StreamDataQueue(StreamDataQueue&& rhs) = delete;
@@ -189,6 +215,17 @@ class StreamDataQueue : public RefCounted<StreamDataQueue<MetadataHandle>> {
189
215
  StreamDataQueue(const StreamDataQueue&) = delete;
190
216
  StreamDataQueue& operator=(const StreamDataQueue&) = delete;
191
217
 
218
+ void SetStreamId(const uint32_t stream_id,
219
+ const bool allow_true_binary_metadata_peer) {
220
+ GRPC_DCHECK_EQ(stream_id_, 0u);
221
+ GRPC_DCHECK_NE(stream_id, 0u);
222
+ stream_id_ = stream_id;
223
+ initial_metadata_disassembler_.Initialize(stream_id,
224
+ allow_true_binary_metadata_peer);
225
+ trailing_metadata_disassembler_.Initialize(stream_id,
226
+ allow_true_binary_metadata_peer);
227
+ }
228
+
192
229
  //////////////////////////////////////////////////////////////////////////////
193
230
  // Enqueue Helpers
194
231
  // These enqueue helpers are based on following assumptions:
@@ -206,7 +243,7 @@ class StreamDataQueue : public RefCounted<StreamDataQueue<MetadataHandle>> {
206
243
  // end_stream set. If the stream needs to be half closed, the client should
207
244
  // enqueue a half close message.
208
245
 
209
- struct EnqueueResult {
246
+ struct StreamWritabilityUpdate {
210
247
  bool became_writable;
211
248
  WritableStreamPriority priority;
212
249
  };
@@ -216,7 +253,7 @@ class StreamDataQueue : public RefCounted<StreamDataQueue<MetadataHandle>> {
216
253
  // 2. This MUST be called before any messages are enqueued.
217
254
  // 3. MUST not be called after trailing metadata is enqueued.
218
255
  // 4. This function is thread safe.
219
- absl::StatusOr<EnqueueResult> EnqueueInitialMetadata(
256
+ absl::StatusOr<StreamWritabilityUpdate> EnqueueInitialMetadata(
220
257
  MetadataHandle&& metadata) {
221
258
  MutexLock lock(&mu_);
222
259
  GRPC_DCHECK(!is_initial_metadata_queued_);
@@ -229,11 +266,11 @@ class StreamDataQueue : public RefCounted<StreamDataQueue<MetadataHandle>> {
229
266
  QueueEntry{InitialMetadataType{std::move(metadata)}}, /*tokens=*/0);
230
267
  if (GPR_UNLIKELY(!result.ok())) {
231
268
  GRPC_STREAM_DATA_QUEUE_DEBUG
232
- << "Immediate enqueueing initial metadata for stream " << stream_id_
233
- << " failed with status: " << result.status();
269
+ << "Immediate enqueueing initial metadata failed with status: "
270
+ << result.status();
234
271
  return result.status();
235
272
  }
236
- return UpdateWritableStateLocked(
273
+ return UpdateWritableStateAndPriorityEnqueueLocked(
237
274
  /*became_non_empty*/ result.value(), WritableStreamPriority::kDefault);
238
275
  }
239
276
 
@@ -241,7 +278,7 @@ class StreamDataQueue : public RefCounted<StreamDataQueue<MetadataHandle>> {
241
278
  // 1. MUST be called at most once.
242
279
  // 2. MUST be called only for a server.
243
280
  // 3. This function is thread safe.
244
- absl::StatusOr<EnqueueResult> EnqueueTrailingMetadata(
281
+ absl::StatusOr<StreamWritabilityUpdate> EnqueueTrailingMetadata(
245
282
  MetadataHandle&& metadata) {
246
283
  MutexLock lock(&mu_);
247
284
  GRPC_DCHECK(metadata != nullptr);
@@ -249,10 +286,9 @@ class StreamDataQueue : public RefCounted<StreamDataQueue<MetadataHandle>> {
249
286
  GRPC_DCHECK(!is_trailing_metadata_or_half_close_queued_);
250
287
 
251
288
  if (GPR_UNLIKELY(IsEnqueueClosed())) {
252
- GRPC_STREAM_DATA_QUEUE_DEBUG << "Enqueue closed for stream "
253
- << stream_id_;
254
- return EnqueueResult{/*became_writable=*/false,
255
- WritableStreamPriority::kStreamClosed};
289
+ GRPC_STREAM_DATA_QUEUE_DEBUG << "Enqueue closed.";
290
+ return StreamWritabilityUpdate{/*became_writable=*/false,
291
+ WritableStreamPriority::kStreamClosed};
256
292
  }
257
293
 
258
294
  is_trailing_metadata_or_half_close_queued_ = true;
@@ -260,11 +296,11 @@ class StreamDataQueue : public RefCounted<StreamDataQueue<MetadataHandle>> {
260
296
  QueueEntry{TrailingMetadataType{std::move(metadata)}}, /*tokens=*/0);
261
297
  if (GPR_UNLIKELY(!result.ok())) {
262
298
  GRPC_STREAM_DATA_QUEUE_DEBUG
263
- << "Immediate enqueueing trailing metadata for stream " << stream_id_
264
- << " failed with status: " << result.status();
299
+ << "Immediate enqueueing trailing metadata failed with status: "
300
+ << result.status();
265
301
  return result.status();
266
302
  }
267
- return UpdateWritableStateLocked(
303
+ return UpdateWritableStateAndPriorityEnqueueLocked(
268
304
  /*became_non_empty*/ result.value(),
269
305
  WritableStreamPriority::kStreamClosed);
270
306
  }
@@ -285,26 +321,22 @@ class StreamDataQueue : public RefCounted<StreamDataQueue<MetadataHandle>> {
285
321
  const uint32_t tokens =
286
322
  message->payload()->Length() + kGrpcHeaderSizeInBytes;
287
323
  return [self = this->Ref(), entry = QueueEntry{std::move(message)},
288
- tokens]() mutable -> Poll<absl::StatusOr<EnqueueResult>> {
324
+ tokens]() mutable -> Poll<absl::StatusOr<StreamWritabilityUpdate>> {
289
325
  MutexLock lock(&self->mu_);
290
326
  if (GPR_UNLIKELY(self->IsEnqueueClosed())) {
291
- GRPC_STREAM_DATA_QUEUE_DEBUG << "Enqueue closed for stream "
292
- << self->stream_id_;
293
- return EnqueueResult{/*became_writable=*/false,
294
- WritableStreamPriority::kStreamClosed};
327
+ GRPC_STREAM_DATA_QUEUE_DEBUG << "Enqueue closed";
328
+ return StreamWritabilityUpdate{/*became_writable=*/false,
329
+ WritableStreamPriority::kStreamClosed};
295
330
  }
296
- Poll<absl::StatusOr<bool>> result = self->queue_.Enqueue(entry, tokens);
331
+ Poll<bool> result = self->queue_.Enqueue(entry, tokens);
297
332
  if (result.ready()) {
298
333
  GRPC_STREAM_DATA_QUEUE_DEBUG
299
- << "Enqueued message for stream " << self->stream_id_
300
- << " with status: " << result.value().status();
301
- // TODO(akshitpatel) : [PH2][P2] : Add check for flow control tokens.
302
- if (GPR_LIKELY(result.value().ok())) {
303
- return self->UpdateWritableStateLocked(
304
- /*became_non_empty*/ result.value().value(),
305
- WritableStreamPriority::kDefault);
306
- }
307
- return result.value().status();
334
+ << "Enqueued message with tokens: " << tokens
335
+ << "became_non_empty: " << result.value();
336
+
337
+ return self->UpdateWritableStateAndPriorityEnqueueLocked(
338
+ /*became_non_empty=*/result.value(),
339
+ WritableStreamPriority::kDefault);
308
340
  }
309
341
  return Pending{};
310
342
  };
@@ -314,7 +346,7 @@ class StreamDataQueue : public RefCounted<StreamDataQueue<MetadataHandle>> {
314
346
  // 1. MUST be called at most once.
315
347
  // 2. MUST be called only for a client.
316
348
  // 3. This function is thread safe.
317
- absl::StatusOr<EnqueueResult> EnqueueHalfClosed() {
349
+ absl::StatusOr<StreamWritabilityUpdate> EnqueueHalfClosed() {
318
350
  MutexLock lock(&mu_);
319
351
  GRPC_DCHECK(is_initial_metadata_queued_);
320
352
  GRPC_DCHECK(is_client_);
@@ -322,11 +354,11 @@ class StreamDataQueue : public RefCounted<StreamDataQueue<MetadataHandle>> {
322
354
  if (GPR_UNLIKELY(IsEnqueueClosed() ||
323
355
  is_trailing_metadata_or_half_close_queued_)) {
324
356
  GRPC_STREAM_DATA_QUEUE_DEBUG
325
- << "Enqueue closed or trailing metadata/half close queued for stream "
326
- << stream_id_ << " is_trailing_metadata_or_half_close_queued_ = "
357
+ << "Enqueue closed or trailing metadata/half close queued "
358
+ << " is_trailing_metadata_or_half_close_queued_ = "
327
359
  << is_trailing_metadata_or_half_close_queued_;
328
- return EnqueueResult{/*became_writable=*/false,
329
- WritableStreamPriority::kStreamClosed};
360
+ return StreamWritabilityUpdate{/*became_writable=*/false,
361
+ WritableStreamPriority::kStreamClosed};
330
362
  }
331
363
 
332
364
  is_trailing_metadata_or_half_close_queued_ = true;
@@ -334,11 +366,11 @@ class StreamDataQueue : public RefCounted<StreamDataQueue<MetadataHandle>> {
334
366
  queue_.ImmediateEnqueue(QueueEntry{HalfClosed{}}, /*tokens=*/0);
335
367
  if (GPR_UNLIKELY(!result.ok())) {
336
368
  GRPC_STREAM_DATA_QUEUE_DEBUG
337
- << "Immediate enqueueing half closed for stream " << stream_id_
338
- << " failed with status: " << result.status();
369
+ << "Immediate enqueueing half closed failed with status: "
370
+ << result.status();
339
371
  return result.status();
340
372
  }
341
- return UpdateWritableStateLocked(
373
+ return UpdateWritableStateAndPriorityEnqueueLocked(
342
374
  /*became_non_empty*/ result.value(),
343
375
  WritableStreamPriority::kStreamClosed);
344
376
  }
@@ -346,22 +378,21 @@ class StreamDataQueue : public RefCounted<StreamDataQueue<MetadataHandle>> {
346
378
  // Enqueue Reset Stream.
347
379
  // 1. MUST be called at most once.
348
380
  // 3. This function is thread safe.
349
- absl::StatusOr<EnqueueResult> EnqueueResetStream(const uint32_t error_code) {
381
+ absl::StatusOr<StreamWritabilityUpdate> EnqueueResetStream(
382
+ const uint32_t error_code) {
350
383
  MutexLock lock(&mu_);
351
384
  GRPC_DCHECK(is_initial_metadata_queued_);
352
385
 
353
386
  // This can happen when the transport tries to close the stream and the
354
387
  // stream is cancelled from the call stack.
355
388
  if (GPR_UNLIKELY(IsEnqueueClosed())) {
356
- GRPC_STREAM_DATA_QUEUE_DEBUG << "Enqueue closed for stream "
357
- << stream_id_;
358
- return EnqueueResult{/*became_writable=*/false,
359
- WritableStreamPriority::kStreamClosed};
389
+ GRPC_STREAM_DATA_QUEUE_DEBUG << "Enqueue closed";
390
+ return StreamWritabilityUpdate{/*became_writable=*/false,
391
+ WritableStreamPriority::kStreamClosed};
360
392
  }
361
393
 
362
394
  GRPC_STREAM_DATA_QUEUE_DEBUG
363
- << "Immediate enqueueing reset stream for stream " << stream_id_
364
- << " with error code: " << error_code;
395
+ << "Immediate enqueueing reset stream with error code: " << error_code;
365
396
  reset_stream_state_ = RstStreamState::kQueued;
366
397
  reset_stream_error_code_ = error_code;
367
398
 
@@ -369,7 +400,7 @@ class StreamDataQueue : public RefCounted<StreamDataQueue<MetadataHandle>> {
369
400
  // enqueueing reset stream to the queue. In this case, if the queue is
370
401
  // empty, enqueuing reset stream to StreamDataQueue will make the stream
371
402
  // writable.
372
- return UpdateWritableStateLocked(
403
+ return UpdateWritableStateAndPriorityEnqueueLocked(
373
404
  /*became_non_empty*/ queue_.IsEmpty(),
374
405
  WritableStreamPriority::kStreamClosed);
375
406
  }
@@ -388,6 +419,7 @@ class StreamDataQueue : public RefCounted<StreamDataQueue<MetadataHandle>> {
388
419
  // Maybe not be extremely accurate but should be good enough for our
389
420
  // purposes.
390
421
  size_t total_bytes_consumed = 0u;
422
+ size_t flow_control_tokens_consumed = 0u;
391
423
  // Bitmask of the dequeue flags.
392
424
  uint8_t flags = 0u;
393
425
 
@@ -428,17 +460,19 @@ class StreamDataQueue : public RefCounted<StreamDataQueue<MetadataHandle>> {
428
460
  // This function is thread safe.
429
461
  DequeueResult DequeueFrames(const uint32_t max_fc_tokens,
430
462
  const uint32_t max_frame_length,
463
+ const uint32_t stream_fc_tokens,
431
464
  HPackCompressor& encoder,
432
465
  const bool can_send_reset_stream) {
433
466
  MutexLock lock(&mu_);
434
467
  GRPC_STREAM_DATA_QUEUE_DEBUG
435
- << "Dequeueing frames for stream " << stream_id_
436
- << " Max fc tokens: " << max_fc_tokens
468
+ << "Dequeueing frames. Max fc tokens: " << max_fc_tokens
437
469
  << " Max frame length: " << max_frame_length
438
470
  << " Message disassembler buffered length: "
439
471
  << message_disassembler_.GetBufferedLength()
440
472
  << " Can send reset stream: " << can_send_reset_stream
441
473
  << " Reset stream state: " << static_cast<uint8_t>(reset_stream_state_);
474
+ GRPC_DCHECK_GT(stream_id_, 0u)
475
+ << "Stream id must be set before dequeueing frames.";
442
476
 
443
477
  // If a reset stream is queued, we do not want to send any more frames. Any
444
478
  // metadata enqueued has not reached HPACK encoder, so it is safe to drop
@@ -465,14 +499,35 @@ class StreamDataQueue : public RefCounted<StreamDataQueue<MetadataHandle>> {
465
499
  std::visit(handle_dequeue, std::move(*queue_entry));
466
500
  }
467
501
 
468
- // TODO(akshitpatel) : [PH2][P2] : Add a check for flow control tokens.
469
- is_writable_ = false;
470
- GRPC_STREAM_DATA_QUEUE_DEBUG << "Stream id: " << stream_id_
471
- << " writable state changed to "
472
- << is_writable_;
473
- return DequeueResult{handle_dequeue.GetFrames(), is_writable_, priority_,
474
- handle_dequeue.GetTotalBytesConsumed(),
475
- handle_dequeue.GetDequeueFlags()};
502
+ GRPC_DCHECK_GE(stream_fc_tokens,
503
+ handle_dequeue.GetFlowControlTokensConsumed());
504
+
505
+ return DequeueResult{
506
+ handle_dequeue.GetFrames(),
507
+ UpdateWritableStateDequeueLocked(
508
+ stream_fc_tokens - handle_dequeue.GetFlowControlTokensConsumed()),
509
+ priority_,
510
+ handle_dequeue.GetTotalBytesConsumed(),
511
+ handle_dequeue.GetFlowControlTokensConsumed(),
512
+ handle_dequeue.GetDequeueFlags()};
513
+ }
514
+
515
+ // TODO(tjagtap) : [PH2][P1][FlowControl] : Call this while processing
516
+ // window update frame.
517
+ // Needs to be invoked when the peer sends stream flow control window update.
518
+ // stream_fc_tokens represents the stream flow control (delta) window +
519
+ // intial_window_size.
520
+ StreamWritabilityUpdate ReceivedFlowControlWindowUpdate(
521
+ const uint32_t stream_fc_tokens) {
522
+ MutexLock lock(&mu_);
523
+ GRPC_STREAM_DATA_QUEUE_DEBUG
524
+ << "Received flow control window update. stream_fc_tokens: "
525
+ << stream_fc_tokens;
526
+ const bool old_writable_state = is_writable_;
527
+ const bool new_writable_state =
528
+ UpdateWritableStateDequeueLocked(stream_fc_tokens);
529
+ return {/*became_writable=*/(!old_writable_state && new_writable_state),
530
+ priority_};
476
531
  }
477
532
 
478
533
  // Returns true if the queue is empty. This function is thread safe.
@@ -498,7 +553,8 @@ class StreamDataQueue : public RefCounted<StreamDataQueue<MetadataHandle>> {
498
553
  HPackCompressor& encoder, StreamDataQueue& queue)
499
554
  : queue_(queue),
500
555
  max_frame_length_(max_frame_length),
501
- fc_tokens_available_(max_tokens),
556
+ max_tokens_available_(max_tokens),
557
+ flow_control_tokens_consumed_(0),
502
558
  encoder_(encoder) {}
503
559
 
504
560
  void operator()(InitialMetadataType initial_metadata) {
@@ -542,6 +598,9 @@ class StreamDataQueue : public RefCounted<StreamDataQueue<MetadataHandle>> {
542
598
  }
543
599
 
544
600
  size_t GetTotalBytesConsumed() const { return total_bytes_consumed_; }
601
+ size_t GetFlowControlTokensConsumed() const {
602
+ return flow_control_tokens_consumed_;
603
+ }
545
604
  uint8_t GetDequeueFlags() const { return dequeue_flags_; }
546
605
 
547
606
  private:
@@ -586,16 +645,18 @@ class StreamDataQueue : public RefCounted<StreamDataQueue<MetadataHandle>> {
586
645
 
587
646
  inline void MaybeAppendMessageFrames() {
588
647
  while (queue_.message_disassembler_.GetBufferedLength() > 0 &&
589
- fc_tokens_available_ > 0) {
648
+ (max_tokens_available_ - flow_control_tokens_consumed_) > 0) {
590
649
  GRPC_DCHECK_EQ(
591
650
  queue_.initial_metadata_disassembler_.GetBufferedLength(), 0u);
592
651
  Http2DataFrame frame = queue_.message_disassembler_.GenerateNextFrame(
593
652
  queue_.stream_id_,
594
- std::min(fc_tokens_available_, max_frame_length_));
595
- fc_tokens_available_ -= frame.payload.Length();
653
+ std::min(max_tokens_available_ - flow_control_tokens_consumed_,
654
+ max_frame_length_));
655
+ flow_control_tokens_consumed_ += frame.payload.Length();
596
656
  GRPC_STREAM_DATA_QUEUE_DEBUG
597
657
  << "Appending message frame with length " << frame.payload.Length()
598
- << "Available tokens: " << fc_tokens_available_;
658
+ << " Consumed tokens: " << flow_control_tokens_consumed_
659
+ << " Max tokens: " << max_tokens_available_;
599
660
  AppendFrame(std::move(frame));
600
661
  }
601
662
  }
@@ -620,7 +681,8 @@ class StreamDataQueue : public RefCounted<StreamDataQueue<MetadataHandle>> {
620
681
 
621
682
  StreamDataQueue& queue_;
622
683
  const uint32_t max_frame_length_;
623
- uint32_t fc_tokens_available_;
684
+ const uint32_t max_tokens_available_;
685
+ uint32_t flow_control_tokens_consumed_;
624
686
  uint32_t error_code_ = static_cast<uint32_t>(Http2ErrorCode::kNoError);
625
687
  std::vector<Http2Frame> frames_;
626
688
  HPackCompressor& encoder_;
@@ -628,28 +690,83 @@ class StreamDataQueue : public RefCounted<StreamDataQueue<MetadataHandle>> {
628
690
  uint8_t dequeue_flags_ = 0u;
629
691
  };
630
692
 
631
- // Updates the stream priority. Also sets the writable state to true if the
632
- // stream has become writable. Returns if the stream became writable and
633
- // updated priority. It is expected that the caller will hold the lock on the
634
- // queue when calling this function.
635
- EnqueueResult UpdateWritableStateLocked(const bool became_non_empty,
636
- const WritableStreamPriority priority)
693
+ // Updates the writable state and priority of the stream. MUST only be called
694
+ // from the enqueue functions.
695
+ // became_non_empty: True if the queue was empty and became non-empty as a
696
+ // result of this enqueue operation.
697
+ // priority: The new priority of the stream after this enqueue operation.
698
+ // Returns the result of the enqueue operation
699
+ //
700
+ // High level flow:
701
+ // Priority is simply updated to the new priority.
702
+ // Writable state is updated as follows:
703
+ // 1. If the stream was not writable before and became non-empty as a result
704
+ // of this enqueue operation, then the stream is marked as writable.
705
+ // 2. If the stream was already writable before, it remains writable.
706
+ // 3. The case where the stream was not writable before and the queue already
707
+ // contained data implies that the stream is blocked on stream flow control
708
+ // tokens. When the transport receives stream flow control window update,
709
+ // the stream is marked as writable.
710
+ // For enqueue operations there is no easy way to query
711
+ // stream_flow_control_tokens. So it is assumed that flow control tokens are
712
+ // always available for an enqueue operation. This can cause a stream to be
713
+ // marked as writable when it is not but this will correct itself in the next
714
+ // dequeue operation (which returns an accurate is_writable).
715
+ StreamWritabilityUpdate UpdateWritableStateAndPriorityEnqueueLocked(
716
+ const bool became_non_empty, const WritableStreamPriority priority)
637
717
  ABSL_EXCLUSIVE_LOCKS_REQUIRED(mu_) {
718
+ // Update priority.
638
719
  priority_ = priority;
720
+
721
+ // Update writable state.
639
722
  if (!is_writable_ && became_non_empty) {
640
723
  is_writable_ = true;
641
724
  GRPC_STREAM_DATA_QUEUE_DEBUG
642
- << "UpdateWritableStateLocked for stream id: " << stream_id_
643
- << " became writable with priority: "
725
+ << "UpdateWritableStateLocked became writable with priority: "
644
726
  << GetWritableStreamPriorityString(priority_);
645
- return EnqueueResult{/*became_writable=*/true, priority_};
727
+ return StreamWritabilityUpdate{/*became_writable=*/true, priority_};
646
728
  }
647
729
 
648
730
  GRPC_STREAM_DATA_QUEUE_DEBUG
649
- << "UpdateWritableStateLocked for stream id: " << stream_id_
650
- << " with priority: " << GetWritableStreamPriorityString(priority_)
731
+ << "UpdateWritableStateAndPriorityEnqueueLocked with priority: "
732
+ << GetWritableStreamPriorityString(priority_)
651
733
  << " is_writable: " << is_writable_;
652
- return EnqueueResult{/*became_writable=*/false, priority_};
734
+ return StreamWritabilityUpdate{/*became_writable=*/false, priority_};
735
+ }
736
+
737
+ // Updates the writable state of the stream. Returns true if the
738
+ // stream became writable.
739
+ // Writable state is updated as follows:
740
+ // 1. If the next message to dequeue is a grpc message, then the stream is
741
+ // writable if and only if we have available stream flow control tokens.
742
+ // 2. If the next message to dequeue is not a grpc message, then the stream is
743
+ // writable if and only if the queue is not empty.
744
+ // Unlike UpdateWritableStateAndPriorityEnqueueLocked, this function the
745
+ // become_writable returned by this function is `accurate` as it considers
746
+ // the whether the stream has bytes to write and the flow control tokens
747
+ // available.
748
+ bool UpdateWritableStateDequeueLocked(
749
+ const uint32_t available_stream_fc_tokens)
750
+ ABSL_EXCLUSIVE_LOCKS_REQUIRED(mu_) {
751
+ // The stream is writable if the queue is not empty. If the next bytes to
752
+ // write are part of a gRPC message, then check if we have stream flow
753
+ // control tokens.
754
+ is_writable_ = (!queue_.IsEmpty());
755
+
756
+ // Next bytes to write are part of a gRPC message.
757
+ if (message_disassembler_.GetBufferedLength() > 0 ||
758
+ IsNextQueueEntryMessage()) {
759
+ is_writable_ = (available_stream_fc_tokens > 0);
760
+ }
761
+
762
+ GRPC_STREAM_DATA_QUEUE_DEBUG << "UpdateWritableStateLocked with priority: "
763
+ << GetWritableStreamPriorityString(priority_)
764
+ << " is_writable: " << is_writable_;
765
+ return is_writable_;
766
+ }
767
+
768
+ inline bool IsNextQueueEntryMessage() const {
769
+ return (!queue_.IsEmpty() && queue_.GetNextEntryTokens().value() > 0);
653
770
  }
654
771
 
655
772
  // Handles the case where a reset stream is queued.
@@ -661,17 +778,17 @@ class StreamDataQueue : public RefCounted<StreamDataQueue<MetadataHandle>> {
661
778
  switch (reset_stream_state_) {
662
779
  case RstStreamState::kDequeued:
663
780
  GRPC_STREAM_DATA_QUEUE_DEBUG
664
- << "Reset stream is already dequeued for stream " << stream_id_
665
- << ". Returning empty frames.";
781
+ << "Reset stream is already dequeued. Returning empty frames.";
666
782
  GRPC_DCHECK(queue_.IsEmpty());
667
783
  is_writable_ = false;
668
- return DequeueResult{std::vector<Http2Frame>(), is_writable_, priority_,
669
- /*total_bytes_consumed=*/0u, /*flags=*/0u};
784
+ return DequeueResult{
785
+ std::vector<Http2Frame>(), is_writable_, priority_,
786
+ /*total_bytes_consumed=*/0u,
787
+ /*flow_control_tokens_consumed=*/0u, /*flags=*/0u};
670
788
  case RstStreamState::kQueued: {
671
789
  GRPC_STREAM_DATA_QUEUE_DEBUG
672
790
  << "Reset stream is queued. Skipping all frames (if any) for "
673
- "dequeuing "
674
- << stream_id_;
791
+ "dequeuing.";
675
792
  is_writable_ = false;
676
793
  std::vector<Http2Frame> frames;
677
794
  uint8_t flags = 0u;
@@ -682,14 +799,19 @@ class StreamDataQueue : public RefCounted<StreamDataQueue<MetadataHandle>> {
682
799
  }
683
800
  queue_.Clear();
684
801
  reset_stream_state_ = RstStreamState::kDequeued;
685
- return DequeueResult{std::move(frames), is_writable_, priority_,
686
- /*total_bytes_consumed=*/0u, flags};
802
+ return DequeueResult{std::move(frames),
803
+ is_writable_,
804
+ priority_,
805
+ /*total_bytes_consumed=*/0u,
806
+ /*flow_control_tokens_consumed=*/0u,
807
+ flags};
687
808
  }
688
809
  case RstStreamState::kNotQueued:
689
810
  return std::nullopt;
690
811
  default:
691
812
  GRPC_CHECK(false) << "Invalid reset stream state: "
692
813
  << static_cast<uint8_t>(reset_stream_state_);
814
+ return std::nullopt;
693
815
  }
694
816
  }
695
817
 
@@ -701,18 +823,19 @@ class StreamDataQueue : public RefCounted<StreamDataQueue<MetadataHandle>> {
701
823
  case RstStreamState::kDequeued:
702
824
  // This can happen when the transport tries to close the stream and the
703
825
  // stream is cancelled from the call stack.
704
- GRPC_STREAM_DATA_QUEUE_DEBUG
705
- << "Reset stream already queued for stream " << stream_id_;
826
+ GRPC_STREAM_DATA_QUEUE_DEBUG << "Reset stream already queued.";
706
827
  return true;
707
828
  default:
708
829
  GRPC_CHECK(false) << "Invalid reset stream state: "
709
830
  << static_cast<uint8_t>(reset_stream_state_);
710
831
  }
711
832
 
712
- GPR_UNREACHABLE_CODE("Invalid reset stream state");
833
+ GPR_UNREACHABLE_CODE(return false);
713
834
  }
714
835
 
715
- const uint32_t stream_id_;
836
+ uint32_t stream_id_;
837
+
838
+ // This is only used for DCHECKs. Not actually used for any business logic.
716
839
  const bool is_client_;
717
840
 
718
841
  enum class RstStreamState : uint8_t {
@@ -727,6 +850,10 @@ class StreamDataQueue : public RefCounted<StreamDataQueue<MetadataHandle>> {
727
850
 
728
851
  // Access both during enqueue and dequeue.
729
852
  Mutex mu_;
853
+ // This variable tracks whether the stream is writable. 'Writable' represents
854
+ // that the stream has bytes to send and the stream has flow control tokens
855
+ // (if needed) to send them. This variable also has 1-1 correspondence with
856
+ // whether the stream is in the list of writable streams in the transport.
730
857
  bool is_writable_ ABSL_GUARDED_BY(mu_) = false;
731
858
  RstStreamState reset_stream_state_ ABSL_GUARDED_BY(mu_) =
732
859
  RstStreamState::kNotQueued;
@@ -20,13 +20,13 @@
20
20
 
21
21
  #include <grpc/support/port_platform.h>
22
22
 
23
- #include "absl/log/log.h"
24
23
  #include "src/core/ext/transport/chttp2/transport/internal.h"
25
24
  #include "src/core/ext/transport/chttp2/transport/legacy_frame.h"
26
25
  #include "src/core/lib/debug/trace.h"
27
26
  #include "src/core/lib/experiments/experiments.h"
28
27
  #include "src/core/util/bitset.h"
29
28
  #include "src/core/util/grpc_check.h"
29
+ #include "absl/log/log.h"
30
30
 
31
31
  static const char* stream_list_id_string(grpc_chttp2_stream_list_id id) {
32
32
  switch (id) {
@@ -20,9 +20,9 @@
20
20
 
21
21
  #include <cstdint>
22
22
 
23
- #include "absl/random/random.h"
24
23
  #include "src/core/util/shared_bit_gen.h"
25
24
  #include "src/core/util/time.h"
25
+ #include "absl/random/random.h"
26
26
 
27
27
  namespace grpc_core {
28
28
 
@@ -44,6 +44,11 @@
44
44
  #define GRPC_ARG_MAX_CONCURRENT_STREAMS_REJECT_ON_CLIENT \
45
45
  "grpc.http.max_concurrent_streams_reject_on_client"
46
46
 
47
+ #define KEEPALIVE_TIME_BACKOFF_MULTIPLIER 2
48
+
49
+ #define GRPC_CHTTP2_PING_TIMEOUT_STR "ping timeout"
50
+ #define GRPC_CHTTP2_KEEPALIVE_TIMEOUT_STR "keepalive timeout"
51
+
47
52
  namespace grpc_core {
48
53
 
49
54
  Duration TarpitDuration(int min_tarpit_duration_ms, int max_tarpit_duration_ms);