grpc 1.83.1 → 1.84.0

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 (322) hide show
  1. checksums.yaml +4 -4
  2. data/Makefile +21 -17
  3. data/include/grpc/credentials.h +10 -0
  4. data/include/grpc/grpc_security_constants.h +2 -0
  5. data/include/grpc/impl/channel_arg_names.h +9 -0
  6. data/src/core/call/call_filters.h +4 -2
  7. data/src/core/call/client_call.cc +20 -8
  8. data/src/core/call/client_call.h +4 -0
  9. data/src/core/call/interception_chain.cc +2 -0
  10. data/src/core/call/interception_chain.h +14 -1
  11. data/src/core/call/metadata.cc +1 -3
  12. data/src/core/call/metadata_batch.h +13 -5
  13. data/src/core/call/server_call.cc +31 -14
  14. data/src/core/call/server_call.h +4 -0
  15. data/src/core/channelz/text_encode.cc +9 -4
  16. data/src/core/channelz/v2tov1/convert.cc +2 -2
  17. data/src/core/client_channel/backup_poller.cc +1 -2
  18. data/src/core/client_channel/client_channel.cc +6 -33
  19. data/src/core/client_channel/client_channel_filter.cc +22 -55
  20. data/src/core/client_channel/client_channel_filter.h +2 -2
  21. data/src/core/client_channel/client_channel_service_config.cc +3 -19
  22. data/src/core/client_channel/direct_channel.cc +7 -1
  23. data/src/core/client_channel/direct_channel.h +2 -2
  24. data/src/core/client_channel/load_balanced_call_destination.cc +5 -3
  25. data/src/core/client_channel/retry_filter_legacy_call_data.cc +5 -12
  26. data/src/core/client_channel/subchannel.cc +310 -1058
  27. data/src/core/client_channel/subchannel.h +44 -329
  28. data/src/core/client_channel/subchannel_metrics.cc +48 -0
  29. data/src/core/client_channel/subchannel_metrics.h +60 -0
  30. data/src/core/credentials/call/external/file_external_account_credentials.cc +1 -1
  31. data/src/core/credentials/call/external/url_external_account_credentials.cc +2 -3
  32. data/src/core/credentials/call/gcp_service_account_identity/gcp_service_account_identity_credentials.cc +8 -24
  33. data/src/core/credentials/call/gcp_service_account_identity/gcp_service_account_identity_credentials.h +3 -6
  34. data/src/core/credentials/call/gdch_service_account/gdch_service_account_credentials.cc +525 -0
  35. data/src/core/credentials/call/gdch_service_account/gdch_service_account_credentials.h +138 -0
  36. data/src/core/credentials/call/json_util.h +1 -0
  37. data/src/core/credentials/call/jwt/json_token.cc +10 -2
  38. data/src/core/credentials/call/jwt/jwt_verifier.cc +15 -1
  39. data/src/core/credentials/call/jwt_token_file/jwt_token_file_call_credentials.cc +1 -1
  40. data/src/core/credentials/call/oauth2/oauth2_credentials.cc +42 -79
  41. data/src/core/credentials/call/oauth2/oauth2_credentials.h +2 -5
  42. data/src/core/credentials/call/token_fetcher/token_fetcher_credentials.cc +52 -31
  43. data/src/core/credentials/call/token_fetcher/token_fetcher_credentials.h +21 -8
  44. data/src/core/credentials/transport/google_default/google_default_credentials.cc +3 -4
  45. data/src/core/credentials/transport/ssl/ssl_credentials.cc +59 -72
  46. data/src/core/credentials/transport/ssl/ssl_credentials.h +9 -8
  47. data/src/core/credentials/transport/ssl/ssl_security_connector.cc +12 -6
  48. data/src/core/credentials/transport/ssl/ssl_security_connector.h +4 -4
  49. data/src/core/credentials/transport/tls/grpc_tls_certificate_distributor.cc +29 -18
  50. data/src/core/credentials/transport/tls/grpc_tls_certificate_distributor.h +9 -6
  51. data/src/core/credentials/transport/tls/grpc_tls_certificate_provider.cc +45 -56
  52. data/src/core/credentials/transport/tls/grpc_tls_certificate_provider.h +5 -4
  53. data/src/core/credentials/transport/tls/grpc_tls_certificate_selector.h +26 -0
  54. data/src/core/credentials/transport/tls/grpc_tls_crl_provider.cc +1 -1
  55. data/src/core/credentials/transport/tls/load_system_roots.h +2 -6
  56. data/src/core/credentials/transport/tls/load_system_roots_fallback.cc +2 -4
  57. data/src/core/credentials/transport/tls/load_system_roots_supported.cc +13 -15
  58. data/src/core/credentials/transport/tls/load_system_roots_supported.h +3 -2
  59. data/src/core/credentials/transport/tls/load_system_roots_windows.cc +5 -8
  60. data/src/core/credentials/transport/tls/spiffe_utils.cc +1 -1
  61. data/src/core/credentials/transport/tls/ssl_utils.cc +39 -28
  62. data/src/core/credentials/transport/tls/ssl_utils.h +12 -49
  63. data/src/core/credentials/transport/tls/tls_security_connector.cc +48 -33
  64. data/src/core/credentials/transport/tls/tls_security_connector.h +31 -10
  65. data/src/core/ext/filters/channel_idle/legacy_channel_idle_filter.cc +15 -11
  66. data/src/core/ext/filters/http/http_filters_plugin.cc +20 -9
  67. data/src/core/ext/filters/rbac/rbac_filter.cc +43 -21
  68. data/src/core/ext/filters/rbac/rbac_filter.h +21 -3
  69. data/src/core/ext/filters/rbac/rbac_service_config_parser.cc +2 -2
  70. data/src/core/ext/transport/chttp2/client/chttp2_connector.cc +1 -1
  71. data/src/core/ext/transport/chttp2/server/chttp2_server.cc +6 -20
  72. data/src/core/ext/transport/chttp2/transport/chttp2_transport.cc +32 -67
  73. data/src/core/ext/transport/chttp2/transport/flow_control.cc +2 -0
  74. data/src/core/ext/transport/chttp2/transport/flow_control.h +78 -4
  75. data/src/core/ext/transport/chttp2/transport/frame.h +2 -0
  76. data/src/core/ext/transport/chttp2/transport/frame_data.cc +3 -4
  77. data/src/core/ext/transport/chttp2/transport/goaway.h +7 -0
  78. data/src/core/ext/transport/chttp2/transport/hpack_parser.cc +5 -3
  79. data/src/core/ext/transport/chttp2/transport/hpack_parser.h +3 -1
  80. data/src/core/ext/transport/chttp2/transport/http2_client_transport.cc +141 -130
  81. data/src/core/ext/transport/chttp2/transport/http2_client_transport.h +22 -22
  82. data/src/core/ext/transport/chttp2/transport/http2_server_transport.cc +402 -269
  83. data/src/core/ext/transport/chttp2/transport/http2_server_transport.h +80 -49
  84. data/src/core/ext/transport/chttp2/transport/http2_settings_promises.h +1 -2
  85. data/src/core/ext/transport/chttp2/transport/http2_status.h +38 -37
  86. data/src/core/ext/transport/chttp2/transport/http2_transport.cc +178 -5
  87. data/src/core/ext/transport/chttp2/transport/http2_transport.h +345 -5
  88. data/src/core/ext/transport/chttp2/transport/parsing.cc +5 -5
  89. data/src/core/ext/transport/chttp2/transport/ping_promise.cc +3 -2
  90. data/src/core/ext/transport/chttp2/transport/ping_promise.h +25 -5
  91. data/src/core/ext/transport/chttp2/transport/ping_rate_policy.cc +3 -4
  92. data/src/core/ext/transport/chttp2/transport/read_context.h +30 -3
  93. data/src/core/ext/transport/chttp2/transport/stream.h +65 -23
  94. data/src/core/ext/transport/chttp2/transport/writing.cc +0 -3
  95. data/src/core/ext/transport/inproc/inproc_transport.cc +1 -5
  96. data/src/core/ext/transport/inproc/legacy_inproc_transport.cc +4 -17
  97. data/src/core/ext/upb-gen/envoy/extensions/filters/http/ext_proc/v3/ext_proc.upb.h +1912 -0
  98. data/src/core/ext/upb-gen/envoy/extensions/filters/http/ext_proc/v3/ext_proc.upb_minitable.c +300 -0
  99. data/src/core/ext/upb-gen/envoy/extensions/filters/http/ext_proc/v3/ext_proc.upb_minitable.h +37 -0
  100. data/src/core/ext/upb-gen/envoy/extensions/filters/http/ext_proc/v3/processing_mode.upb.h +187 -0
  101. data/src/core/ext/upb-gen/envoy/extensions/filters/http/ext_proc/v3/processing_mode.upb_minitable.c +64 -0
  102. data/src/core/ext/upb-gen/envoy/extensions/filters/http/ext_proc/v3/processing_mode.upb_minitable.h +31 -0
  103. data/src/core/ext/upb-gen/envoy/service/ext_proc/v3/external_processor.upb.h +2362 -0
  104. data/src/core/ext/upb-gen/envoy/service/ext_proc/v3/external_processor.upb_minitable.c +556 -0
  105. data/src/core/ext/upb-gen/envoy/service/ext_proc/v3/external_processor.upb_minitable.h +47 -0
  106. data/src/core/ext/upb-gen/{src/proto/grpc/channelz → grpc/channelz/v1}/channelz.upb.h +5 -5
  107. data/src/core/ext/upb-gen/{src/proto/grpc/channelz → grpc/channelz/v1}/channelz.upb_minitable.c +3 -3
  108. data/src/core/ext/upb-gen/{src/proto/grpc/channelz → grpc/channelz/v1}/channelz.upb_minitable.h +5 -5
  109. data/src/core/ext/upbdefs-gen/envoy/extensions/filters/http/ext_proc/v3/ext_proc.upbdefs.c +453 -0
  110. data/src/core/ext/upbdefs-gen/envoy/extensions/filters/http/ext_proc/v3/ext_proc.upbdefs.h +67 -0
  111. data/src/core/ext/upbdefs-gen/envoy/extensions/filters/http/ext_proc/v3/processing_mode.upbdefs.c +142 -0
  112. data/src/core/ext/upbdefs-gen/envoy/extensions/filters/http/ext_proc/v3/processing_mode.upbdefs.h +37 -0
  113. data/src/core/ext/upbdefs-gen/grpc/channelz/v1/channelz.upbdefs.c +715 -0
  114. data/src/core/ext/upbdefs-gen/{src/proto/grpc/channelz → grpc/channelz/v1}/channelz.upbdefs.h +44 -44
  115. data/src/core/filter/auth/server_auth_filter.cc +2 -3
  116. data/src/core/filter/composite/composite_filter.cc +45 -33
  117. data/src/core/filter/composite/composite_filter.h +5 -4
  118. data/src/core/filter/ext_proc/ext_proc_filter.cc +224 -0
  119. data/src/core/filter/ext_proc/ext_proc_filter.h +155 -0
  120. data/src/core/filter/ext_proc/ext_proc_messages.cc +701 -0
  121. data/src/core/filter/ext_proc/ext_proc_messages.h +297 -0
  122. data/src/core/filter/filter_args.h +13 -2
  123. data/src/core/handshaker/http_connect/http_proxy_mapper.cc +30 -3
  124. data/src/core/handshaker/security/security_handshaker.cc +9 -6
  125. data/src/core/lib/channel/channel_stack.cc +3 -0
  126. data/src/core/lib/channel/channel_stack.h +2 -0
  127. data/src/core/lib/channel/channel_stack_builder_impl.cc +1 -2
  128. data/src/core/lib/channel/promise_based_filter.cc +132 -20
  129. data/src/core/lib/channel/promise_based_filter.h +42 -12
  130. data/src/core/lib/compression/compression_internal.cc +4 -5
  131. data/src/core/lib/debug/trace_flags.cc +8 -0
  132. data/src/core/lib/debug/trace_flags.h +3 -0
  133. data/src/core/lib/event_engine/ares_resolver.cc +54 -50
  134. data/src/core/lib/event_engine/ares_resolver.h +3 -2
  135. data/src/core/lib/event_engine/posix_engine/ev_epoll1_linux.cc +3 -3
  136. data/src/core/lib/event_engine/posix_engine/ev_poll_posix.cc +4 -10
  137. data/src/core/lib/event_engine/posix_engine/posix_endpoint.cc +74 -33
  138. data/src/core/lib/event_engine/posix_engine/posix_endpoint.h +4 -4
  139. data/src/core/lib/event_engine/posix_engine/posix_engine.cc +6 -2
  140. data/src/core/lib/event_engine/posix_engine/tcp_socket_utils.cc +3 -0
  141. data/src/core/lib/event_engine/posix_engine/tcp_socket_utils.h +3 -0
  142. data/src/core/lib/event_engine/windows/windows_endpoint.cc +1 -3
  143. data/src/core/lib/experiments/experiments.cc +60 -96
  144. data/src/core/lib/experiments/experiments.h +34 -50
  145. data/src/core/lib/iomgr/cfstream_handle.cc +2 -6
  146. data/src/core/lib/iomgr/endpoint_cfstream.cc +3 -10
  147. data/src/core/lib/iomgr/error.cc +2 -6
  148. data/src/core/lib/iomgr/error_cfstream.cc +1 -1
  149. data/src/core/lib/iomgr/ev_poll_posix.cc +5 -9
  150. data/src/core/lib/iomgr/event_engine_shims/closure.cc +1 -1
  151. data/src/core/lib/iomgr/event_engine_shims/endpoint.cc +1 -2
  152. data/src/core/lib/iomgr/event_engine_shims/tcp_client.cc +1 -2
  153. data/src/core/lib/iomgr/iomgr_posix.cc +0 -4
  154. data/src/core/lib/iomgr/iomgr_posix_cfstream.cc +0 -4
  155. data/src/core/lib/iomgr/iomgr_windows.cc +0 -4
  156. data/src/core/lib/iomgr/socket_factory_posix.h +1 -1
  157. data/src/core/lib/iomgr/socket_utils_posix.cc +3 -0
  158. data/src/core/lib/iomgr/socket_utils_posix.h +3 -0
  159. data/src/core/lib/iomgr/systemd_utils.cc +0 -1
  160. data/src/core/lib/iomgr/tcp_client.h +1 -1
  161. data/src/core/lib/iomgr/tcp_posix.cc +23 -15
  162. data/src/core/lib/iomgr/tcp_server.h +1 -1
  163. data/src/core/lib/iomgr/tcp_server_posix.cc +2 -3
  164. data/src/core/lib/iomgr/tcp_server_utils_posix.h +0 -1
  165. data/src/core/lib/iomgr/tcp_server_windows.cc +0 -1
  166. data/src/core/lib/iomgr/tcp_windows.cc +5 -10
  167. data/src/core/lib/iomgr/unix_sockets_posix.cc +2 -4
  168. data/src/core/lib/iomgr/unix_sockets_posix.h +3 -1
  169. data/src/core/lib/iomgr/vsock.h +3 -1
  170. data/src/core/lib/resource_quota/memory_quota.cc +1 -1
  171. data/src/core/lib/security/authorization/rbac_policy.cc +139 -56
  172. data/src/core/lib/security/authorization/rbac_policy.h +21 -3
  173. data/src/core/lib/surface/call.cc +3 -9
  174. data/src/core/lib/surface/call_utils.h +113 -0
  175. data/src/core/lib/surface/channel_create.cc +1 -1
  176. data/src/core/lib/surface/channel_create.h +0 -2
  177. data/src/core/lib/surface/channel_init.cc +77 -38
  178. data/src/core/lib/surface/channel_init.h +30 -16
  179. data/src/core/lib/surface/filter_stack_call.cc +5 -10
  180. data/src/core/lib/surface/init.cc +13 -27
  181. data/src/core/lib/surface/version.cc +1 -1
  182. data/src/core/lib/transport/error_utils.cc +0 -27
  183. data/src/core/lib/transport/error_utils.h +0 -16
  184. data/src/core/lib/transport/transport.h +7 -5
  185. data/src/core/load_balancing/pick_first/pick_first.cc +2 -0
  186. data/src/core/load_balancing/rls/rls.cc +28 -11
  187. data/src/core/load_balancing/weighted_round_robin/weighted_round_robin.cc +33 -42
  188. data/src/core/load_balancing/weighted_round_robin/weighted_round_robin.h +0 -2
  189. data/src/core/load_balancing/xds/cds.cc +3 -1
  190. data/src/core/load_balancing/xds/xds_cluster_impl.cc +0 -1
  191. data/src/core/mitigation_engine/mitigation.h +14 -5
  192. data/src/core/mitigation_engine/mitigation_engine.h +7 -3
  193. data/src/core/mitigation_engine/mitigation_provider.h +2 -1
  194. data/src/core/plugin_registry/grpc_plugin_registry.cc +39 -8
  195. data/src/core/resolver/dns/{event_engine/event_engine_client_channel_resolver.cc → dns_resolver.cc} +42 -41
  196. data/src/core/resolver/dns/{event_engine/event_engine_client_channel_resolver.h → dns_resolver.h} +8 -5
  197. data/src/core/resolver/dns/{event_engine/service_config_helper.cc → service_config_helper.cc} +1 -1
  198. data/src/core/resolver/dns/{event_engine/service_config_helper.h → service_config_helper.h} +3 -3
  199. data/src/core/resolver/endpoint_addresses.h +3 -0
  200. data/src/core/resolver/google_c2p/google_c2p_resolver.cc +2 -1
  201. data/src/core/resolver/xds/xds_resolver.cc +35 -9
  202. data/src/core/server/server.cc +2 -6
  203. data/src/core/server/server_config_selector.h +18 -3
  204. data/src/core/server/server_config_selector_filter.cc +178 -91
  205. data/src/core/server/server_config_selector_filter.h +58 -3
  206. data/src/core/server/xds_server_config_fetcher.cc +196 -129
  207. data/src/core/server/xds_server_config_fetcher.h +49 -0
  208. data/src/core/server/xds_server_config_fetcher_legacy.cc +41 -37
  209. data/src/core/telemetry/histogram.h +94 -14
  210. data/src/core/telemetry/instrument.cc +179 -74
  211. data/src/core/telemetry/instrument.h +78 -30
  212. data/src/core/telemetry/metrics.h +5 -0
  213. data/src/core/{resolver/dns/dns_resolver_plugin.h → telemetry/telemetry_label.h} +12 -8
  214. data/src/core/tsi/alts/crypt/aes_gcm.cc +10 -13
  215. data/src/core/tsi/alts/handshaker/alts_tsi_handshaker.cc +2 -2
  216. data/src/core/tsi/alts/handshaker/alts_tsi_handshaker.h +3 -1
  217. data/src/core/tsi/ssl_telemetry_utils.cc +216 -259
  218. data/src/core/tsi/ssl_telemetry_utils.h +12 -2
  219. data/src/core/tsi/ssl_transport_security.cc +238 -80
  220. data/src/core/tsi/ssl_transport_security.h +63 -33
  221. data/src/core/tsi/tls_telemetry.cc +31 -0
  222. data/src/core/tsi/tls_telemetry.h +47 -0
  223. data/src/core/tsi/transport_security.cc +2 -2
  224. data/src/core/tsi/transport_security.h +1 -1
  225. data/src/core/tsi/transport_security_interface.h +1 -1
  226. data/src/core/{resolver/dns/native/dns_resolver.h → util/address_sorting_init.cc} +21 -8
  227. data/src/core/{resolver/dns/c_ares/grpc_ares_wrapper_posix.cc → util/address_sorting_init.h} +7 -8
  228. data/src/core/util/http_client/httpcli.cc +16 -53
  229. data/src/core/util/http_client/httpcli.h +0 -7
  230. data/src/core/util/http_client/httpcli_security_connector.cc +13 -8
  231. data/src/core/util/linux/cpu.cc +1 -1
  232. data/src/core/util/load_file.cc +3 -9
  233. data/src/core/util/load_file.h +3 -4
  234. data/src/core/util/matchers.h +8 -0
  235. data/src/core/util/posix/cpu.cc +1 -1
  236. data/src/core/util/status_helper.cc +0 -20
  237. data/src/core/util/status_helper.h +3 -14
  238. data/src/core/xds/grpc/xds_audit_logger_registry.cc +51 -31
  239. data/src/core/xds/grpc/xds_audit_logger_registry.h +17 -3
  240. data/src/core/xds/grpc/xds_bootstrap_grpc.cc +2 -10
  241. data/src/core/xds/grpc/xds_bootstrap_grpc.h +8 -6
  242. data/src/core/xds/grpc/xds_bootstrap_grpc_builder.cc +488 -0
  243. data/src/core/xds/grpc/xds_bootstrap_grpc_builder.h +97 -0
  244. data/src/core/xds/grpc/xds_certificate_provider.cc +7 -7
  245. data/src/core/xds/grpc/xds_client_grpc.cc +4 -8
  246. data/src/core/xds/grpc/xds_client_grpc.h +0 -4
  247. data/src/core/xds/grpc/xds_cluster.h +1 -0
  248. data/src/core/xds/grpc/xds_cluster_parser.cc +1 -5
  249. data/src/core/xds/grpc/xds_cluster_parser.h +0 -2
  250. data/src/core/xds/grpc/xds_cluster_specifier_plugin.cc +0 -2
  251. data/src/core/xds/grpc/xds_cluster_specifier_plugin.h +0 -2
  252. data/src/core/xds/grpc/xds_common_types.cc +0 -91
  253. data/src/core/xds/grpc/xds_common_types.h +1 -47
  254. data/src/core/xds/grpc/xds_common_types_parser.cc +84 -378
  255. data/src/core/xds/grpc/xds_common_types_parser.h +9 -11
  256. data/src/core/xds/grpc/xds_endpoint_parser.cc +0 -2
  257. data/src/core/xds/grpc/xds_grpc_service_parser.cc +177 -0
  258. data/src/core/{resolver/dns/c_ares/dns_resolver_ares.h → xds/grpc/xds_grpc_service_parser.h} +14 -9
  259. data/src/core/xds/grpc/xds_http_composite_filter.cc +26 -21
  260. data/src/core/xds/grpc/xds_http_composite_filter.h +4 -3
  261. data/src/core/xds/grpc/xds_http_ext_proc_filter.cc +418 -0
  262. data/src/core/xds/grpc/xds_http_ext_proc_filter.h +89 -0
  263. data/src/core/xds/grpc/xds_http_fault_filter.cc +9 -12
  264. data/src/core/xds/grpc/xds_http_fault_filter.h +1 -4
  265. data/src/core/xds/grpc/xds_http_filter.cc +2 -1
  266. data/src/core/xds/grpc/xds_http_filter.h +6 -5
  267. data/src/core/xds/grpc/xds_http_filter_registry.cc +10 -127
  268. data/src/core/xds/grpc/xds_http_filter_registry.h +7 -59
  269. data/src/core/xds/grpc/xds_http_gcp_authn_filter.cc +13 -14
  270. data/src/core/xds/grpc/xds_http_gcp_authn_filter.h +3 -2
  271. data/src/core/xds/grpc/xds_http_rbac_filter.cc +403 -25
  272. data/src/core/xds/grpc/xds_http_rbac_filter.h +1 -3
  273. data/src/core/xds/grpc/xds_http_stateful_session_filter.cc +8 -13
  274. data/src/core/xds/grpc/xds_http_stateful_session_filter.h +1 -4
  275. data/src/core/xds/grpc/xds_lb_policy_registry.cc +0 -292
  276. data/src/core/xds/grpc/xds_lb_policy_registry.h +7 -3
  277. data/src/core/xds/grpc/xds_listener.cc +2 -0
  278. data/src/core/xds/grpc/xds_listener.h +5 -0
  279. data/src/core/xds/grpc/xds_listener_parser.cc +16 -11
  280. data/src/core/xds/grpc/xds_matcher_parse.h +3 -1
  281. data/src/core/xds/grpc/xds_metadata_parser.cc +6 -1
  282. data/src/core/xds/grpc/xds_metadata_parser.h +2 -0
  283. data/src/core/xds/grpc/xds_route_config.cc +2 -0
  284. data/src/core/xds/grpc/xds_route_config.h +3 -1
  285. data/src/core/xds/grpc/xds_route_config_parser.cc +13 -79
  286. data/src/core/xds/grpc/xds_route_config_parser.h +0 -3
  287. data/src/core/xds/grpc/xds_routing.cc +116 -69
  288. data/src/core/xds/grpc/xds_routing.h +19 -8
  289. data/src/core/xds/grpc/xds_tls_context.cc +117 -0
  290. data/src/core/xds/grpc/xds_tls_context.h +76 -0
  291. data/src/core/xds/grpc/xds_tls_context_parser.cc +275 -0
  292. data/src/core/xds/grpc/xds_tls_context_parser.h +35 -0
  293. data/src/core/xds/grpc/xds_transport_grpc.cc +41 -38
  294. data/src/core/xds/grpc/xds_transport_grpc.h +4 -2
  295. data/src/ruby/ext/grpc/rb_call.c +26 -15
  296. data/src/ruby/ext/grpc/rb_completion_queue.c +6 -5
  297. data/src/ruby/ext/grpc/rb_grpc_imports.generated.c +2 -0
  298. data/src/ruby/ext/grpc/rb_grpc_imports.generated.h +3 -0
  299. data/src/ruby/lib/grpc/version.rb +1 -1
  300. data/src/ruby/pb/test/client.rb +5 -4
  301. data/src/ruby/spec/call_spec.rb +14 -0
  302. data/src/ruby/spec/generic/server_interceptors_spec.rb +3 -6
  303. metadata +50 -35
  304. data/src/core/ext/upbdefs-gen/src/proto/grpc/channelz/channelz.upbdefs.c +0 -716
  305. data/src/core/lib/iomgr/resolve_address.cc +0 -59
  306. data/src/core/lib/iomgr/resolve_address.h +0 -125
  307. data/src/core/lib/iomgr/resolve_address_impl.h +0 -58
  308. data/src/core/lib/iomgr/resolve_address_posix.cc +0 -184
  309. data/src/core/lib/iomgr/resolve_address_posix.h +0 -78
  310. data/src/core/lib/iomgr/resolve_address_windows.cc +0 -169
  311. data/src/core/lib/iomgr/resolve_address_windows.h +0 -76
  312. data/src/core/resolver/dns/c_ares/dns_resolver_ares.cc +0 -781
  313. data/src/core/resolver/dns/c_ares/grpc_ares_ev_driver.h +0 -93
  314. data/src/core/resolver/dns/c_ares/grpc_ares_ev_driver_posix.cc +0 -203
  315. data/src/core/resolver/dns/c_ares/grpc_ares_ev_driver_windows.cc +0 -838
  316. data/src/core/resolver/dns/c_ares/grpc_ares_wrapper.cc +0 -1237
  317. data/src/core/resolver/dns/c_ares/grpc_ares_wrapper.h +0 -130
  318. data/src/core/resolver/dns/c_ares/grpc_ares_wrapper_windows.cc +0 -35
  319. data/src/core/resolver/dns/dns_resolver_plugin.cc +0 -64
  320. data/src/core/resolver/dns/native/dns_resolver.cc +0 -173
  321. data/src/core/util/json/json_util.cc +0 -101
  322. data/src/core/util/json/json_util.h +0 -163
