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
@@ -19,12 +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/check.h"
25
- #include "absl/log/log.h"
35
+ #include "src/core/call/message.h"
36
+ #include "src/core/ext/transport/chttp2/transport/frame.h"
26
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"
27
40
  #include "src/core/ext/transport/chttp2/transport/message_assembler.h"
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"
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"
28
51
 
29
52
  namespace grpc_core {
30
53
  namespace http2 {
@@ -36,11 +59,6 @@ namespace http2 {
36
59
  template <typename T>
37
60
  class SimpleQueue {
38
61
  public:
39
- struct EnqueueResult {
40
- absl::Status status;
41
- bool became_non_empty;
42
- };
43
-
44
62
  explicit SimpleQueue(const uint32_t max_tokens) : max_tokens_(max_tokens) {}
45
63
  SimpleQueue(SimpleQueue&& rhs) = delete;
46
64
  SimpleQueue& operator=(SimpleQueue&& rhs) = delete;
@@ -54,10 +72,14 @@ class SimpleQueue {
54
72
  // with tokens = 0. Enqueues with tokens = 0 are primarily for sending
55
73
  // metadata as flow control does not apply to them. This function is NOT
56
74
  // thread safe.
57
- auto Enqueue(T& data, const uint32_t tokens) {
75
+ Poll<bool> Enqueue(T& data, const uint32_t tokens) {
58
76
  return PollEnqueue(data, tokens);
59
77
  }
60
78
 
79
+ absl::StatusOr<bool> ImmediateEnqueue(T data, const uint32_t tokens) {
80
+ return ImmediateEnqueueInternal(std::move(data), tokens);
81
+ }
82
+
61
83
  // Sync function to dequeue the next entry. Returns nullopt if the queue is
62
84
  // empty or if the front of the queue has more tokens than
63
85
  // allowed_dequeue_tokens. When allow_oversized_dequeue parameter is set to
@@ -77,10 +99,17 @@ class SimpleQueue {
77
99
  }
78
100
 
79
101
  // Returns true if the queue is empty. This function is NOT thread safe.
80
- bool TestOnlyIsEmpty() const { return IsEmpty(); }
102
+ bool IsEmpty() const { return queue_.empty(); }
103
+ // Clears the queue. This function is NOT thread safe.
104
+ void Clear() { std::queue<Entry>().swap(queue_); }
105
+
106
+ inline std::optional<uint32_t> GetNextEntryTokens() const {
107
+ return queue_.empty() ? std::nullopt
108
+ : std::make_optional(queue_.front().tokens);
109
+ }
81
110
 
82
111
  private:
83
- Poll<EnqueueResult> PollEnqueue(T& data, const uint32_t tokens) {
112
+ Poll<bool> PollEnqueue(T& data, const uint32_t tokens) {
84
113
  GRPC_STREAM_DATA_QUEUE_DEBUG << "Enqueueing data. Data tokens: " << tokens;
85
114
  const uint32_t max_tokens_consumed_threshold =
86
115
  max_tokens_ >= tokens ? max_tokens_ - tokens : 0;
@@ -91,8 +120,7 @@ class SimpleQueue {
91
120
  GRPC_STREAM_DATA_QUEUE_DEBUG
92
121
  << "Enqueue successful. Data tokens: " << tokens
93
122
  << " Current tokens consumed: " << tokens_consumed_;
94
- return EnqueueResult{absl::OkStatus(),
95
- /*became_non_empty=*/queue_.size() == 1};
123
+ return /*became_non_empty=*/(queue_.size() == 1);
96
124
  }
97
125
 
98
126
  GRPC_STREAM_DATA_QUEUE_DEBUG
@@ -103,6 +131,21 @@ class SimpleQueue {
103
131
  return Pending{};
104
132
  }
105
133
 
134
+ inline absl::StatusOr<bool> ImmediateEnqueueInternal(T data,
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
+ }
141
+ tokens_consumed_ += tokens;
142
+ queue_.emplace(Entry{std::move(data), tokens});
143
+ GRPC_STREAM_DATA_QUEUE_DEBUG
144
+ << "Immediate enqueue successful. Data tokens: " << tokens
145
+ << " Current tokens consumed: " << tokens_consumed_;
146
+ return /*became_non_empty*/ (queue_.size() == 1);
147
+ }
148
+
106
149
  std::optional<T> DequeueInternal(const uint32_t allowed_dequeue_tokens,
107
150
  const bool allow_oversized_dequeue) {
108
151
  if (queue_.empty() || (queue_.front().tokens > allowed_dequeue_tokens &&
@@ -133,8 +176,6 @@ class SimpleQueue {
133
176
  return std::move(entry.data);
134
177
  }
135
178
 
136
- bool IsEmpty() const { return queue_.empty(); }
137
-
138
179
  struct Entry {
139
180
  T data;
140
181
  uint32_t tokens;
@@ -148,10 +189,10 @@ class SimpleQueue {
148
189
  // exception to this rule: if the sender tries to enqueue an item when the
149
190
  // queue has 0 tokens, the enqueue will always go through regardless of the
150
191
  // number of tokens.
151
- uint32_t max_tokens_;
192
+ const uint64_t max_tokens_;
152
193
  // The number of tokens that have been enqueued in the queue but not yet
153
194
  // dequeued.
154
- uint32_t tokens_consumed_ = 0;
195
+ uint64_t tokens_consumed_ = 0;
155
196
  Waker waker_;
156
197
  };
157
198
 
@@ -161,15 +202,12 @@ class SimpleQueue {
161
202
  template <typename MetadataHandle>
162
203
  class StreamDataQueue : public RefCounted<StreamDataQueue<MetadataHandle>> {
163
204
  public:
164
- explicit StreamDataQueue(const bool is_client, const uint32_t stream_id,
165
- const uint32_t queue_size)
166
- : stream_id_(stream_id),
205
+ explicit StreamDataQueue(const bool is_client, const uint32_t queue_size)
206
+ : stream_id_(0),
167
207
  is_client_(is_client),
168
208
  queue_(queue_size),
169
- initial_metadata_disassembler_(stream_id,
170
- /*is_trailing_metadata=*/false),
171
- trailing_metadata_disassembler_(stream_id,
172
- /*is_trailing_metadata=*/true) {};
209
+ initial_metadata_disassembler_(/*is_trailing_metadata=*/false),
210
+ trailing_metadata_disassembler_(/*is_trailing_metadata=*/true) {};
173
211
  ~StreamDataQueue() = default;
174
212
 
175
213
  StreamDataQueue(StreamDataQueue&& rhs) = delete;
@@ -177,6 +215,17 @@ class StreamDataQueue : public RefCounted<StreamDataQueue<MetadataHandle>> {
177
215
  StreamDataQueue(const StreamDataQueue&) = delete;
178
216
  StreamDataQueue& operator=(const StreamDataQueue&) = delete;
179
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
+
180
229
  //////////////////////////////////////////////////////////////////////////////
181
230
  // Enqueue Helpers
182
231
  // These enqueue helpers are based on following assumptions:
@@ -194,66 +243,66 @@ class StreamDataQueue : public RefCounted<StreamDataQueue<MetadataHandle>> {
194
243
  // end_stream set. If the stream needs to be half closed, the client should
195
244
  // enqueue a half close message.
196
245
 
246
+ struct StreamWritabilityUpdate {
247
+ bool became_writable;
248
+ WritableStreamPriority priority;
249
+ };
250
+
197
251
  // Enqueue Initial Metadata.
198
252
  // 1. MUST be called at most once.
199
253
  // 2. This MUST be called before any messages are enqueued.
200
254
  // 3. MUST not be called after trailing metadata is enqueued.
201
255
  // 4. This function is thread safe.
202
- auto EnqueueInitialMetadata(MetadataHandle metadata) {
203
- DCHECK(!is_initial_metadata_queued_);
204
- DCHECK(!is_trailing_metadata_or_half_close_queued_);
205
- DCHECK(metadata != nullptr);
206
- DCHECK(!is_reset_stream_queued_);
256
+ absl::StatusOr<StreamWritabilityUpdate> EnqueueInitialMetadata(
257
+ MetadataHandle&& metadata) {
258
+ MutexLock lock(&mu_);
259
+ GRPC_DCHECK(!is_initial_metadata_queued_);
260
+ GRPC_DCHECK(!is_trailing_metadata_or_half_close_queued_);
261
+ GRPC_DCHECK(metadata != nullptr);
262
+ GRPC_DCHECK(reset_stream_state_ == RstStreamState::kNotQueued);
207
263
 
208
264
  is_initial_metadata_queued_ = true;
209
- return [self = this->Ref(),
210
- entry = QueueEntry{InitialMetadataType{
211
- std::move(metadata)}}]() mutable -> Poll<absl::StatusOr<bool>> {
212
- MutexLock lock(&self->mu_);
213
- auto result = self->queue_.Enqueue(entry, /*tokens=*/0);
214
- if (result.ready()) {
215
- GRPC_STREAM_DATA_QUEUE_DEBUG
216
- << "Enqueued initial metadata for stream " << self->stream_id_
217
- << " with status: " << result.value().status;
218
- if (result.value().status.ok()) {
219
- DCHECK(result.value().became_non_empty);
220
- return self->UpdateWritableStateLocked(
221
- result.value().became_non_empty);
222
- }
223
- return result.value().status;
224
- }
225
- return Pending{};
226
- };
265
+ absl::StatusOr<bool> result = queue_.ImmediateEnqueue(
266
+ QueueEntry{InitialMetadataType{std::move(metadata)}}, /*tokens=*/0);
267
+ if (GPR_UNLIKELY(!result.ok())) {
268
+ GRPC_STREAM_DATA_QUEUE_DEBUG
269
+ << "Immediate enqueueing initial metadata failed with status: "
270
+ << result.status();
271
+ return result.status();
272
+ }
273
+ return UpdateWritableStateAndPriorityEnqueueLocked(
274
+ /*became_non_empty*/ result.value(), WritableStreamPriority::kDefault);
227
275
  }
228
276
 
229
277
  // Enqueue Trailing Metadata.
230
278
  // 1. MUST be called at most once.
231
279
  // 2. MUST be called only for a server.
232
280
  // 3. This function is thread safe.
233
- auto EnqueueTrailingMetadata(MetadataHandle metadata) {
234
- DCHECK(metadata != nullptr);
235
- DCHECK(!is_reset_stream_queued_);
236
- DCHECK(!is_client_);
237
- DCHECK(!is_trailing_metadata_or_half_close_queued_);
281
+ absl::StatusOr<StreamWritabilityUpdate> EnqueueTrailingMetadata(
282
+ MetadataHandle&& metadata) {
283
+ MutexLock lock(&mu_);
284
+ GRPC_DCHECK(metadata != nullptr);
285
+ GRPC_DCHECK(!is_client_);
286
+ GRPC_DCHECK(!is_trailing_metadata_or_half_close_queued_);
287
+
288
+ if (GPR_UNLIKELY(IsEnqueueClosed())) {
289
+ GRPC_STREAM_DATA_QUEUE_DEBUG << "Enqueue closed.";
290
+ return StreamWritabilityUpdate{/*became_writable=*/false,
291
+ WritableStreamPriority::kStreamClosed};
292
+ }
238
293
 
239
294
  is_trailing_metadata_or_half_close_queued_ = true;
240
- return [self = this->Ref(),
241
- entry = QueueEntry{TrailingMetadataType{
242
- std::move(metadata)}}]() mutable -> Poll<absl::StatusOr<bool>> {
243
- MutexLock lock(&self->mu_);
244
- auto result = self->queue_.Enqueue(entry, /*tokens=*/0);
245
- if (result.ready()) {
246
- GRPC_STREAM_DATA_QUEUE_DEBUG
247
- << "Enqueued trailing metadata for stream " << self->stream_id_
248
- << " with status: " << result.value().status;
249
- if (result.value().status.ok()) {
250
- return self->UpdateWritableStateLocked(
251
- result.value().became_non_empty);
252
- }
253
- return result.value().status;
254
- }
255
- return Pending{};
256
- };
295
+ absl::StatusOr<bool> result = queue_.ImmediateEnqueue(
296
+ QueueEntry{TrailingMetadataType{std::move(metadata)}}, /*tokens=*/0);
297
+ if (GPR_UNLIKELY(!result.ok())) {
298
+ GRPC_STREAM_DATA_QUEUE_DEBUG
299
+ << "Immediate enqueueing trailing metadata failed with status: "
300
+ << result.status();
301
+ return result.status();
302
+ }
303
+ return UpdateWritableStateAndPriorityEnqueueLocked(
304
+ /*became_non_empty*/ result.value(),
305
+ WritableStreamPriority::kStreamClosed);
257
306
  }
258
307
 
259
308
  // Returns a promise that resolves when the message is enqueued. There may be
@@ -261,30 +310,33 @@ class StreamDataQueue : public RefCounted<StreamDataQueue<MetadataHandle>> {
261
310
  // 1. MUST be called after initial metadata is enqueued.
262
311
  // 2. MUST not be called after trailing metadata is enqueued.
263
312
  // 3. This function is thread safe.
264
- auto EnqueueMessage(MessageHandle message) {
265
- DCHECK(is_initial_metadata_queued_);
266
- DCHECK(message != nullptr);
267
- DCHECK(!is_reset_stream_queued_);
268
- DCHECK_LE(message->payload()->Length(),
269
- std::numeric_limits<uint32_t>::max() - kGrpcHeaderSizeInBytes);
270
- DCHECK(!is_trailing_metadata_or_half_close_queued_);
313
+ auto EnqueueMessage(MessageHandle&& message) {
314
+ GRPC_DCHECK(is_initial_metadata_queued_);
315
+ GRPC_DCHECK(message != nullptr);
316
+ GRPC_DCHECK_LE(
317
+ message->payload()->Length(),
318
+ std::numeric_limits<uint32_t>::max() - kGrpcHeaderSizeInBytes);
319
+ GRPC_DCHECK(!is_trailing_metadata_or_half_close_queued_);
271
320
 
272
321
  const uint32_t tokens =
273
322
  message->payload()->Length() + kGrpcHeaderSizeInBytes;
274
323
  return [self = this->Ref(), entry = QueueEntry{std::move(message)},
275
- tokens]() mutable -> Poll<absl::StatusOr<bool>> {
324
+ tokens]() mutable -> Poll<absl::StatusOr<StreamWritabilityUpdate>> {
276
325
  MutexLock lock(&self->mu_);
277
- auto result = self->queue_.Enqueue(entry, tokens);
326
+ if (GPR_UNLIKELY(self->IsEnqueueClosed())) {
327
+ GRPC_STREAM_DATA_QUEUE_DEBUG << "Enqueue closed";
328
+ return StreamWritabilityUpdate{/*became_writable=*/false,
329
+ WritableStreamPriority::kStreamClosed};
330
+ }
331
+ Poll<bool> result = self->queue_.Enqueue(entry, tokens);
278
332
  if (result.ready()) {
279
333
  GRPC_STREAM_DATA_QUEUE_DEBUG
280
- << "Enqueued message for stream " << self->stream_id_
281
- << " with status: " << result.value().status;
282
- // TODO(akshitpatel) : [PH2][P2] : Add check for flow control tokens.
283
- if (result.value().status.ok()) {
284
- return self->UpdateWritableStateLocked(
285
- result.value().became_non_empty);
286
- }
287
- 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);
288
340
  }
289
341
  return Pending{};
290
342
  };
@@ -294,66 +346,97 @@ class StreamDataQueue : public RefCounted<StreamDataQueue<MetadataHandle>> {
294
346
  // 1. MUST be called at most once.
295
347
  // 2. MUST be called only for a client.
296
348
  // 3. This function is thread safe.
297
- auto EnqueueHalfClosed() {
298
- DCHECK(is_initial_metadata_queued_);
299
- DCHECK(is_client_);
300
- DCHECK(!is_reset_stream_queued_);
301
- DCHECK(!is_trailing_metadata_or_half_close_queued_);
349
+ absl::StatusOr<StreamWritabilityUpdate> EnqueueHalfClosed() {
350
+ MutexLock lock(&mu_);
351
+ GRPC_DCHECK(is_initial_metadata_queued_);
352
+ GRPC_DCHECK(is_client_);
353
+
354
+ if (GPR_UNLIKELY(IsEnqueueClosed() ||
355
+ is_trailing_metadata_or_half_close_queued_)) {
356
+ GRPC_STREAM_DATA_QUEUE_DEBUG
357
+ << "Enqueue closed or trailing metadata/half close queued "
358
+ << " is_trailing_metadata_or_half_close_queued_ = "
359
+ << is_trailing_metadata_or_half_close_queued_;
360
+ return StreamWritabilityUpdate{/*became_writable=*/false,
361
+ WritableStreamPriority::kStreamClosed};
362
+ }
302
363
 
303
364
  is_trailing_metadata_or_half_close_queued_ = true;
304
- return [self = this->Ref(), entry = QueueEntry{HalfClosed{}}]() mutable
305
- -> Poll<absl::StatusOr<bool>> {
306
- MutexLock lock(&self->mu_);
307
- auto result = self->queue_.Enqueue(entry, /*tokens=*/0);
308
- if (result.ready()) {
309
- GRPC_STREAM_DATA_QUEUE_DEBUG
310
- << "Marking stream " << self->stream_id_ << " as half closed"
311
- << " with status: " << result.value().status;
312
- if (result.value().status.ok()) {
313
- return self->UpdateWritableStateLocked(
314
- result.value().became_non_empty);
315
- }
316
- return result.value().status;
317
- }
318
- return Pending{};
319
- };
365
+ absl::StatusOr<bool> result =
366
+ queue_.ImmediateEnqueue(QueueEntry{HalfClosed{}}, /*tokens=*/0);
367
+ if (GPR_UNLIKELY(!result.ok())) {
368
+ GRPC_STREAM_DATA_QUEUE_DEBUG
369
+ << "Immediate enqueueing half closed failed with status: "
370
+ << result.status();
371
+ return result.status();
372
+ }
373
+ return UpdateWritableStateAndPriorityEnqueueLocked(
374
+ /*became_non_empty*/ result.value(),
375
+ WritableStreamPriority::kStreamClosed);
320
376
  }
321
377
 
322
378
  // Enqueue Reset Stream.
323
379
  // 1. MUST be called at most once.
324
380
  // 3. This function is thread safe.
325
- auto EnqueueResetStream(uint32_t error_code) {
326
- DCHECK(is_initial_metadata_queued_);
327
- DCHECK(!is_reset_stream_queued_);
328
-
329
- is_reset_stream_queued_ = true;
330
- return [self = this->Ref(),
331
- entry = QueueEntry{ResetStream{
332
- error_code}}]() mutable -> Poll<absl::StatusOr<bool>> {
333
- MutexLock lock(&self->mu_);
334
- auto result = self->queue_.Enqueue(entry, /*tokens=*/0);
335
- if (result.ready()) {
336
- GRPC_STREAM_DATA_QUEUE_DEBUG
337
- << "Enqueueing reset stream for stream " << self->stream_id_
338
- << " with status: " << result.value().status;
339
- if (result.value().status.ok()) {
340
- return self->UpdateWritableStateLocked(
341
- result.value().became_non_empty);
342
- }
343
- return result.value().status;
344
- }
345
- return Pending{};
346
- };
381
+ absl::StatusOr<StreamWritabilityUpdate> EnqueueResetStream(
382
+ const uint32_t error_code) {
383
+ MutexLock lock(&mu_);
384
+ GRPC_DCHECK(is_initial_metadata_queued_);
385
+
386
+ // This can happen when the transport tries to close the stream and the
387
+ // stream is cancelled from the call stack.
388
+ if (GPR_UNLIKELY(IsEnqueueClosed())) {
389
+ GRPC_STREAM_DATA_QUEUE_DEBUG << "Enqueue closed";
390
+ return StreamWritabilityUpdate{/*became_writable=*/false,
391
+ WritableStreamPriority::kStreamClosed};
392
+ }
393
+
394
+ GRPC_STREAM_DATA_QUEUE_DEBUG
395
+ << "Immediate enqueueing reset stream with error code: " << error_code;
396
+ reset_stream_state_ = RstStreamState::kQueued;
397
+ reset_stream_error_code_ = error_code;
398
+
399
+ // became_non_empty is set to true if the queue is empty because we are not
400
+ // enqueueing reset stream to the queue. In this case, if the queue is
401
+ // empty, enqueuing reset stream to StreamDataQueue will make the stream
402
+ // writable.
403
+ return UpdateWritableStateAndPriorityEnqueueLocked(
404
+ /*became_non_empty*/ queue_.IsEmpty(),
405
+ WritableStreamPriority::kStreamClosed);
347
406
  }
348
407
 
349
408
  //////////////////////////////////////////////////////////////////////////////
350
409
  // Dequeue Helpers
351
410
 
352
- // TODO(akshitpatel) : [PH2][P2] : Decide on whether it is needed to return
353
- // the number of tokens consumed by one call of this function.
411
+ static constexpr uint8_t kResetStreamDequeued = 0x1;
412
+ static constexpr uint8_t kHalfCloseDequeued = 0x2;
413
+ static constexpr uint8_t kInitialMetadataDequeued = 0x4;
414
+
354
415
  struct DequeueResult {
355
416
  std::vector<Http2Frame> frames;
356
417
  bool is_writable;
418
+ WritableStreamPriority priority;
419
+ // Maybe not be extremely accurate but should be good enough for our
420
+ // purposes.
421
+ size_t total_bytes_consumed = 0u;
422
+ size_t flow_control_tokens_consumed = 0u;
423
+ // Bitmask of the dequeue flags.
424
+ uint8_t flags = 0u;
425
+
426
+ // Returns true if the reset stream was dequeued.
427
+ bool ResetStreamDequeued() const {
428
+ return (flags & kResetStreamDequeued) != 0u;
429
+ }
430
+
431
+ // Returns true if the half close was dequeued.
432
+ bool HalfCloseDequeued() const {
433
+ return (flags & kHalfCloseDequeued) != 0u;
434
+ }
435
+
436
+ // Returns true if the initial metadata was dequeued.
437
+ bool InitialMetadataDequeued() const {
438
+ return (flags & kInitialMetadataDequeued) != 0u;
439
+ }
357
440
  };
358
441
 
359
442
  // TODO(akshitpatel) : [PH2][P4] : Measure the performance of this function
@@ -375,16 +458,29 @@ class StreamDataQueue : public RefCounted<StreamDataQueue<MetadataHandle>> {
375
458
  // the partial first message (sum of payload of all returned frames <=
376
459
  // max_fc_tokens).
377
460
  // This function is thread safe.
378
- absl::StatusOr<DequeueResult> DequeueFrames(const uint32_t max_fc_tokens,
379
- const uint32_t max_frame_length,
380
- HPackCompressor& encoder) {
461
+ DequeueResult DequeueFrames(const uint32_t max_fc_tokens,
462
+ const uint32_t max_frame_length,
463
+ const uint32_t stream_fc_tokens,
464
+ HPackCompressor& encoder,
465
+ const bool can_send_reset_stream) {
381
466
  MutexLock lock(&mu_);
382
- GRPC_STREAM_DATA_QUEUE_DEBUG << "Dequeueing frames for stream "
383
- << stream_id_
384
- << " Max fc tokens: " << max_fc_tokens
385
- << " Max frame length: " << max_frame_length
386
- << " Message disassembler buffered length: "
387
- << message_disassembler_.GetBufferedLength();
467
+ GRPC_STREAM_DATA_QUEUE_DEBUG
468
+ << "Dequeueing frames. Max fc tokens: " << max_fc_tokens
469
+ << " Max frame length: " << max_frame_length
470
+ << " Message disassembler buffered length: "
471
+ << message_disassembler_.GetBufferedLength()
472
+ << " Can send reset stream: " << can_send_reset_stream
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.";
476
+
477
+ // If a reset stream is queued, we do not want to send any more frames. Any
478
+ // metadata enqueued has not reached HPACK encoder, so it is safe to drop
479
+ // all frames.
480
+ if (std::optional<DequeueResult> result =
481
+ HandleResetStreamLocked(can_send_reset_stream)) {
482
+ return std::move(*result);
483
+ }
388
484
 
389
485
  HandleDequeue handle_dequeue(max_fc_tokens, max_frame_length, encoder,
390
486
  *this);
@@ -403,18 +499,41 @@ class StreamDataQueue : public RefCounted<StreamDataQueue<MetadataHandle>> {
403
499
  std::visit(handle_dequeue, std::move(*queue_entry));
404
500
  }
405
501
 
406
- // TODO(akshitpatel) : [PH2][P2] : Add a check for flow control tokens.
407
- is_writable_ = false;
408
- GRPC_STREAM_DATA_QUEUE_DEBUG << "Stream id: " << stream_id_
409
- << " writable state changed to "
410
- << is_writable_;
411
- return DequeueResult{handle_dequeue.GetFrames(), is_writable_};
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_};
412
531
  }
413
532
 
414
533
  // Returns true if the queue is empty. This function is thread safe.
415
534
  bool TestOnlyIsEmpty() {
416
535
  MutexLock lock(&mu_);
417
- return queue_.TestOnlyIsEmpty();
536
+ return queue_.IsEmpty();
418
537
  }
419
538
 
420
539
  private:
@@ -425,26 +544,24 @@ class StreamDataQueue : public RefCounted<StreamDataQueue<MetadataHandle>> {
425
544
  MetadataHandle metadata;
426
545
  };
427
546
  struct HalfClosed {};
428
- struct ResetStream {
429
- uint32_t error_code;
430
- };
431
547
  using QueueEntry = std::variant<InitialMetadataType, TrailingMetadataType,
432
- MessageHandle, HalfClosed, ResetStream>;
548
+ MessageHandle, HalfClosed>;
433
549
 
434
550
  class HandleDequeue {
435
551
  public:
436
- HandleDequeue(uint32_t max_tokens, uint32_t max_frame_length,
552
+ HandleDequeue(const uint32_t max_tokens, const uint32_t max_frame_length,
437
553
  HPackCompressor& encoder, StreamDataQueue& queue)
438
554
  : queue_(queue),
439
555
  max_frame_length_(max_frame_length),
440
- max_fc_tokens_(max_tokens),
441
- fc_tokens_available_(max_tokens),
556
+ max_tokens_available_(max_tokens),
557
+ flow_control_tokens_consumed_(0),
442
558
  encoder_(encoder) {}
443
559
 
444
560
  void operator()(InitialMetadataType initial_metadata) {
445
561
  GRPC_STREAM_DATA_QUEUE_DEBUG << "Preparing initial metadata for sending";
446
562
  queue_.initial_metadata_disassembler_.PrepareForSending(
447
563
  std::move(initial_metadata.metadata), encoder_);
564
+ dequeue_flags_ |= kInitialMetadataDequeued;
448
565
  MaybeAppendInitialMetadataFrames();
449
566
  }
450
567
 
@@ -462,13 +579,7 @@ class StreamDataQueue : public RefCounted<StreamDataQueue<MetadataHandle>> {
462
579
 
463
580
  void operator()(GRPC_UNUSED HalfClosed half_closed) {
464
581
  GRPC_STREAM_DATA_QUEUE_DEBUG << "Preparing end of stream for sending";
465
- is_half_closed_ = true;
466
- }
467
-
468
- void operator()(ResetStream reset_stream) {
469
- GRPC_STREAM_DATA_QUEUE_DEBUG << "Preparing reset stream for sending";
470
- is_reset_stream_ = true;
471
- error_code_ = reset_stream.error_code;
582
+ dequeue_flags_ |= kHalfCloseDequeued;
472
583
  }
473
584
 
474
585
  std::vector<Http2Frame> GetFrames() {
@@ -483,117 +594,274 @@ class StreamDataQueue : public RefCounted<StreamDataQueue<MetadataHandle>> {
483
594
  MaybeAppendMessageFrames();
484
595
  MaybeAppendEndOfStreamFrame();
485
596
  MaybeAppendTrailingMetadataFrames();
486
- MaybeAppendResetStreamFrame();
487
597
  return std::move(frames_);
488
598
  }
489
599
 
600
+ size_t GetTotalBytesConsumed() const { return total_bytes_consumed_; }
601
+ size_t GetFlowControlTokensConsumed() const {
602
+ return flow_control_tokens_consumed_;
603
+ }
604
+ uint8_t GetDequeueFlags() const { return dequeue_flags_; }
605
+
490
606
  private:
491
607
  inline void MaybeAppendInitialMetadataFrames() {
492
608
  while (queue_.initial_metadata_disassembler_.HasMoreData()) {
493
- DCHECK(!is_half_closed_);
494
- DCHECK(!is_reset_stream_);
609
+ GRPC_DCHECK(!(dequeue_flags_ & kHalfCloseDequeued));
610
+ GRPC_DCHECK(!(dequeue_flags_ & kResetStreamDequeued));
495
611
  // TODO(akshitpatel) : [PH2][P2] : I do not think we need this.
496
612
  // HasMoreData() should be enough.
497
613
  bool is_end_headers = false;
498
- frames_.emplace_back(queue_.initial_metadata_disassembler_.GetNextFrame(
614
+ AppendFrame(queue_.initial_metadata_disassembler_.GetNextFrame(
499
615
  max_frame_length_, is_end_headers));
500
616
  }
501
617
  }
502
618
 
503
619
  inline void MaybeAppendTrailingMetadataFrames() {
504
620
  while (queue_.trailing_metadata_disassembler_.HasMoreData()) {
505
- DCHECK(!is_half_closed_);
506
- DCHECK_EQ(queue_.message_disassembler_.GetBufferedLength(), 0u);
507
- DCHECK_EQ(queue_.initial_metadata_disassembler_.GetBufferedLength(),
508
- 0u);
621
+ GRPC_DCHECK(!(dequeue_flags_ & kHalfCloseDequeued));
622
+ GRPC_DCHECK_EQ(queue_.message_disassembler_.GetBufferedLength(), 0u);
623
+ GRPC_DCHECK_EQ(
624
+ queue_.initial_metadata_disassembler_.GetBufferedLength(), 0u);
509
625
  // TODO(akshitpatel) : [PH2][P2] : I do not think we need this.
510
626
  // HasMoreData() should be enough.
511
627
  bool is_end_headers = false;
512
- frames_.emplace_back(
513
- queue_.trailing_metadata_disassembler_.GetNextFrame(
514
- max_frame_length_, is_end_headers));
628
+ AppendFrame(queue_.trailing_metadata_disassembler_.GetNextFrame(
629
+ max_frame_length_, is_end_headers));
515
630
  }
516
631
  }
517
632
 
518
633
  inline void MaybeAppendEndOfStreamFrame() {
519
- if (is_half_closed_) {
520
- DCHECK_EQ(queue_.message_disassembler_.GetBufferedLength(), 0u);
521
- DCHECK_EQ(queue_.initial_metadata_disassembler_.GetBufferedLength(),
522
- 0u);
523
- DCHECK_EQ(queue_.trailing_metadata_disassembler_.GetBufferedLength(),
524
- 0u);
525
- frames_.emplace_back(Http2DataFrame{/*stream_id=*/queue_.stream_id_,
526
- /*end_stream=*/true,
527
- /*payload=*/SliceBuffer()});
634
+ if (dequeue_flags_ & kHalfCloseDequeued) {
635
+ GRPC_DCHECK_EQ(queue_.message_disassembler_.GetBufferedLength(), 0u);
636
+ GRPC_DCHECK_EQ(
637
+ queue_.initial_metadata_disassembler_.GetBufferedLength(), 0u);
638
+ GRPC_DCHECK_EQ(
639
+ queue_.trailing_metadata_disassembler_.GetBufferedLength(), 0u);
640
+ AppendFrame(Http2DataFrame{/*stream_id=*/queue_.stream_id_,
641
+ /*end_stream=*/true,
642
+ /*payload=*/SliceBuffer()});
528
643
  }
529
644
  }
530
645
 
531
646
  inline void MaybeAppendMessageFrames() {
532
647
  while (queue_.message_disassembler_.GetBufferedLength() > 0 &&
533
- fc_tokens_available_ > 0) {
534
- DCHECK_EQ(queue_.initial_metadata_disassembler_.GetBufferedLength(),
535
- 0u);
648
+ (max_tokens_available_ - flow_control_tokens_consumed_) > 0) {
649
+ GRPC_DCHECK_EQ(
650
+ queue_.initial_metadata_disassembler_.GetBufferedLength(), 0u);
536
651
  Http2DataFrame frame = queue_.message_disassembler_.GenerateNextFrame(
537
652
  queue_.stream_id_,
538
- std::min(fc_tokens_available_, max_frame_length_));
539
- 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();
540
656
  GRPC_STREAM_DATA_QUEUE_DEBUG
541
657
  << "Appending message frame with length " << frame.payload.Length()
542
- << "Available tokens: " << fc_tokens_available_;
543
- frames_.emplace_back(std::move(frame));
658
+ << " Consumed tokens: " << flow_control_tokens_consumed_
659
+ << " Max tokens: " << max_tokens_available_;
660
+ AppendFrame(std::move(frame));
544
661
  }
545
662
  }
546
663
 
547
664
  inline void MaybeAppendResetStreamFrame() {
548
- if (is_reset_stream_) {
665
+ if (dequeue_flags_ & kResetStreamDequeued) {
549
666
  // TODO(akshitpatel) : [PH2][P2] : Consider if we can send reset stream
550
667
  // frame without flushing all the messages enqueued until now.
551
- DCHECK_EQ(queue_.message_disassembler_.GetBufferedLength(), 0u);
552
- DCHECK_EQ(queue_.initial_metadata_disassembler_.GetBufferedLength(),
553
- 0u);
554
- DCHECK_EQ(queue_.trailing_metadata_disassembler_.GetBufferedLength(),
555
- 0u);
556
- frames_.emplace_back(
557
- Http2RstStreamFrame{queue_.stream_id_, error_code_});
668
+ GRPC_DCHECK_EQ(queue_.message_disassembler_.GetBufferedLength(), 0u);
669
+ GRPC_DCHECK_EQ(
670
+ queue_.initial_metadata_disassembler_.GetBufferedLength(), 0u);
671
+ GRPC_DCHECK_EQ(
672
+ queue_.trailing_metadata_disassembler_.GetBufferedLength(), 0u);
673
+ AppendFrame(Http2RstStreamFrame{queue_.stream_id_, error_code_});
558
674
  }
559
675
  }
560
676
 
677
+ inline void AppendFrame(Http2Frame&& frame) {
678
+ total_bytes_consumed_ += GetFrameMemoryUsage(frame);
679
+ frames_.emplace_back(std::move(frame));
680
+ }
681
+
561
682
  StreamDataQueue& queue_;
562
683
  const uint32_t max_frame_length_;
563
- const uint32_t max_fc_tokens_;
564
- uint32_t fc_tokens_available_;
565
- bool is_half_closed_ = false;
566
- bool is_reset_stream_ = false;
684
+ const uint32_t max_tokens_available_;
685
+ uint32_t flow_control_tokens_consumed_;
567
686
  uint32_t error_code_ = static_cast<uint32_t>(Http2ErrorCode::kNoError);
568
687
  std::vector<Http2Frame> frames_;
569
688
  HPackCompressor& encoder_;
689
+ size_t total_bytes_consumed_ = 0u;
690
+ uint8_t dequeue_flags_ = 0u;
570
691
  };
571
692
 
572
- // Returns true if the queue is now writable. It is expected that the caller
573
- // will hold the lock on the queue when calling this function.
574
- bool UpdateWritableStateLocked(const bool became_non_empty)
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)
575
717
  ABSL_EXCLUSIVE_LOCKS_REQUIRED(mu_) {
718
+ // Update priority.
719
+ priority_ = priority;
720
+
721
+ // Update writable state.
576
722
  if (!is_writable_ && became_non_empty) {
577
- GRPC_STREAM_DATA_QUEUE_DEBUG << "Stream id: " << stream_id_
578
- << " writeable state changed to true";
579
723
  is_writable_ = true;
580
- return true;
724
+ GRPC_STREAM_DATA_QUEUE_DEBUG
725
+ << "UpdateWritableStateLocked became writable with priority: "
726
+ << GetWritableStreamPriorityString(priority_);
727
+ return StreamWritabilityUpdate{/*became_writable=*/true, priority_};
728
+ }
729
+
730
+ GRPC_STREAM_DATA_QUEUE_DEBUG
731
+ << "UpdateWritableStateAndPriorityEnqueueLocked with priority: "
732
+ << GetWritableStreamPriorityString(priority_)
733
+ << " is_writable: " << is_writable_;
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);
770
+ }
771
+
772
+ // Handles the case where a reset stream is queued.
773
+ // If a reset stream is queued or has been dequeued, this function returns a
774
+ // DequeueResult. Otherwise, it returns std::nullopt.
775
+ // This function must be called with mu_ held.
776
+ std::optional<DequeueResult> HandleResetStreamLocked(
777
+ const bool can_send_reset_stream) ABSL_EXCLUSIVE_LOCKS_REQUIRED(mu_) {
778
+ switch (reset_stream_state_) {
779
+ case RstStreamState::kDequeued:
780
+ GRPC_STREAM_DATA_QUEUE_DEBUG
781
+ << "Reset stream is already dequeued. Returning empty frames.";
782
+ GRPC_DCHECK(queue_.IsEmpty());
783
+ is_writable_ = false;
784
+ return DequeueResult{
785
+ std::vector<Http2Frame>(), is_writable_, priority_,
786
+ /*total_bytes_consumed=*/0u,
787
+ /*flow_control_tokens_consumed=*/0u, /*flags=*/0u};
788
+ case RstStreamState::kQueued: {
789
+ GRPC_STREAM_DATA_QUEUE_DEBUG
790
+ << "Reset stream is queued. Skipping all frames (if any) for "
791
+ "dequeuing.";
792
+ is_writable_ = false;
793
+ std::vector<Http2Frame> frames;
794
+ uint8_t flags = 0u;
795
+ if (can_send_reset_stream) {
796
+ frames.emplace_back(
797
+ Http2RstStreamFrame{stream_id_, reset_stream_error_code_});
798
+ flags = kResetStreamDequeued;
799
+ }
800
+ queue_.Clear();
801
+ reset_stream_state_ = RstStreamState::kDequeued;
802
+ return DequeueResult{std::move(frames),
803
+ is_writable_,
804
+ priority_,
805
+ /*total_bytes_consumed=*/0u,
806
+ /*flow_control_tokens_consumed=*/0u,
807
+ flags};
808
+ }
809
+ case RstStreamState::kNotQueued:
810
+ return std::nullopt;
811
+ default:
812
+ GRPC_CHECK(false) << "Invalid reset stream state: "
813
+ << static_cast<uint8_t>(reset_stream_state_);
814
+ return std::nullopt;
581
815
  }
582
- return false;
583
816
  }
584
817
 
585
- const uint32_t stream_id_;
818
+ bool IsEnqueueClosed() const ABSL_EXCLUSIVE_LOCKS_REQUIRED(mu_) {
819
+ switch (reset_stream_state_) {
820
+ case RstStreamState::kNotQueued:
821
+ return false;
822
+ case RstStreamState::kQueued:
823
+ case RstStreamState::kDequeued:
824
+ // This can happen when the transport tries to close the stream and the
825
+ // stream is cancelled from the call stack.
826
+ GRPC_STREAM_DATA_QUEUE_DEBUG << "Reset stream already queued.";
827
+ return true;
828
+ default:
829
+ GRPC_CHECK(false) << "Invalid reset stream state: "
830
+ << static_cast<uint8_t>(reset_stream_state_);
831
+ }
832
+
833
+ GPR_UNREACHABLE_CODE(return false);
834
+ }
835
+
836
+ uint32_t stream_id_;
837
+
838
+ // This is only used for DCHECKs. Not actually used for any business logic.
586
839
  const bool is_client_;
587
840
 
841
+ enum class RstStreamState : uint8_t {
842
+ kNotQueued = 0,
843
+ kQueued,
844
+ kDequeued,
845
+ };
846
+
588
847
  // Accessed only during enqueue.
589
848
  bool is_initial_metadata_queued_ = false;
590
849
  bool is_trailing_metadata_or_half_close_queued_ = false;
591
- bool is_reset_stream_queued_ = false;
592
850
 
593
851
  // Access both during enqueue and dequeue.
594
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.
595
857
  bool is_writable_ ABSL_GUARDED_BY(mu_) = false;
858
+ RstStreamState reset_stream_state_ ABSL_GUARDED_BY(mu_) =
859
+ RstStreamState::kNotQueued;
596
860
  SimpleQueue<QueueEntry> queue_;
861
+ WritableStreamPriority priority_ ABSL_GUARDED_BY(mu_) =
862
+ WritableStreamPriority::kDefault;
863
+ uint32_t reset_stream_error_code_ ABSL_GUARDED_BY(mu_) =
864
+ static_cast<uint32_t>(Http2ErrorCode::kNoError);
597
865
 
598
866
  // Accessed only during dequeue.
599
867
  HeaderDisassembler initial_metadata_disassembler_;