@@ -171,7 +171,7 @@ void Http2ClientTransport::StartWatch(RefCountedPtr<StateWatcher> watcher) {
171
171
  MutexLock lock(&transport_mutex_);
172
172
  GRPC_CHECK(watcher_ == nullptr);
173
173
  watcher_ = std::move(watcher);
174
- if (is_transport_closed_) {
174
+ if (shutdown_tracker_.IsShutdownInitiated(transport_mutex_)) {
175
175
  // TODO(tjagtap) : [PH2][P2] : Provide better status message and
176
176
  // disconnect info here.
177
177
  NotifyStateWatcherOnDisconnectLocked(
@@ -219,7 +219,7 @@ absl::Status Http2ClientTransport::AckPing(uint64_t opaque_data) {
219
219
 
220
220
  void Http2ClientTransport::Orphan() {
221
221
  GRPC_HTTP2_CLIENT_DLOG << "Http2ClientTransport::Orphan Begin";
222
- // Accessing general_party here is not advisable. It may so happen that
222
+ // Accessing transport_party here is not advisable. It may so happen that
223
223
  // the party is already freed/may free up any time. The only guarantee here
224
224
  // is that the transport is still valid.
225
225
  SourceDestructing();
@@ -501,10 +501,6 @@ Http2Status Http2ClientTransport::ProcessIncomingFrame(
501
501
  keepalive_time_.millis() > max_keepalive_time_millis
502
502
  ? INT_MAX
503
503
  : keepalive_time_.millis() * KEEPALIVE_TIME_BACKOFF_MULTIPLIER;
504
- if (!IsSubchannelConnectionScalingEnabled()) {
505
- status.SetPayload(kKeepaliveThrottlingKey,
506
- absl::Cord(std::to_string(throttled_keepalive_time)));
507
- }
508
504
  disconnect_info.keepalive_time =
509
505
  Duration::Milliseconds(throttled_keepalive_time);
510
506
  }
@@ -701,39 +697,25 @@ auto Http2ClientTransport::ReadLoop() {
701
697
  ///////////////////////////////////////////////////////////////////////////////
702
698
  // Flow Control for the Transport
703
699
 
704
- auto Http2ClientTransport::FlowControlPeriodicUpdateLoop() {
705
- GRPC_HTTP2_CLIENT_DLOG
706
- << "Http2ClientTransport::FlowControlPeriodicUpdateLoop Factory";
707
- return AssertResultType<absl::Status>(
708
- Loop([this]() {
709
- GRPC_HTTP2_CLIENT_DLOG
710
- << "Http2ClientTransport::FlowControlPeriodicUpdateLoop Loop";
711
- return TrySeq(
712
- // TODO(tjagtap) [PH2][P2][BDP] Remove this static sleep when the
713
- // BDP code is done.
714
- Sleep(chttp2::kFlowControlPeriodicUpdateTimer),
715
- [this]() -> Poll<absl::Status> {
716
- GRPC_HTTP2_CLIENT_DLOG
717
- << "Http2ClientTransport::FlowControlPeriodicUpdateLoop "
718
- "PeriodicUpdate()";
719
- chttp2::FlowControlAction action = flow_control_.PeriodicUpdate();
720
- bool is_action_empty = action == chttp2::FlowControlAction();
721
- // This may trigger a write cycle
722
- ActOnFlowControlAction(action, nullptr);
723
- if (is_action_empty) {
724
- // TODO(tjagtap) [PH2][P2][BDP] Remove this when the BDP code is
725
- // done. We must continue to do PeriodicUpdate once BDP is in
726
- // place.
727
- MutexLock lock(&transport_mutex_);
728
- if (GetActiveStreamCountLocked() == 0) {
729
- AddPeriodicUpdatePromiseWaker();
730
- return Pending{};
731
- }
732
- }
733
- return absl::OkStatus();
734
- },
735
- []() -> LoopCtl<absl::Status> { return Continue{}; });
736
- }));
700
+ auto Http2ClientTransport::BdpLoop() {
701
+ return AssertResultType<absl::Status>(Loop([this]() {
702
+ return TrySeq(
703
+ flow_control_.WaitForBdpActivation(),
704
+ [this]() {
705
+ // TODO(akshitpatel) : [PH2][P1] : Reset the keepalive ping timer
706
+ // when a BDP ping is sent, similar to CHTTP2's start_bdp_ping_locked.
707
+ return ping_manager_->RequestPing(
708
+ [this] { flow_control_.StartBdpPing(); },
709
+ /*important=*/false);
710
+ },
711
+ [this]() {
712
+ Duration sleep_duration = flow_control_.CompleteBdpPing();
713
+ chttp2::FlowControlAction action = flow_control_.PeriodicUpdate();
714
+ ActOnFlowControlAction(action, nullptr);
715
+ return Sleep(sleep_duration);
716
+ },
717
+ []() -> LoopCtl<absl::Status> { return Continue{}; });
718
+ }));
737
719
  }
738
720
 
739
721
  // Equivalent to grpc_chttp2_act_on_flowctl_action in chttp2_transport.cc
@@ -831,11 +813,6 @@ absl::Status Http2ClientTransport::PrepareControlFrames() {
831
813
  // by a SETTINGS frame, which MAY be empty.
832
814
  settings_->MaybeGetSettingsAndSettingsAckFrames(flow_control_,
833
815
  frame_sender);
834
- // TODO(tjagtap) [PH2][P2][Server] : This will be opposite for server. We
835
- // must read before we write for the server. So the ReadLoop will be Spawned
836
- // just after the constructor, and the write loop should be spawned only
837
- // after the first SETTINGS frame is completely received.
838
- //
839
816
  // Because the client is expected to write before it reads, we spawn the
840
817
  // ReadLoop of the client only after the first write is queued.
841
818
  SpawnGuardedTransportParty("ReadLoop", UntilTransportClosed(ReadLoop()));
@@ -1134,6 +1111,9 @@ auto Http2ClientTransport::MultiplexerLoop() {
1134
1111
  }
1135
1112
 
1136
1113
  absl::Status Http2ClientTransport::InitializeStream(Stream& stream) {
1114
+ if (shutdown_tracker_.IsPartyShutdownInitiated()) {
1115
+ return absl::UnavailableError("Transport closed");
1116
+ }
1137
1117
  absl::StatusOr<uint32_t> next_stream_id = NextStreamId();
1138
1118
  if (!next_stream_id.ok()) {
1139
1119
  GRPC_HTTP2_CLIENT_DLOG << "Http2ClientTransport::InitializeStream "
@@ -1152,7 +1132,6 @@ absl::Status Http2ClientTransport::InitializeStream(Stream& stream) {
1152
1132
  }
1153
1133
 
1154
1134
  void Http2ClientTransport::AddToStreamList(RefCountedPtr<Stream> stream) {
1155
- bool should_wake_periodic_updates = false;
1156
1135
  {
1157
1136
  MutexLock lock(&transport_mutex_);
1158
1137
  GRPC_DCHECK(stream != nullptr) << "stream is null";
@@ -1162,15 +1141,6 @@ void Http2ClientTransport::AddToStreamList(RefCountedPtr<Stream> stream) {
1162
1141
  << stream->GetStreamId();
1163
1142
  const uint32_t stream_id = stream->GetStreamId();
1164
1143
  stream_list_.emplace(stream_id, std::move(stream));
1165
- // TODO(tjagtap) [PH2][P2][BDP] Remove this when the BDP code is done.
1166
- if (GetActiveStreamCountLocked() == 1) {
1167
- should_wake_periodic_updates = true;
1168
- }
1169
- }
1170
- // TODO(tjagtap) [PH2][P2][BDP] Remove this when the BDP code is done.
1171
- if (should_wake_periodic_updates) {
1172
- // Release the lock before you wake up another promise on the party.
1173
- WakeupPeriodicUpdatePromise();
1174
1144
  }
1175
1145
  }
1176
1146
 
@@ -1231,7 +1201,8 @@ Http2ClientTransport::Http2ClientTransport(
1231
1201
  next_stream_id_(/*Initial Stream ID*/ 1),
1232
1202
  should_reset_ping_clock_(false),
1233
1203
  read_context_(MaxNewStreamsPerRead(channel_args), endpoint_, kIsClient,
1234
- GetMaxSecurityFrameSize(channel_args)),
1204
+ GetMaxSecurityFrameSize(channel_args),
1205
+ GetPingOnRstStreamPercent(channel_args, kIsClient)),
1235
1206
  transport_write_context_(kIsClient),
1236
1207
  ping_manager_(std::nullopt),
1237
1208
  keepalive_manager_(std::nullopt),
@@ -1246,16 +1217,16 @@ Http2ClientTransport::Http2ClientTransport(
1246
1217
  security_frame_handler_(MakeRefCounted<SecurityFrameHandler>()),
1247
1218
  ztrace_collector_(std::make_shared<PromiseHttp2ZTraceCollector>()) {
1248
1219
  GRPC_HTTP2_CLIENT_DLOG << "Http2ClientTransport::Http2ClientTransport Begin";
1249
- // Initialize the general party and write party.
1220
+ // Initialize the transport party and write party.
1250
1221
  RefCountedPtr<Arena> party_arena = SimpleArenaAllocator(0)->MakeArena();
1251
1222
  party_arena->SetContext<EventEngine>(event_engine_.get());
1252
- general_party_ = Party::Make(std::move(party_arena));
1223
+ transport_party_ = Party::Make(std::move(party_arena));
1253
1224
 
1254
1225
  InitLocalSettings(settings_->mutable_local(), /*is_client=*/kIsClient);
1255
1226
  TransportChannelArgs args;
1256
1227
  ReadChannelArgs(channel_args, args);
1257
1228
 
1258
- ping_manager_.emplace(channel_args, args.ping_timeout,
1229
+ ping_manager_.emplace(channel_args, kIsClient, args.ping_timeout,
1259
1230
  PingSystemInterfaceImpl::Make(this), event_engine_);
1260
1231
 
1261
1232
  // The keepalive loop is only spawned if the keepalive time is not infinity.
@@ -1274,18 +1245,25 @@ Http2ClientTransport::Http2ClientTransport(
1274
1245
  void Http2ClientTransport::SpawnTransportLoops() {
1275
1246
  GRPC_HTTP2_CLIENT_DLOG << "Http2ClientTransport::SpawnTransportLoops Begin";
1276
1247
  MaybeSpawnKeepaliveLoop();
1277
- SpawnGuardedTransportParty(
1278
- "FlowControlPeriodicUpdateLoop",
1279
- UntilTransportClosed(FlowControlPeriodicUpdateLoop()));
1280
-
1281
1248
  if (!TriggerWriteCycleOrHandleError()) {
1282
1249
  return;
1283
1250
  }
1284
1251
  // For Client, write happens before read. So MultiplexerLoop is spawned first.
1285
1252
  // ReadLoop is spawned after the first write.
1286
1253
  // For Server, read happens before write. So ReadLoop is spawned first.
1287
- SpawnGuardedTransportParty("MultiplexerLoop",
1288
- UntilTransportClosed(MultiplexerLoop()));
1254
+ SpawnGuardedTransportParty(
1255
+ "MultiplexerLoop",
1256
+
1257
+ [self = RefAsSubclass<Http2ClientTransport>()]() {
1258
+ return self->UntilTransportClosed(self->MultiplexerLoop());
1259
+ });
1260
+ if (flow_control_.bdp_probe()) {
1261
+ SpawnGuardedTransportParty(
1262
+ "BdpLoop", [self = RefAsSubclass<Http2ClientTransport>()]() {
1263
+ return self->UntilTransportClosed(self->BdpLoop());
1264
+ });
1265
+ }
1266
+
1289
1267
  GRPC_HTTP2_CLIENT_DLOG << "Http2ClientTransport::SpawnTransportLoops End";
1290
1268
  }
1291
1269
 
@@ -1371,8 +1349,13 @@ void Http2ClientTransport::HandleStreamStateChange(Stream& stream,
1371
1349
  }
1372
1350
 
1373
1351
  void Http2ClientTransport::CleanupStream(Stream& stream) {
1374
- MutexLock lock(&transport_mutex_);
1375
- stream_list_.erase(stream.GetStreamId());
1352
+ {
1353
+ MutexLock lock(&transport_mutex_);
1354
+ stream_list_.erase(stream.GetStreamId());
1355
+ }
1356
+ // Subtract any positive announced window delta of closed stream from the
1357
+ // transport flow control.
1358
+ stream.GetStreamFlowControl().OnStreamClosed();
1376
1359
  }
1377
1360
 
1378
1361
  void Http2ClientTransport::BeginCloseStream(
@@ -1393,30 +1376,99 @@ void Http2ClientTransport::BeginCloseStream(
1393
1376
  << ":" << whence.line();
1394
1377
 
1395
1378
  // Enqueue RST_STREAM.
1396
- absl::StatusOr<StreamWritabilityUpdate> enqueue_result =
1379
+ EnqueueResetStreamFromTransportParty(stream, reset_stream_error_code);
1380
+ HandleStreamStateChange(
1381
+ *stream, stream->OnInitiateReset(std::move(trailing_metadata_status)));
1382
+ }
1383
+
1384
+ void Http2ClientTransport::EnqueueResetStreamFromTransportParty(
1385
+ RefCountedPtr<Stream> stream, const uint32_t reset_stream_error_code) {
1386
+ const absl::StatusOr<StreamWritabilityUpdate> enqueue_result =
1397
1387
  stream->EnqueueResetStream(reset_stream_error_code);
1398
1388
  GRPC_HTTP2_CLIENT_DLOG << "Enqueued ResetStream with error code="
1399
1389
  << reset_stream_error_code
1400
1390
  << " status=" << enqueue_result.status();
1401
- if (enqueue_result.ok()) {
1402
- GRPC_UNUSED absl::Status status =
1403
- MaybeAddStreamToWritableStreamList(stream, enqueue_result.value());
1404
- }
1405
- // Close reads immediately. Writes will be closed by the write loop after
1406
- // the RST_STREAM frame is written.
1407
- HandleStreamStateChange(*stream,
1408
- stream->OnInitiateReset(trailing_metadata_status));
1391
+ if (GPR_LIKELY(enqueue_result.ok())) {
1392
+ GRPC_UNUSED absl::Status status = MaybeAddStreamToWritableStreamList(
1393
+ std::move(stream), enqueue_result.value());
1394
+ }
1395
+ // This function could be hit multiple times for the same stream. So there is
1396
+ // a chance that we may overcount induced frames.
1397
+ // It is a bug, but not worth fixing for now.
1409
1398
  read_context_.OnResetFrameEnqueued(reset_stream_error_code);
1410
1399
  }
1411
1400
 
1412
1401
  void Http2ClientTransport::CloseTransport() {
1413
1402
  GRPC_HTTP2_CLIENT_DLOG << "Http2ClientTransport::CloseTransport";
1414
1403
 
1415
- transport_closed_latch_.Set();
1404
+ shutdown_tracker_.MarkShutdownComplete();
1416
1405
  settings_->HandleTransportShutdown(event_engine_.get());
1417
1406
 
1418
- // This is the only place where the general_party_ is reset.
1419
- general_party_.reset();
1407
+ // This is the only place where the transport_party_ is reset.
1408
+ transport_party_.reset();
1409
+ }
1410
+
1411
+ void Http2ClientTransport::CloseAllActiveStreams(
1412
+ absl::flat_hash_map<uint32_t, RefCountedPtr<Stream>>&& stream_list,
1413
+ const Http2Status& http2_status, DebugLocation whence) {
1414
+ // Close all the streams that are still active on the transport.
1415
+ absl::flat_hash_map<uint32_t, RefCountedPtr<Stream>> stream_list_2;
1416
+ {
1417
+ MutexLock lock(&transport_mutex_);
1418
+ stream_list_2 = std::move(stream_list_);
1419
+ stream_list_.clear();
1420
+ }
1421
+
1422
+ GRPC_HTTP2_CLIENT_DLOG << "Http2ClientTransport::CloseAllActiveStreams "
1423
+ "Cleaning up call stacks";
1424
+
1425
+ auto close_streams =
1426
+ [&](const absl::flat_hash_map<uint32_t, RefCountedPtr<Stream>>& list) {
1427
+ for (const auto& pair : list) {
1428
+ RefCountedPtr<Stream> stream = pair.second;
1429
+ BeginCloseStream(std::move(stream),
1430
+ Http2ErrorCodeToFrameErrorCode(
1431
+ http2_status.GetConnectionErrorCode()),
1432
+ http2_status.GetAbslConnectionError(), whence);
1433
+ }
1434
+ };
1435
+
1436
+ close_streams(stream_list); // Snapshot 1
1437
+ close_streams(stream_list_2); // Snapshot 2
1438
+ }
1439
+
1440
+ auto Http2ClientTransport::CloseTransportFactory(
1441
+ absl::flat_hash_map<uint32_t, RefCountedPtr<Stream>> stream_list,
1442
+ Http2Status http2_status, DebugLocation whence) {
1443
+ return [self = RefAsSubclass<Http2ClientTransport>(),
1444
+ stream_list = std::move(stream_list),
1445
+ http2_status = std::move(http2_status), whence]() mutable {
1446
+ self->shutdown_tracker_.InitiatePartyShutdown();
1447
+ self->security_frame_handler_->OnTransportClosed();
1448
+
1449
+ self->CloseAllActiveStreams(std::move(stream_list), http2_status, whence);
1450
+
1451
+ // RFC9113 : A GOAWAY frame might not immediately precede closing of
1452
+ // the connection; a receiver of a GOAWAY that has no more use for the
1453
+ // connection SHOULD still send a GOAWAY frame before terminating the
1454
+ // connection.
1455
+ return Map(
1456
+ // TODO(akshitpatel) : [PH2][P4] : This is creating a copy of
1457
+ // the debug data. Verify if this is causing a performance
1458
+ // issue.
1459
+ Race(AssertResultType<absl::Status>(self->goaway_manager_.RequestGoaway(
1460
+ http2_status.GetConnectionErrorCode(),
1461
+ /*debug_data=*/
1462
+ Slice::FromCopiedString(
1463
+ http2_status.GetAbslConnectionError().message()),
1464
+ kLastIncomingStreamIdClient, /*immediate=*/true)),
1465
+ // Failsafe to close.
1466
+ Sleep(Duration::Seconds(kGoawaySendTimeoutSeconds))),
1467
+ [self](auto) mutable {
1468
+ self->CloseTransport();
1469
+ return Empty{};
1470
+ });
1471
+ };
1420
1472
  }
1421
1473
 
1422
1474
  void Http2ClientTransport::MaybeSpawnCloseTransport(Http2Status http2_status,
@@ -1431,13 +1483,13 @@ void Http2ClientTransport::MaybeSpawnCloseTransport(Http2Status http2_status,
1431
1483
  // enqueued. Additionally this also prevents additional frames with non-zero
1432
1484
  // stream_ids from being processed by the read loop.
1433
1485
  ReleasableMutexLock lock(&transport_mutex_);
1434
- if (is_transport_closed_) {
1486
+ if (shutdown_tracker_.IsShutdownInitiated(transport_mutex_)) {
1435
1487
  lock.Release();
1436
1488
  return;
1437
1489
  }
1438
1490
  GRPC_HTTP2_CLIENT_DLOG << "Http2ClientTransport::MaybeSpawnCloseTransport "
1439
1491
  "Initiating transport close";
1440
- is_transport_closed_ = true;
1492
+ shutdown_tracker_.InitiateShutdown(transport_mutex_);
1441
1493
  absl::flat_hash_map<uint32_t, RefCountedPtr<Stream>> stream_list =
1442
1494
  std::move(stream_list_);
1443
1495
  stream_list_.clear();
@@ -1447,56 +1499,14 @@ void Http2ClientTransport::MaybeSpawnCloseTransport(Http2Status http2_status,
1447
1499
  lock.Release();
1448
1500
 
1449
1501
  SpawnInfallibleTransportParty(
1450
- "CloseTransport", [self = RefAsSubclass<Http2ClientTransport>(),
1451
- stream_list = std::move(stream_list),
1452
- http2_status = std::move(http2_status)]() mutable {
1453
- self->security_frame_handler_->OnTransportClosed();
1454
- GRPC_HTTP2_CLIENT_DLOG
1455
- << "Http2ClientTransport::MaybeSpawnCloseTransport "
1456
- "Cleaning up call stacks";
1457
- // Clean up the call stacks for all active streams.
1458
- for (const auto& pair : stream_list) {
1459
- // There is no merit in transitioning the stream to
1460
- // closed state here as the subsequent lookups would
1461
- // fail. Also, as this is running on the transport
1462
- // party, there would not be concurrent access to the stream.
1463
- RefCountedPtr<Stream> stream = pair.second;
1464
- self->BeginCloseStream(std::move(stream),
1465
- Http2ErrorCodeToFrameErrorCode(
1466
- http2_status.GetConnectionErrorCode()),
1467
- http2_status.GetAbslConnectionError());
1468
- }
1469
-
1470
- // RFC9113 : A GOAWAY frame might not immediately precede closing of
1471
- // the connection; a receiver of a GOAWAY that has no more use for the
1472
- // connection SHOULD still send a GOAWAY frame before terminating the
1473
- // connection.
1474
- return Map(
1475
- // TODO(akshitpatel) : [PH2][P4] : This is creating a copy of
1476
- // the debug data. Verify if this is causing a performance
1477
- // issue.
1478
- Race(AssertResultType<absl::Status>(
1479
- self->goaway_manager_.RequestGoaway(
1480
- http2_status.GetConnectionErrorCode(),
1481
- /*debug_data=*/
1482
- Slice::FromCopiedString(
1483
- http2_status.GetAbslConnectionError().message()),
1484
- kLastIncomingStreamIdClient, /*immediate=*/true)),
1485
- // Failsafe to close the transport if goaway is not
1486
- // sent within kGoawaySendTimeoutSeconds seconds.
1487
- Sleep(Duration::Seconds(kGoawaySendTimeoutSeconds))),
1488
- [self](auto) mutable {
1489
- self->CloseTransport();
1490
- return Empty{};
1491
- });
1492
- ;
1493
- });
1502
+ "CloseTransport", CloseTransportFactory(std::move(stream_list),
1503
+ std::move(http2_status), whence));
1494
1504
  }
1495
1505
 
1496
1506
  Http2ClientTransport::~Http2ClientTransport() {
1497
1507
  GRPC_HTTP2_CLIENT_DLOG << "Http2ClientTransport::~Http2ClientTransport Begin";
1498
1508
  GRPC_DCHECK(stream_list_.empty());
1499
- GRPC_DCHECK(general_party_ == nullptr);
1509
+ GRPC_DCHECK(transport_party_ == nullptr);
1500
1510
  memory_owner_.Reset();
1501
1511
  GRPC_HTTP2_CLIENT_DLOG << "Http2ClientTransport::~Http2ClientTransport End";
1502
1512
  }
@@ -1519,8 +1529,8 @@ void Http2ClientTransport::SpawnAddChannelzData(RefCountedPtr<Party> party,
1519
1529
  .Set("settings", self->settings_->ChannelzProperties())
1520
1530
  .Set("flow_control",
1521
1531
  self->flow_control_.stats().ChannelzProperties()));
1522
- self->general_party_->ExportToChannelz("Http2ClientTransport Party",
1523
- sink);
1532
+ self->transport_party_->ExportToChannelz("Http2ClientTransport Party",
1533
+ sink);
1524
1534
  GRPC_HTTP2_CLIENT_DLOG
1525
1535
  << "Http2ClientTransport::SpawnAddChannelzData End";
1526
1536
  return Empty{};
@@ -1535,9 +1545,10 @@ void Http2ClientTransport::AddData(channelz::DataSink sink) {
1535
1545
  RefCountedPtr<Party> party = nullptr;
1536
1546
  {
1537
1547
  MutexLock lock(&self->transport_mutex_);
1538
- if (GPR_LIKELY(!self->is_transport_closed_)) {
1539
- GRPC_DCHECK(self->general_party_ != nullptr);
1540
- party = self->general_party_;
1548
+ if (GPR_LIKELY(!self->shutdown_tracker_.IsShutdownInitiated(
1549
+ self->transport_mutex_))) {
1550
+ GRPC_DCHECK(self->transport_party_ != nullptr);
1551
+ party = self->transport_party_;
1541
1552
  } else {
1542
1553
  GRPC_HTTP2_CLIENT_DLOG
1543
1554
  << "Http2ClientTransport::AddData Transport is closed.";
@@ -158,7 +158,7 @@ class Http2ClientTransport final : public ClientTransport,
158
158
 
159
159
  template <typename Factory>
160
160
  void TestOnlySpawnPromise(absl::string_view name, Factory&& factory) {
161
- SpawnInfallible(general_party_, name, std::forward<Factory>(factory));
161
+ SpawnInfallible(transport_party_, name, std::forward<Factory>(factory));
162
162
  }
163
163
 
164
164
  absl::Status TestOnlyTriggerWriteCycle() { return TriggerWriteCycle(); }
@@ -331,7 +331,7 @@ class Http2ClientTransport final : public ClientTransport,
331
331
  Poll<absl::Status>>,
332
332
  bool> = true>
333
333
  auto UntilTransportClosed(Promise&& promise) {
334
- return Race(Map(transport_closed_latch_.Wait(),
334
+ return Race(Map(shutdown_tracker_.WaitShutdownComplete(),
335
335
  [self = RefAsSubclass<Http2ClientTransport>()](Empty) {
336
336
  GRPC_HTTP2_CLIENT_DLOG << "Transport closed";
337
337
  return absl::CancelledError("Transport closed");
@@ -344,7 +344,7 @@ class Http2ClientTransport final : public ClientTransport,
344
344
  Poll<Empty>>,
345
345
  bool> = true>
346
346
  auto UntilTransportClosed(Promise&& promise) {
347
- return Race(Map(transport_closed_latch_.Wait(),
347
+ return Race(Map(shutdown_tracker_.WaitShutdownComplete(),
348
348
  [self = RefAsSubclass<Http2ClientTransport>()](Empty) {
349
349
  GRPC_HTTP2_CLIENT_DLOG << "Transport closed";
350
350
  return Empty{};
@@ -363,7 +363,7 @@ class Http2ClientTransport final : public ClientTransport,
363
363
  template <typename Factory>
364
364
  void SpawnInfallibleTransportParty(absl::string_view name,
365
365
  Factory&& factory) {
366
- SpawnInfallible(general_party_, name, std::forward<Factory>(factory));
366
+ SpawnInfallible(transport_party_, name, std::forward<Factory>(factory));
367
367
  }
368
368
 
369
369
  // Spawns a promise on the transport party. If the promise returns a non-ok
@@ -371,7 +371,7 @@ class Http2ClientTransport final : public ClientTransport,
371
371
  // status.
372
372
  template <typename Factory>
373
373
  void SpawnGuardedTransportParty(absl::string_view name, Factory&& factory) {
374
- general_party_->Spawn(
374
+ transport_party_->Spawn(
375
375
  name, std::forward<Factory>(factory),
376
376
  [self = RefAsSubclass<Http2ClientTransport>()](absl::Status status) {
377
377
  if (!status.ok()) {
@@ -384,8 +384,8 @@ class Http2ClientTransport final : public ClientTransport,
384
384
  template <typename Factory, typename OnDone>
385
385
  void SpawnWithOnDoneTransportParty(absl::string_view name, Factory&& factory,
386
386
  OnDone&& on_done) {
387
- general_party_->Spawn(name, std::forward<Factory>(factory),
388
- std::forward<OnDone>(on_done));
387
+ transport_party_->Spawn(name, std::forward<Factory>(factory),
388
+ std::forward<OnDone>(on_done));
389
389
  }
390
390
 
391
391
  //////////////////////////////////////////////////////////////////////////////
@@ -410,15 +410,7 @@ class Http2ClientTransport final : public ClientTransport,
410
410
  // tokens are calculated based on the initial window size.
411
411
  absl::Status UpdateAllStreamsWritability();
412
412
 
413
- auto FlowControlPeriodicUpdateLoop();
414
-
415
- // TODO(tjagtap) [PH2][P2][BDP] Remove this when the BDP code is done.
416
- void AddPeriodicUpdatePromiseWaker() {
417
- periodic_updates_waker_ = GetContext<Activity>()->MakeNonOwningWaker();
418
- }
419
-
420
- // TODO(tjagtap) [PH2][P2][BDP] Remove this when the BDP code is done.
421
- void WakeupPeriodicUpdatePromise() { periodic_updates_waker_.Wakeup(); }
413
+ auto BdpLoop();
422
414
 
423
415
  //////////////////////////////////////////////////////////////////////////////
424
416
  // Stream List Operations
@@ -482,6 +474,9 @@ class Http2ClientTransport final : public ClientTransport,
482
474
  // Runs on the call party.
483
475
  std::optional<RefCountedPtr<Stream>> MakeStream(CallHandler call_handler);
484
476
 
477
+ void EnqueueResetStreamFromTransportParty(RefCountedPtr<Stream> stream,
478
+ uint32_t reset_stream_error_code);
479
+
485
480
  // Enqueues a RST_STREAM frame and immediately closes the stream for reads.
486
481
  // Writes will be closed by the write loop after the RST_STREAM frame is
487
482
  // written to the wire. Once writes are closed, the stream is considered fully
@@ -557,6 +552,14 @@ class Http2ClientTransport final : public ClientTransport,
557
552
  void MaybeSpawnCloseTransport(Http2Status http2_status,
558
553
  DebugLocation whence = {});
559
554
 
555
+ auto CloseTransportFactory(
556
+ absl::flat_hash_map<uint32_t, RefCountedPtr<Stream>> stream_list,
557
+ Http2Status http2_status, DebugLocation whence = {});
558
+
559
+ void CloseAllActiveStreams(
560
+ absl::flat_hash_map<uint32_t, RefCountedPtr<Stream>>&& stream_list,
561
+ const Http2Status& http2_status, DebugLocation whence);
562
+
560
563
  // This function MUST run on the transport party.
561
564
  void CloseTransport();
562
565
 
@@ -668,7 +671,8 @@ class Http2ClientTransport final : public ClientTransport,
668
671
  //////////////////////////////////////////////////////////////////////////////
669
672
  // All Data Members
670
673
 
671
- RefCountedPtr<Party> general_party_; // Refer AGENTS.md for party slot usage
674
+ // Refer AGENTS.md for party slot usage
675
+ RefCountedPtr<Party> transport_party_;
672
676
  std::shared_ptr<grpc_event_engine::experimental::EventEngine> event_engine_;
673
677
 
674
678
  PromiseEndpoint endpoint_;
@@ -681,8 +685,7 @@ class Http2ClientTransport final : public ClientTransport,
681
685
 
682
686
  uint32_t next_stream_id_;
683
687
  HPackCompressor encoder_;
684
- bool is_transport_closed_ ABSL_GUARDED_BY(transport_mutex_) = false;
685
- Latch<void> transport_closed_latch_;
688
+ TransportShutdownTracker shutdown_tracker_;
686
689
 
687
690
  ConnectivityStateTracker state_tracker_ ABSL_GUARDED_BY(transport_mutex_){
688
691
  "http2_client", GRPC_CHANNEL_READY};
@@ -716,9 +719,6 @@ class Http2ClientTransport final : public ClientTransport,
716
719
 
717
720
  RefCountedPtr<SecurityFrameHandler> security_frame_handler_;
718
721
  std::shared_ptr<PromiseHttp2ZTraceCollector> ztrace_collector_;
719
-
720
- // TODO(tjagtap) [PH2][P2][BDP] Remove this when the BDP code is done.
721
- Waker periodic_updates_waker_;
722
722
  };
723
723
 
724
724
  } // namespace http2