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
@@ -44,19 +44,6 @@
44
44
  #include <variant>
45
45
  #include <vector>
46
46
 
47
- #include "absl/base/attributes.h"
48
- #include "absl/container/flat_hash_map.h"
49
- #include "absl/hash/hash.h"
50
- #include "absl/log/check.h"
51
- #include "absl/log/log.h"
52
- #include "absl/meta/type_traits.h"
53
- #include "absl/random/random.h"
54
- #include "absl/status/status.h"
55
- #include "absl/strings/cord.h"
56
- #include "absl/strings/str_cat.h"
57
- #include "absl/strings/str_format.h"
58
- #include "absl/strings/string_view.h"
59
- #include "absl/time/time.h"
60
47
  #include "src/core/call/metadata_batch.h"
61
48
  #include "src/core/call/metadata_info.h"
62
49
  #include "src/core/channelz/property_list.h"
@@ -72,12 +59,14 @@
72
59
  #include "src/core/ext/transport/chttp2/transport/http2_settings_manager.h"
73
60
  #include "src/core/ext/transport/chttp2/transport/http2_stats_collector.h"
74
61
  #include "src/core/ext/transport/chttp2/transport/http2_status.h"
62
+ #include "src/core/ext/transport/chttp2/transport/http2_ztrace_collector.h"
75
63
  #include "src/core/ext/transport/chttp2/transport/internal.h"
76
64
  #include "src/core/ext/transport/chttp2/transport/legacy_frame.h"
77
65
  #include "src/core/ext/transport/chttp2/transport/ping_abuse_policy.h"
78
66
  #include "src/core/ext/transport/chttp2/transport/ping_callbacks.h"
79
67
  #include "src/core/ext/transport/chttp2/transport/ping_rate_policy.h"
80
68
  #include "src/core/ext/transport/chttp2/transport/stream_lists.h"
69
+ #include "src/core/ext/transport/chttp2/transport/transport_common.h"
81
70
  #include "src/core/ext/transport/chttp2/transport/varint.h"
82
71
  #include "src/core/ext/transport/chttp2/transport/write_size_policy.h"
83
72
  #include "src/core/lib/channel/channel_args.h"
@@ -109,6 +98,7 @@
109
98
  #include "src/core/telemetry/call_tracer.h"
110
99
  #include "src/core/telemetry/context_list_entry.h"
111
100
  #include "src/core/telemetry/default_tcp_tracer.h"
101
+ #include "src/core/telemetry/instrument.h"
112
102
  #include "src/core/telemetry/stats.h"
113
103
  #include "src/core/telemetry/stats_data.h"
114
104
  #include "src/core/telemetry/tcp_tracer.h"
@@ -116,6 +106,7 @@
116
106
  #include "src/core/util/bitset.h"
117
107
  #include "src/core/util/crash.h"
118
108
  #include "src/core/util/debug_location.h"
109
+ #include "src/core/util/grpc_check.h"
119
110
  #include "src/core/util/http_client/parser.h"
120
111
  #include "src/core/util/notification.h"
121
112
  #include "src/core/util/ref_counted.h"
@@ -124,6 +115,18 @@
124
115
  #include "src/core/util/string.h"
125
116
  #include "src/core/util/time.h"
126
117
  #include "src/core/util/useful.h"
118
+ #include "absl/base/attributes.h"
119
+ #include "absl/container/flat_hash_map.h"
120
+ #include "absl/hash/hash.h"
121
+ #include "absl/log/log.h"
122
+ #include "absl/meta/type_traits.h"
123
+ #include "absl/random/random.h"
124
+ #include "absl/status/status.h"
125
+ #include "absl/strings/cord.h"
126
+ #include "absl/strings/str_cat.h"
127
+ #include "absl/strings/str_format.h"
128
+ #include "absl/strings/string_view.h"
129
+ #include "absl/time/time.h"
127
130
 
128
131
  using grpc_core::Json;
129
132
 
@@ -131,8 +134,6 @@ using grpc_core::Json;
131
134
  #define MAX_WINDOW 0x7fffffffu
132
135
  #define MAX_WRITE_BUFFER_SIZE (64 * 1024 * 1024)
133
136
 
134
- #define KEEPALIVE_TIME_BACKOFF_MULTIPLIER 2
135
-
136
137
  #define DEFAULT_MAX_PENDING_INDUCED_FRAMES 10000
137
138
 
138
139
  #define GRPC_ARG_HTTP2_PING_ON_RST_STREAM_PERCENT \
@@ -149,11 +150,6 @@ static grpc_core::Duration g_default_server_keepalive_timeout =
149
150
  static bool g_default_client_keepalive_permit_without_calls = false;
150
151
  static bool g_default_server_keepalive_permit_without_calls = false;
151
152
 
152
- // EXPERIMENTAL: control tarpitting in chttp2
153
- #define GRPC_ARG_HTTP_ALLOW_TARPIT "grpc.http.tarpit"
154
- #define GRPC_ARG_HTTP_TARPIT_MIN_DURATION_MS "grpc.http.tarpit_min_duration_ms"
155
- #define GRPC_ARG_HTTP_TARPIT_MAX_DURATION_MS "grpc.http.tarpit_max_duration_ms"
156
-
157
153
  #define MAX_CLIENT_STREAM_ID 0x7fffffffu
158
154
 
159
155
  // forward declarations of various callbacks that we'll build closures around
@@ -377,11 +373,11 @@ grpc_chttp2_transport::~grpc_chttp2_transport() {
377
373
  grpc_chttp2_goaway_parser_destroy(&goaway_parser);
378
374
 
379
375
  for (i = 0; i < STREAM_LIST_COUNT; i++) {
380
- CHECK_EQ(lists[i].head, nullptr);
381
- CHECK_EQ(lists[i].tail, nullptr);
376
+ GRPC_CHECK_EQ(lists[i].head, nullptr);
377
+ GRPC_CHECK_EQ(lists[i].tail, nullptr);
382
378
  }
383
379
 
384
- CHECK(stream_map.empty());
380
+ GRPC_CHECK(stream_map.empty());
385
381
  GRPC_COMBINER_UNREF(combiner, "chttp2_transport");
386
382
 
387
383
  while (write_cb_pool) {
@@ -547,7 +543,7 @@ static void read_channel_args(grpc_chttp2_transport* t,
547
543
  static void init_keepalive_pings_if_enabled_locked(
548
544
  grpc_core::RefCountedPtr<grpc_chttp2_transport> t,
549
545
  GRPC_UNUSED grpc_error_handle error) {
550
- DCHECK(error.ok());
546
+ GRPC_DCHECK(error.ok());
551
547
  if (t->keepalive_time != grpc_core::Duration::Infinity()) {
552
548
  t->keepalive_state = GRPC_CHTTP2_KEEPALIVE_STATE_WAITING;
553
549
  t->keepalive_ping_timer_handle =
@@ -630,17 +626,20 @@ void grpc_chttp2_transport::ChannelzDataSource::AddData(
630
626
  }
631
627
  return "unknown";
632
628
  }())
633
- .Set("write_state", [t]() {
634
- switch (t->write_state) {
635
- case GRPC_CHTTP2_WRITE_STATE_IDLE:
636
- return "idle";
637
- case GRPC_CHTTP2_WRITE_STATE_WRITING:
638
- return "writing";
639
- case GRPC_CHTTP2_WRITE_STATE_WRITING_WITH_MORE:
640
- return "writing_with_more";
641
- }
642
- return "unknown";
643
- }()));
629
+ .Set("write_state",
630
+ [t]() {
631
+ switch (t->write_state) {
632
+ case GRPC_CHTTP2_WRITE_STATE_IDLE:
633
+ return "idle";
634
+ case GRPC_CHTTP2_WRITE_STATE_WRITING:
635
+ return "writing";
636
+ case GRPC_CHTTP2_WRITE_STATE_WRITING_WITH_MORE:
637
+ return "writing_with_more";
638
+ }
639
+ return "unknown";
640
+ }())
641
+ .Set("tarpit_extra_streams", t->extra_streams)
642
+ .Set("stream_map_size", t->stream_map.size()));
644
643
  }),
645
644
  absl::OkStatus());
646
645
  });
@@ -695,6 +694,11 @@ grpc_chttp2_transport::grpc_chttp2_transport(
695
694
  ->CreateMemoryOwner()),
696
695
  self_reservation(
697
696
  memory_owner.MakeReservation(sizeof(grpc_chttp2_transport))),
697
+ // TODO(ctiller): clean this up so we don't need to RefAsSubclass
698
+ resource_quota_telemetry_storage(
699
+ memory_owner.telemetry_storage()
700
+ ->RefAsSubclass<grpc_core::InstrumentStorage<
701
+ grpc_core::ResourceQuotaDomain>>()),
698
702
  event_engine(
699
703
  channel_args
700
704
  .GetObjectRef<grpc_event_engine::experimental::EventEngine>()),
@@ -718,10 +722,13 @@ grpc_chttp2_transport::grpc_chttp2_transport(
718
722
  auto epte = QueryExtension<TcpTraceExtension>(
719
723
  grpc_event_engine::experimental::grpc_get_wrapped_event_engine_endpoint(
720
724
  ep.get()));
721
- if (epte != nullptr) {
725
+ auto stats_plugin_group = channel_args.GetObjectRef<
726
+ grpc_core::GlobalStatsPluginRegistry::StatsPluginGroup>();
727
+ if (epte != nullptr && stats_plugin_group != nullptr) {
728
+ epte->EnableTcpTelemetry(stats_plugin_group->GetCollectionScope(),
729
+ /*is_control_endpoint=*/false);
722
730
  epte->SetTcpTracer(std::make_shared<grpc_core::DefaultTcpTracer>(
723
- channel_args.GetObjectRef<
724
- grpc_core::GlobalStatsPluginRegistry::StatsPluginGroup>()));
731
+ std::move(stats_plugin_group)));
725
732
  }
726
733
  }
727
734
 
@@ -736,8 +743,8 @@ grpc_chttp2_transport::grpc_chttp2_transport(
736
743
  }
737
744
  }
738
745
 
739
- CHECK(strlen(GRPC_CHTTP2_CLIENT_CONNECT_STRING) ==
740
- GRPC_CHTTP2_CLIENT_CONNECT_STRLEN);
746
+ GRPC_CHECK(strlen(GRPC_CHTTP2_CLIENT_CONNECT_STRING) ==
747
+ GRPC_CHTTP2_CLIENT_CONNECT_STRLEN);
741
748
 
742
749
  grpc_slice_buffer_init(&read_buffer);
743
750
  if (is_client) {
@@ -849,10 +856,12 @@ static void close_transport_locked(grpc_chttp2_transport* t,
849
856
  grpc_error_add_child(t->close_transport_on_writes_finished, error);
850
857
  return;
851
858
  }
852
- CHECK(!error.ok());
859
+ GRPC_CHECK(!error.ok());
853
860
  t->closed_with_error = error;
854
861
  connectivity_state_set(t, GRPC_CHANNEL_SHUTDOWN, absl::Status(),
855
862
  "close_transport");
863
+ // TODO(roth, ctiller): Provide better disconnect info here.
864
+ t->NotifyStateWatcherOnDisconnectLocked(t->closed_with_error, {});
856
865
  if (t->keepalive_ping_timeout_handle != TaskHandle::kInvalid) {
857
866
  t->event_engine->Cancel(std::exchange(t->keepalive_ping_timeout_handle,
858
867
  TaskHandle::kInvalid));
@@ -893,7 +902,7 @@ static void close_transport_locked(grpc_chttp2_transport* t,
893
902
  while (grpc_chttp2_list_pop_writable_stream(t, &s)) {
894
903
  GRPC_CHTTP2_STREAM_UNREF(s, "chttp2_writing:close");
895
904
  }
896
- CHECK(t->write_state == GRPC_CHTTP2_WRITE_STATE_IDLE);
905
+ GRPC_CHECK(t->write_state == GRPC_CHTTP2_WRITE_STATE_IDLE);
897
906
  if (t->interested_parties_until_recv_settings != nullptr) {
898
907
  grpc_endpoint_delete_from_pollset_set(
899
908
  t->ep.get(), t->interested_parties_until_recv_settings);
@@ -902,16 +911,7 @@ static void close_transport_locked(grpc_chttp2_transport* t,
902
911
  grpc_core::MutexLock lock(&t->ep_destroy_mu);
903
912
  t->ep.reset();
904
913
  }
905
- if (t->notify_on_receive_settings != nullptr) {
906
- if (t->interested_parties_until_recv_settings != nullptr) {
907
- grpc_endpoint_delete_from_pollset_set(
908
- t->ep.get(), t->interested_parties_until_recv_settings);
909
- t->interested_parties_until_recv_settings = nullptr;
910
- }
911
- grpc_core::ExecCtx::Run(DEBUG_LOCATION, t->notify_on_receive_settings,
912
- error);
913
- t->notify_on_receive_settings = nullptr;
914
- }
914
+ t->MaybeNotifyOnReceiveSettingsLocked(error);
915
915
  if (t->notify_on_close != nullptr) {
916
916
  grpc_core::ExecCtx::Run(DEBUG_LOCATION, t->notify_on_close, error);
917
917
  t->notify_on_close = nullptr;
@@ -954,7 +954,7 @@ grpc_chttp2_stream::grpc_chttp2_stream(grpc_chttp2_transport* t,
954
954
  arena(arena),
955
955
  flow_control(&t->flow_control),
956
956
  call_tracer_wrapper(this),
957
- call_tracer(arena->GetContext<grpc_core::CallTracerInterface>()) {
957
+ call_tracer(arena->GetContext<grpc_core::CallTracer>()) {
958
958
  t->streams_allocated.fetch_add(1, std::memory_order_relaxed);
959
959
  if (server_data) {
960
960
  id = static_cast<uint32_t>(reinterpret_cast<uintptr_t>(server_data));
@@ -983,9 +983,9 @@ grpc_chttp2_stream::~grpc_chttp2_stream() {
983
983
  }
984
984
  }
985
985
 
986
- CHECK((write_closed && read_closed) || id == 0);
986
+ GRPC_CHECK((write_closed && read_closed) || id == 0);
987
987
  if (id != 0) {
988
- CHECK_EQ(t->stream_map.count(id), 0u);
988
+ GRPC_CHECK_EQ(t->stream_map.count(id), 0u);
989
989
  }
990
990
 
991
991
  grpc_slice_buffer_destroy(&frame_storage);
@@ -998,11 +998,11 @@ grpc_chttp2_stream::~grpc_chttp2_stream() {
998
998
  }
999
999
  }
1000
1000
 
1001
- CHECK_EQ(send_initial_metadata_finished, nullptr);
1002
- CHECK_EQ(send_trailing_metadata_finished, nullptr);
1003
- CHECK_EQ(recv_initial_metadata_ready, nullptr);
1004
- CHECK_EQ(recv_message_ready, nullptr);
1005
- CHECK_EQ(recv_trailing_metadata_finished, nullptr);
1001
+ GRPC_CHECK_EQ(send_initial_metadata_finished, nullptr);
1002
+ GRPC_CHECK_EQ(send_trailing_metadata_finished, nullptr);
1003
+ GRPC_CHECK_EQ(recv_initial_metadata_ready, nullptr);
1004
+ GRPC_CHECK_EQ(recv_message_ready, nullptr);
1005
+ GRPC_CHECK_EQ(recv_trailing_metadata_finished, nullptr);
1006
1006
  grpc_slice_buffer_destroy(&flow_controlled_buffer);
1007
1007
  grpc_core::ExecCtx::Run(DEBUG_LOCATION, destroy_stream_arg, absl::OkStatus());
1008
1008
  }
@@ -1035,7 +1035,7 @@ grpc_chttp2_stream* grpc_chttp2_parsing_accept_stream(grpc_chttp2_transport* t,
1035
1035
  return nullptr;
1036
1036
  }
1037
1037
  grpc_chttp2_stream* accepting = nullptr;
1038
- CHECK_EQ(t->accepting_stream, nullptr);
1038
+ GRPC_CHECK_EQ(t->accepting_stream, nullptr);
1039
1039
  t->accepting_stream = &accepting;
1040
1040
  t->accept_stream_cb(t->accept_stream_cb_user_data, t,
1041
1041
  reinterpret_cast<void*>(id));
@@ -1138,7 +1138,7 @@ static void write_action_begin_locked(
1138
1138
  grpc_core::RefCountedPtr<grpc_chttp2_transport> t,
1139
1139
  grpc_error_handle /*error_ignored*/) {
1140
1140
  GRPC_LATENT_SEE_ALWAYS_ON_SCOPE("write_action_begin_locked");
1141
- CHECK(t->write_state != GRPC_CHTTP2_WRITE_STATE_IDLE);
1141
+ GRPC_CHECK(t->write_state != GRPC_CHTTP2_WRITE_STATE_IDLE);
1142
1142
  grpc_chttp2_begin_write_result r;
1143
1143
  if (!t->closed_with_error.ok()) {
1144
1144
  r.writing = false;
@@ -1152,7 +1152,7 @@ static void write_action_begin_locked(
1152
1152
  begin_writing_desc(r.partial));
1153
1153
  write_action(t.get(), std::move(r.tcp_call_tracers));
1154
1154
  if (t->reading_paused_on_pending_induced_frames) {
1155
- CHECK_EQ(t->num_pending_induced_frames, 0u);
1155
+ GRPC_CHECK_EQ(t->num_pending_induced_frames, 0u);
1156
1156
  // We had paused reading, because we had many induced frames (SETTINGS
1157
1157
  // ACK, PINGS ACK and RST_STREAMS) pending in t->qbuf. Now that we have
1158
1158
  // been able to flush qbuf, we can resume reading.
@@ -1196,7 +1196,13 @@ static void write_action(
1196
1196
  }
1197
1197
  args.set_max_frame_size(max_frame_size);
1198
1198
  args.SetDeprecatedAndDiscouragedGoogleSpecificPointer(cl);
1199
- if (!tcp_call_tracers.empty()) {
1199
+ bool trace_ztrace = false;
1200
+ auto now = grpc_core::Timestamp::Now();
1201
+ if (now - t->last_ztrace_time > grpc_core::Duration::Milliseconds(100)) {
1202
+ t->last_ztrace_time = now;
1203
+ trace_ztrace = t->http2_ztrace_collector.IsActive();
1204
+ }
1205
+ if (!tcp_call_tracers.empty() || trace_ztrace) {
1200
1206
  EventEngine::Endpoint* ee_ep =
1201
1207
  grpc_event_engine::experimental::grpc_get_wrapped_event_engine_endpoint(
1202
1208
  t->ep.get());
@@ -1207,24 +1213,35 @@ static void write_action(
1207
1213
  args.set_metrics_sink(WriteEventSink(
1208
1214
  std::move(metrics_set),
1209
1215
  {WriteEvent::kSendMsg, WriteEvent::kScheduled, WriteEvent::kSent,
1210
- WriteEvent::kAcked},
1216
+ WriteEvent::kAcked, WriteEvent::kClosed},
1211
1217
  [tcp_call_tracers = std::move(tcp_call_tracers),
1212
- telemetry_info = std::move(telemetry_info)](
1218
+ telemetry_info = std::move(telemetry_info),
1219
+ ztrace_collector =
1220
+ trace_ztrace ? &t->http2_ztrace_collector : nullptr](
1213
1221
  WriteEvent event, absl::Time timestamp,
1214
1222
  std::vector<WriteMetric> metrics) {
1215
- std::vector<grpc_core::TcpCallTracer::TcpEventMetric> tcp_metrics;
1216
- tcp_metrics.reserve(metrics.size());
1217
- for (auto& metric : metrics) {
1218
- auto name = telemetry_info->GetMetricName(metric.key);
1219
- if (name.has_value()) {
1220
- tcp_metrics.push_back(
1221
- grpc_core::TcpCallTracer::TcpEventMetric{name.value(),
1222
- metric.value});
1223
+ if (!tcp_call_tracers.empty()) {
1224
+ std::vector<grpc_core::TcpCallTracer::TcpEventMetric>
1225
+ tcp_metrics;
1226
+ tcp_metrics.reserve(metrics.size());
1227
+ for (auto& metric : metrics) {
1228
+ auto name = telemetry_info->GetMetricName(metric.key);
1229
+ if (name.has_value()) {
1230
+ tcp_metrics.push_back(
1231
+ grpc_core::TcpCallTracer::TcpEventMetric{name.value(),
1232
+ metric.value});
1233
+ }
1234
+ }
1235
+ for (auto& tracer : tcp_call_tracers) {
1236
+ tracer.tcp_call_tracer->RecordEvent(
1237
+ event, timestamp, tracer.byte_offset, tcp_metrics);
1223
1238
  }
1224
1239
  }
1225
- for (auto& tracer : tcp_call_tracers) {
1226
- tracer.tcp_call_tracer->RecordEvent(
1227
- event, timestamp, tracer.byte_offset, tcp_metrics);
1240
+ if (ztrace_collector != nullptr) {
1241
+ ztrace_collector->Append([&]() {
1242
+ return grpc_core::H2TcpMetricsTrace{
1243
+ telemetry_info, event, std::move(metrics), timestamp};
1244
+ });
1228
1245
  }
1229
1246
  }));
1230
1247
  }
@@ -1354,6 +1371,9 @@ void grpc_chttp2_add_incoming_goaway(grpc_chttp2_transport* t,
1354
1371
  }
1355
1372
  }
1356
1373
  absl::Status status = grpc_error_to_absl_status(t->goaway_error);
1374
+ grpc_core::Transport::StateWatcher::DisconnectInfo disconnect_info;
1375
+ disconnect_info.reason = grpc_core::Transport::StateWatcher::kGoaway;
1376
+ disconnect_info.http2_error_code = static_cast<Http2ErrorCode>(goaway_error);
1357
1377
  // When a client receives a GOAWAY with error code ENHANCE_YOUR_CALM and debug
1358
1378
  // data equal to "too_many_pings", it should log the occurrence at a log level
1359
1379
  // that is enabled by default and double the configured KEEPALIVE_TIME used
@@ -1373,8 +1393,12 @@ void grpc_chttp2_add_incoming_goaway(grpc_chttp2_transport* t,
1373
1393
  t->keepalive_time.millis() > max_keepalive_time_millis
1374
1394
  ? INT_MAX
1375
1395
  : t->keepalive_time.millis() * KEEPALIVE_TIME_BACKOFF_MULTIPLIER;
1376
- status.SetPayload(grpc_core::kKeepaliveThrottlingKey,
1377
- absl::Cord(std::to_string(throttled_keepalive_time)));
1396
+ if (!grpc_core::IsTransportStateWatcherEnabled()) {
1397
+ status.SetPayload(grpc_core::kKeepaliveThrottlingKey,
1398
+ absl::Cord(std::to_string(throttled_keepalive_time)));
1399
+ }
1400
+ disconnect_info.keepalive_time =
1401
+ grpc_core::Duration::Milliseconds(throttled_keepalive_time);
1378
1402
  }
1379
1403
  // lie: use transient failure from the transport to indicate goaway has been
1380
1404
  // received.
@@ -1382,6 +1406,7 @@ void grpc_chttp2_add_incoming_goaway(grpc_chttp2_transport* t,
1382
1406
  connectivity_state_set(t, GRPC_CHANNEL_TRANSIENT_FAILURE, status,
1383
1407
  "got_goaway");
1384
1408
  }
1409
+ t->NotifyStateWatcherOnDisconnectLocked(std::move(status), disconnect_info);
1385
1410
  }
1386
1411
 
1387
1412
  static void maybe_start_some_streams(grpc_chttp2_transport* t) {
@@ -1403,15 +1428,17 @@ static void maybe_start_some_streams(grpc_chttp2_transport* t) {
1403
1428
  << " allocating new grpc_chttp2_stream " << s << " to id "
1404
1429
  << t->next_stream_id;
1405
1430
 
1406
- CHECK_EQ(s->id, 0u);
1431
+ GRPC_CHECK_EQ(s->id, 0u);
1407
1432
  s->id = t->next_stream_id;
1408
1433
  t->next_stream_id += 2;
1409
1434
 
1410
1435
  if (t->next_stream_id >= MAX_CLIENT_STREAM_ID) {
1411
- connectivity_state_set(t, GRPC_CHANNEL_TRANSIENT_FAILURE,
1412
- absl::Status(absl::StatusCode::kUnavailable,
1413
- "Transport Stream IDs exhausted"),
1436
+ absl::Status status =
1437
+ absl::UnavailableError("Transport Stream IDs exhausted");
1438
+ connectivity_state_set(t, GRPC_CHANNEL_TRANSIENT_FAILURE, status,
1414
1439
  "no_more_stream_ids");
1440
+ // TODO(roth, ctiller): Provide better disconnect info here.
1441
+ t->NotifyStateWatcherOnDisconnectLocked(std::move(status), {});
1415
1442
  }
1416
1443
 
1417
1444
  t->stream_map.emplace(s->id, s);
@@ -1534,7 +1561,7 @@ static void send_initial_metadata_locked(
1534
1561
  if (t->is_client && t->channelz_socket != nullptr) {
1535
1562
  t->channelz_socket->RecordStreamStartedFromLocal();
1536
1563
  }
1537
- CHECK_EQ(s->send_initial_metadata_finished, nullptr);
1564
+ GRPC_CHECK_EQ(s->send_initial_metadata_finished, nullptr);
1538
1565
  on_complete->next_data.scratch |= t->closure_barrier_may_cover_write;
1539
1566
 
1540
1567
  s->send_initial_metadata_finished = add_closure_barrier(on_complete);
@@ -1552,7 +1579,7 @@ static void send_initial_metadata_locked(
1552
1579
  if (!s->write_closed) {
1553
1580
  if (t->is_client) {
1554
1581
  if (t->closed_with_error.ok()) {
1555
- CHECK_EQ(s->id, 0u);
1582
+ GRPC_CHECK_EQ(s->id, 0u);
1556
1583
  if (t->max_concurrent_streams_reject_on_client &&
1557
1584
  t->stream_map.size() >=
1558
1585
  t->settings.peer().max_concurrent_streams()) {
@@ -1585,7 +1612,7 @@ static void send_initial_metadata_locked(
1585
1612
  false);
1586
1613
  }
1587
1614
  } else {
1588
- CHECK_NE(s->id, 0u);
1615
+ GRPC_CHECK_NE(s->id, 0u);
1589
1616
  grpc_chttp2_mark_stream_writable(t, s);
1590
1617
  if (!(op->send_message &&
1591
1618
  (op->payload->send_message.flags & GRPC_WRITE_BUFFER_HINT))) {
@@ -1689,7 +1716,7 @@ static void send_trailing_metadata_locked(
1689
1716
  grpc_transport_stream_op_batch* op, grpc_chttp2_stream* s,
1690
1717
  grpc_transport_stream_op_batch_payload* op_payload,
1691
1718
  grpc_chttp2_transport* t, grpc_closure* on_complete) {
1692
- CHECK_EQ(s->send_trailing_metadata_finished, nullptr);
1719
+ GRPC_CHECK_EQ(s->send_trailing_metadata_finished, nullptr);
1693
1720
  on_complete->next_data.scratch |= t->closure_barrier_may_cover_write;
1694
1721
  s->send_trailing_metadata_finished = add_closure_barrier(on_complete);
1695
1722
  s->send_trailing_metadata =
@@ -1721,7 +1748,7 @@ static void send_trailing_metadata_locked(
1721
1748
  static void recv_initial_metadata_locked(
1722
1749
  grpc_chttp2_stream* s, grpc_transport_stream_op_batch_payload* op_payload,
1723
1750
  grpc_chttp2_transport* t) {
1724
- CHECK_EQ(s->recv_initial_metadata_ready, nullptr);
1751
+ GRPC_CHECK_EQ(s->recv_initial_metadata_ready, nullptr);
1725
1752
  s->recv_initial_metadata_ready =
1726
1753
  op_payload->recv_initial_metadata.recv_initial_metadata_ready;
1727
1754
  s->recv_initial_metadata =
@@ -1737,7 +1764,7 @@ static void recv_initial_metadata_locked(
1737
1764
  static void recv_message_locked(
1738
1765
  grpc_chttp2_stream* s, grpc_transport_stream_op_batch_payload* op_payload,
1739
1766
  grpc_chttp2_transport* t) {
1740
- CHECK_EQ(s->recv_message_ready, nullptr);
1767
+ GRPC_CHECK_EQ(s->recv_message_ready, nullptr);
1741
1768
  s->recv_message_ready = op_payload->recv_message.recv_message_ready;
1742
1769
  s->recv_message = op_payload->recv_message.recv_message;
1743
1770
  s->recv_message->emplace();
@@ -1750,9 +1777,9 @@ static void recv_message_locked(
1750
1777
  static void recv_trailing_metadata_locked(
1751
1778
  grpc_chttp2_stream* s, grpc_transport_stream_op_batch_payload* op_payload,
1752
1779
  grpc_chttp2_transport* t) {
1753
- CHECK_EQ(s->collecting_stats, nullptr);
1780
+ GRPC_CHECK_EQ(s->collecting_stats, nullptr);
1754
1781
  s->collecting_stats = op_payload->recv_trailing_metadata.collect_stats;
1755
- CHECK_EQ(s->recv_trailing_metadata_finished, nullptr);
1782
+ GRPC_CHECK_EQ(s->recv_trailing_metadata_finished, nullptr);
1756
1783
  s->recv_trailing_metadata_finished =
1757
1784
  op_payload->recv_trailing_metadata.recv_trailing_metadata_ready;
1758
1785
  s->recv_trailing_metadata =
@@ -1776,7 +1803,7 @@ static void perform_stream_op_locked(void* stream_op,
1776
1803
  // client_channel filter.)
1777
1804
  if (!t->is_client && !grpc_core::IsCallTracerInTransportEnabled() &&
1778
1805
  op->send_initial_metadata) {
1779
- s->call_tracer = s->arena->GetContext<grpc_core::CallTracerInterface>();
1806
+ s->call_tracer = s->arena->GetContext<grpc_core::CallTracer>();
1780
1807
  }
1781
1808
  if (GRPC_TRACE_FLAG_ENABLED(http)) {
1782
1809
  LOG(INFO) << "perform_stream_op_locked[s=" << s << "; op=" << op
@@ -1844,14 +1871,14 @@ void grpc_chttp2_transport::PerformStreamOp(
1844
1871
 
1845
1872
  if (!is_client) {
1846
1873
  if (op->send_initial_metadata) {
1847
- CHECK(!op->payload->send_initial_metadata.send_initial_metadata
1848
- ->get(grpc_core::GrpcTimeoutMetadata())
1849
- .has_value());
1874
+ GRPC_CHECK(!op->payload->send_initial_metadata.send_initial_metadata
1875
+ ->get(grpc_core::GrpcTimeoutMetadata())
1876
+ .has_value());
1850
1877
  }
1851
1878
  if (op->send_trailing_metadata) {
1852
- CHECK(!op->payload->send_trailing_metadata.send_trailing_metadata
1853
- ->get(grpc_core::GrpcTimeoutMetadata())
1854
- .has_value());
1879
+ GRPC_CHECK(!op->payload->send_trailing_metadata.send_trailing_metadata
1880
+ ->get(grpc_core::GrpcTimeoutMetadata())
1881
+ .has_value());
1855
1882
  }
1856
1883
  }
1857
1884
 
@@ -1942,8 +1969,8 @@ void grpc_chttp2_retry_initiate_ping(
1942
1969
  static void retry_initiate_ping_locked(
1943
1970
  grpc_core::RefCountedPtr<grpc_chttp2_transport> t,
1944
1971
  GRPC_UNUSED grpc_error_handle error) {
1945
- DCHECK(error.ok());
1946
- CHECK(t->delayed_ping_timer_handle != TaskHandle::kInvalid);
1972
+ GRPC_DCHECK(error.ok());
1973
+ GRPC_CHECK(t->delayed_ping_timer_handle != TaskHandle::kInvalid);
1947
1974
  t->delayed_ping_timer_handle = TaskHandle::kInvalid;
1948
1975
  grpc_chttp2_initiate_write(t.get(),
1949
1976
  GRPC_CHTTP2_INITIATE_WRITE_RETRY_SEND_PING);
@@ -2280,7 +2307,7 @@ void grpc_chttp2_maybe_complete_recv_message(grpc_chttp2_transport* t,
2280
2307
  } else {
2281
2308
  if (s->frame_storage.length != 0) {
2282
2309
  while (true) {
2283
- CHECK_GT(s->frame_storage.length, 0u);
2310
+ GRPC_CHECK_GT(s->frame_storage.length, 0u);
2284
2311
  int64_t min_progress_size;
2285
2312
  auto r = grpc_deframe_unprocessed_incoming_frames(
2286
2313
  s, &min_progress_size, &**s->recv_message, s->recv_message_flags);
@@ -2362,7 +2389,7 @@ void grpc_chttp2_maybe_complete_recv_trailing_metadata(grpc_chttp2_transport* t,
2362
2389
  static grpc_chttp2_transport::RemovedStreamHandle remove_stream(
2363
2390
  grpc_chttp2_transport* t, uint32_t id, grpc_error_handle error) {
2364
2391
  grpc_chttp2_stream* s = t->stream_map.extract(id).mapped();
2365
- DCHECK(s);
2392
+ GRPC_DCHECK(s);
2366
2393
  if (t->incoming_stream == s) {
2367
2394
  t->incoming_stream = nullptr;
2368
2395
  grpc_chttp2_parsing_become_skip_parser(t);
@@ -2391,18 +2418,14 @@ static grpc_chttp2_transport::RemovedStreamHandle remove_stream(
2391
2418
  namespace grpc_core {
2392
2419
  namespace {
2393
2420
 
2394
- Duration TarpitDuration(grpc_chttp2_transport* t) {
2395
- return Duration::Milliseconds(absl::LogUniform<int>(
2396
- SharedBitGen(), t->min_tarpit_duration_ms, t->max_tarpit_duration_ms));
2397
- }
2398
-
2399
2421
  template <typename F>
2400
2422
  void MaybeTarpit(grpc_chttp2_transport* t, bool tarpit, F fn) {
2401
2423
  if (!tarpit || !t->allow_tarpit || t->is_client) {
2402
2424
  fn(t);
2403
2425
  return;
2404
2426
  }
2405
- const auto duration = TarpitDuration(t);
2427
+ const auto duration =
2428
+ TarpitDuration(t->min_tarpit_duration_ms, t->max_tarpit_duration_ms);
2406
2429
  t->event_engine->RunAfter(
2407
2430
  duration, [t = t->Ref(), fn = std::move(fn)]() mutable {
2408
2431
  ExecCtx exec_ctx;
@@ -2621,8 +2644,8 @@ static void close_from_api(grpc_chttp2_transport* t, grpc_chttp2_stream* s,
2621
2644
  grpc_error_get_status(error, s->deadline, &grpc_status, &message, nullptr,
2622
2645
  nullptr);
2623
2646
 
2624
- CHECK_GE(grpc_status, 0);
2625
- CHECK_LT((int)grpc_status, 100);
2647
+ GRPC_CHECK_GE(grpc_status, 0);
2648
+ GRPC_CHECK_LT((int)grpc_status, 100);
2626
2649
 
2627
2650
  auto remove_stream_handle = grpc_chttp2_mark_stream_closed(t, s, 1, 1, error);
2628
2651
  grpc_core::MaybeTarpit(
@@ -2663,7 +2686,7 @@ static void close_from_api(grpc_chttp2_transport* t, grpc_chttp2_stream* s,
2663
2686
  *p++ = '2';
2664
2687
  *p++ = '0';
2665
2688
  *p++ = '0';
2666
- CHECK(p == GRPC_SLICE_END_PTR(http_status_hdr));
2689
+ GRPC_CHECK(p == GRPC_SLICE_END_PTR(http_status_hdr));
2667
2690
  len += static_cast<uint32_t> GRPC_SLICE_LENGTH(http_status_hdr);
2668
2691
 
2669
2692
  content_type_hdr = GRPC_SLICE_MALLOC(31);
@@ -2699,7 +2722,7 @@ static void close_from_api(grpc_chttp2_transport* t, grpc_chttp2_stream* s,
2699
2722
  *p++ = 'r';
2700
2723
  *p++ = 'p';
2701
2724
  *p++ = 'c';
2702
- CHECK(p == GRPC_SLICE_END_PTR(content_type_hdr));
2725
+ GRPC_CHECK(p == GRPC_SLICE_END_PTR(content_type_hdr));
2703
2726
  len += static_cast<uint32_t> GRPC_SLICE_LENGTH(content_type_hdr);
2704
2727
  }
2705
2728
 
@@ -2726,11 +2749,11 @@ static void close_from_api(grpc_chttp2_transport* t, grpc_chttp2_stream* s,
2726
2749
  *p++ = static_cast<uint8_t>('0' + (grpc_status / 10));
2727
2750
  *p++ = static_cast<uint8_t>('0' + (grpc_status % 10));
2728
2751
  }
2729
- CHECK(p == GRPC_SLICE_END_PTR(status_hdr));
2752
+ GRPC_CHECK(p == GRPC_SLICE_END_PTR(status_hdr));
2730
2753
  len += static_cast<uint32_t> GRPC_SLICE_LENGTH(status_hdr);
2731
2754
 
2732
2755
  size_t msg_len = message.length();
2733
- CHECK(msg_len <= UINT32_MAX);
2756
+ GRPC_CHECK(msg_len <= UINT32_MAX);
2734
2757
  grpc_core::VarintWriter<1> msg_len_writer(
2735
2758
  static_cast<uint32_t>(msg_len));
2736
2759
  message_pfx = GRPC_SLICE_MALLOC(14 + msg_len_writer.length());
@@ -2751,7 +2774,7 @@ static void close_from_api(grpc_chttp2_transport* t, grpc_chttp2_stream* s,
2751
2774
  *p++ = 'e';
2752
2775
  msg_len_writer.Write(0, p);
2753
2776
  p += msg_len_writer.length();
2754
- CHECK(p == GRPC_SLICE_END_PTR(message_pfx));
2777
+ GRPC_CHECK(p == GRPC_SLICE_END_PTR(message_pfx));
2755
2778
  len += static_cast<uint32_t> GRPC_SLICE_LENGTH(message_pfx);
2756
2779
  len += static_cast<uint32_t>(msg_len);
2757
2780
 
@@ -2767,7 +2790,7 @@ static void close_from_api(grpc_chttp2_transport* t, grpc_chttp2_stream* s,
2767
2790
  *p++ = static_cast<uint8_t>(id >> 16);
2768
2791
  *p++ = static_cast<uint8_t>(id >> 8);
2769
2792
  *p++ = static_cast<uint8_t>(id);
2770
- CHECK(p == GRPC_SLICE_END_PTR(hdr));
2793
+ GRPC_CHECK(p == GRPC_SLICE_END_PTR(hdr));
2771
2794
 
2772
2795
  grpc_slice_buffer_add(&t->qbuf, hdr);
2773
2796
  if (!sent_initial_metadata) {
@@ -2830,28 +2853,33 @@ static void WithUrgency(grpc_chttp2_transport* t,
2830
2853
  void grpc_chttp2_act_on_flowctl_action(
2831
2854
  const grpc_core::chttp2::FlowControlAction& action,
2832
2855
  grpc_chttp2_transport* t, grpc_chttp2_stream* s) {
2833
- WithUrgency(t, action.send_stream_update(),
2834
- GRPC_CHTTP2_INITIATE_WRITE_STREAM_FLOW_CONTROL, [t, s]() {
2856
+ WithUrgency(/*t=*/t, /*urgency=*/action.send_stream_update(),
2857
+ /*reason=*/GRPC_CHTTP2_INITIATE_WRITE_STREAM_FLOW_CONTROL,
2858
+ /*action=*/[t, s]() {
2835
2859
  if (s->id != 0 && !s->read_closed) {
2836
2860
  grpc_chttp2_mark_stream_writable(t, s);
2837
2861
  }
2838
2862
  });
2839
- WithUrgency(t, action.send_transport_update(),
2840
- GRPC_CHTTP2_INITIATE_WRITE_TRANSPORT_FLOW_CONTROL, []() {});
2841
- WithUrgency(t, action.send_initial_window_update(),
2842
- GRPC_CHTTP2_INITIATE_WRITE_SEND_SETTINGS, [t, &action]() {
2863
+ WithUrgency(/*t=*/t, /*urgency=*/action.send_transport_update(),
2864
+ /*reason=*/GRPC_CHTTP2_INITIATE_WRITE_TRANSPORT_FLOW_CONTROL,
2865
+ /*action=*/[]() {});
2866
+ WithUrgency(/*t=*/t, /*urgency=*/action.send_initial_window_update(),
2867
+ /*reason=*/GRPC_CHTTP2_INITIATE_WRITE_SEND_SETTINGS,
2868
+ /*action=*/[t, &action]() {
2843
2869
  t->settings.mutable_local().SetInitialWindowSize(
2844
2870
  action.initial_window_size());
2845
2871
  });
2846
2872
  WithUrgency(
2847
- t, action.send_max_frame_size_update(),
2848
- GRPC_CHTTP2_INITIATE_WRITE_SEND_SETTINGS, [t, &action]() {
2873
+ /*t=*/t, /*urgency=*/action.send_max_frame_size_update(),
2874
+ /*reason=*/GRPC_CHTTP2_INITIATE_WRITE_SEND_SETTINGS,
2875
+ /*action=*/[t, &action]() {
2849
2876
  t->settings.mutable_local().SetMaxFrameSize(action.max_frame_size());
2850
2877
  });
2851
2878
  if (t->enable_preferred_rx_crypto_frame_advertisement) {
2852
2879
  WithUrgency(
2853
- t, action.preferred_rx_crypto_frame_size_update(),
2854
- GRPC_CHTTP2_INITIATE_WRITE_SEND_SETTINGS, [t, &action]() {
2880
+ /*t=*/t, /*urgency=*/action.preferred_rx_crypto_frame_size_update(),
2881
+ /*reason=*/GRPC_CHTTP2_INITIATE_WRITE_SEND_SETTINGS,
2882
+ /*action=*/[t, &action]() {
2855
2883
  t->settings.mutable_local().SetPreferredReceiveCryptoMessageSize(
2856
2884
  action.preferred_rx_crypto_frame_size());
2857
2885
  });
@@ -3078,7 +3106,7 @@ static void finish_bdp_ping_locked(
3078
3106
  t->flow_control.bdp_estimator()->CompletePing();
3079
3107
  grpc_chttp2_act_on_flowctl_action(t->flow_control.PeriodicUpdate(), t.get(),
3080
3108
  nullptr);
3081
- CHECK(t->next_bdp_ping_timer_handle == TaskHandle::kInvalid);
3109
+ GRPC_CHECK(t->next_bdp_ping_timer_handle == TaskHandle::kInvalid);
3082
3110
  t->next_bdp_ping_timer_handle =
3083
3111
  t->event_engine->RunAfter(next_ping - grpc_core::Timestamp::Now(), [t] {
3084
3112
  grpc_core::ExecCtx exec_ctx;
@@ -3096,7 +3124,7 @@ static void next_bdp_ping_timer_expired(grpc_chttp2_transport* t) {
3096
3124
  static void next_bdp_ping_timer_expired_locked(
3097
3125
  grpc_core::RefCountedPtr<grpc_chttp2_transport> t,
3098
3126
  GRPC_UNUSED grpc_error_handle error) {
3099
- DCHECK(error.ok());
3127
+ GRPC_DCHECK(error.ok());
3100
3128
  t->next_bdp_ping_timer_handle = TaskHandle::kInvalid;
3101
3129
  if (t->flow_control.bdp_estimator()->accumulator() == 0) {
3102
3130
  // Block the bdp ping till we receive more data.
@@ -3164,9 +3192,9 @@ static void init_keepalive_ping(
3164
3192
  static void init_keepalive_ping_locked(
3165
3193
  grpc_core::RefCountedPtr<grpc_chttp2_transport> t,
3166
3194
  GRPC_UNUSED grpc_error_handle error) {
3167
- DCHECK(error.ok());
3168
- CHECK(t->keepalive_state == GRPC_CHTTP2_KEEPALIVE_STATE_WAITING);
3169
- CHECK(t->keepalive_ping_timer_handle != TaskHandle::kInvalid);
3195
+ GRPC_DCHECK(error.ok());
3196
+ GRPC_CHECK(t->keepalive_state == GRPC_CHTTP2_KEEPALIVE_STATE_WAITING);
3197
+ GRPC_CHECK(t->keepalive_ping_timer_handle != TaskHandle::kInvalid);
3170
3198
  t->keepalive_ping_timer_handle = TaskHandle::kInvalid;
3171
3199
  grpc_core::Timestamp now = grpc_core::Timestamp::Now();
3172
3200
  grpc_core::Timestamp adjusted_keepalive_timestamp = std::exchange(
@@ -3217,7 +3245,7 @@ static void finish_keepalive_ping_locked(
3217
3245
  << ": Finish keepalive ping";
3218
3246
  }
3219
3247
  t->keepalive_state = GRPC_CHTTP2_KEEPALIVE_STATE_WAITING;
3220
- CHECK(t->keepalive_ping_timer_handle == TaskHandle::kInvalid);
3248
+ GRPC_CHECK(t->keepalive_ping_timer_handle == TaskHandle::kInvalid);
3221
3249
  t->keepalive_ping_timer_handle =
3222
3250
  t->event_engine->RunAfter(t->keepalive_time, [t] {
3223
3251
  grpc_core::ExecCtx exec_ctx;
@@ -3349,7 +3377,8 @@ static void benign_reclaimer_locked(
3349
3377
  if (error.ok() && t->stream_map.empty()) {
3350
3378
  // Channel with no active streams: send a goaway to try and make it
3351
3379
  // disconnect cleanly
3352
- grpc_core::global_stats().IncrementRqConnectionsDropped();
3380
+ t->resource_quota_telemetry_storage->Increment(
3381
+ grpc_core::ResourceQuotaDomain::kConnectionsDropped);
3353
3382
  GRPC_TRACE_LOG(resource_quota, INFO)
3354
3383
  << "HTTP2: " << t->peer_string.as_string_view()
3355
3384
  << " - send goaway to free memory";
@@ -3380,7 +3409,8 @@ static void destructive_reclaimer_locked(
3380
3409
  GRPC_TRACE_LOG(resource_quota, INFO)
3381
3410
  << "HTTP2: " << t->peer_string.as_string_view()
3382
3411
  << " - abandon stream id " << s->id;
3383
- grpc_core::global_stats().IncrementRqCallsDropped();
3412
+ t->resource_quota_telemetry_storage->Increment(
3413
+ grpc_core::ResourceQuotaDomain::kCallsDropped);
3384
3414
  grpc_chttp2_cancel_stream(
3385
3415
  t.get(), s,
3386
3416
  grpc_error_set_int(
@@ -3477,7 +3507,8 @@ grpc_core::Transport* grpc_create_chttp2_transport(
3477
3507
 
3478
3508
  void grpc_chttp2_transport_start_reading(
3479
3509
  grpc_core::Transport* transport, grpc_slice_buffer* read_buffer,
3480
- grpc_closure* notify_on_receive_settings,
3510
+ absl::AnyInvocable<void(absl::StatusOr<uint32_t>)>
3511
+ notify_on_receive_settings,
3481
3512
  grpc_pollset_set* interested_parties_until_recv_settings,
3482
3513
  grpc_closure* notify_on_close) {
3483
3514
  auto t = reinterpret_cast<grpc_chttp2_transport*>(transport)->Ref();
@@ -3486,30 +3517,157 @@ void grpc_chttp2_transport_start_reading(
3486
3517
  }
3487
3518
  auto* tp = t.get();
3488
3519
  tp->combiner->Run(
3489
- grpc_core::NewClosure([t = std::move(t), notify_on_receive_settings,
3520
+ grpc_core::NewClosure([t = std::move(t),
3521
+ notify_on_receive_settings =
3522
+ std::move(notify_on_receive_settings),
3490
3523
  interested_parties_until_recv_settings,
3491
3524
  notify_on_close](grpc_error_handle) mutable {
3525
+ t->interested_parties_until_recv_settings =
3526
+ interested_parties_until_recv_settings;
3527
+ t->notify_on_receive_settings = std::move(notify_on_receive_settings);
3492
3528
  if (!t->closed_with_error.ok()) {
3493
- if (notify_on_receive_settings != nullptr) {
3494
- if (t->ep != nullptr &&
3495
- interested_parties_until_recv_settings != nullptr) {
3496
- grpc_endpoint_delete_from_pollset_set(
3497
- t->ep.get(), interested_parties_until_recv_settings);
3498
- }
3499
- grpc_core::ExecCtx::Run(DEBUG_LOCATION, notify_on_receive_settings,
3500
- t->closed_with_error);
3501
- }
3529
+ t->MaybeNotifyOnReceiveSettingsLocked(t->closed_with_error);
3502
3530
  if (notify_on_close != nullptr) {
3503
3531
  grpc_core::ExecCtx::Run(DEBUG_LOCATION, notify_on_close,
3504
3532
  t->closed_with_error);
3505
3533
  }
3506
3534
  return;
3507
3535
  }
3508
- t->interested_parties_until_recv_settings =
3509
- interested_parties_until_recv_settings;
3510
- t->notify_on_receive_settings = notify_on_receive_settings;
3511
3536
  t->notify_on_close = notify_on_close;
3512
3537
  read_action_locked(std::move(t), absl::OkStatus());
3513
3538
  }),
3514
3539
  absl::OkStatus());
3515
3540
  }
3541
+
3542
+ void grpc_chttp2_transport::StartWatch(
3543
+ grpc_core::RefCountedPtr<StateWatcher> watcher) {
3544
+ combiner->Run(
3545
+ grpc_core::NewClosure([t = RefAsSubclass<grpc_chttp2_transport>(),
3546
+ watcher = std::move(watcher)](
3547
+ grpc_error_handle) mutable {
3548
+ GRPC_CHECK(t->watcher == nullptr);
3549
+ if (t->ep != nullptr) {
3550
+ auto* interested_parties = watcher->interested_parties();
3551
+ if (interested_parties != nullptr) {
3552
+ grpc_endpoint_add_to_pollset_set(t->ep.get(), interested_parties);
3553
+ }
3554
+ }
3555
+ t->watcher = std::move(watcher);
3556
+ if (!t->closed_with_error.ok()) {
3557
+ // TODO(roth, ctiller): Provide better disconnect info here.
3558
+ t->NotifyStateWatcherOnDisconnectLocked(t->closed_with_error, {});
3559
+ } else {
3560
+ t->NotifyStateWatcherOnPeerMaxConcurrentStreamsUpdateLocked();
3561
+ }
3562
+ }),
3563
+ absl::OkStatus());
3564
+ }
3565
+
3566
+ void grpc_chttp2_transport::StopWatch(
3567
+ grpc_core::RefCountedPtr<StateWatcher> watcher) {
3568
+ combiner->Run(
3569
+ grpc_core::NewClosure([t = RefAsSubclass<grpc_chttp2_transport>(),
3570
+ watcher = std::move(watcher)](grpc_error_handle) {
3571
+ if (t->watcher != watcher) return;
3572
+ if (t->ep != nullptr) {
3573
+ auto* interested_parties = watcher->interested_parties();
3574
+ if (interested_parties != nullptr) {
3575
+ grpc_endpoint_delete_from_pollset_set(t->ep.get(),
3576
+ interested_parties);
3577
+ }
3578
+ }
3579
+ t->watcher.reset();
3580
+ }),
3581
+ absl::OkStatus());
3582
+ }
3583
+
3584
+ void grpc_chttp2_transport::NotifyStateWatcherOnDisconnectLocked(
3585
+ absl::Status status, StateWatcher::DisconnectInfo disconnect_info) {
3586
+ if (watcher == nullptr) return;
3587
+ if (ep != nullptr) {
3588
+ auto* interested_parties = watcher->interested_parties();
3589
+ if (interested_parties != nullptr) {
3590
+ grpc_endpoint_delete_from_pollset_set(ep.get(), interested_parties);
3591
+ }
3592
+ }
3593
+ event_engine->Run([watcher = std::move(watcher), status = std::move(status),
3594
+ disconnect_info]() mutable {
3595
+ grpc_core::ExecCtx exec_ctx;
3596
+ watcher->OnDisconnect(std::move(status), disconnect_info);
3597
+ watcher.reset(); // Before ExecCtx goes out of scope.
3598
+ });
3599
+ }
3600
+
3601
+ void grpc_chttp2_transport::OnPeerMaxConcurrentStreamsUpdateComplete() {
3602
+ combiner->Run(
3603
+ grpc_core::NewClosure(
3604
+ [t = RefAsSubclass<grpc_chttp2_transport>()](grpc_error_handle) {
3605
+ t->max_concurrent_streams_notification_in_flight = false;
3606
+ t->MaybeNotifyStateWatcherOfPeerMaxConcurrentStreamsLocked();
3607
+ }),
3608
+ absl::OkStatus());
3609
+ }
3610
+
3611
+ void grpc_chttp2_transport::
3612
+ MaybeNotifyStateWatcherOfPeerMaxConcurrentStreamsLocked() {
3613
+ if (watcher == nullptr) return;
3614
+ if (last_reported_max_concurrent_streams ==
3615
+ settings.peer().max_concurrent_streams()) {
3616
+ return;
3617
+ }
3618
+ if (max_concurrent_streams_notification_in_flight) return;
3619
+ NotifyStateWatcherOnPeerMaxConcurrentStreamsUpdateLocked();
3620
+ }
3621
+
3622
+ namespace {
3623
+
3624
+ class MaxConcurrentStreamsUpdateOnDone final
3625
+ : public grpc_core::Transport::StateWatcher::
3626
+ MaxConcurrentStreamsUpdateDoneHandle {
3627
+ public:
3628
+ explicit MaxConcurrentStreamsUpdateOnDone(
3629
+ grpc_core::RefCountedPtr<grpc_chttp2_transport> transport)
3630
+ : transport_(std::move(transport)) {}
3631
+
3632
+ ~MaxConcurrentStreamsUpdateOnDone() override {
3633
+ transport_->OnPeerMaxConcurrentStreamsUpdateComplete();
3634
+ }
3635
+
3636
+ private:
3637
+ grpc_core::RefCountedPtr<grpc_chttp2_transport> transport_;
3638
+ };
3639
+
3640
+ } // namespace
3641
+
3642
+ void grpc_chttp2_transport::
3643
+ NotifyStateWatcherOnPeerMaxConcurrentStreamsUpdateLocked() {
3644
+ last_reported_max_concurrent_streams =
3645
+ settings.peer().max_concurrent_streams();
3646
+ max_concurrent_streams_notification_in_flight = true;
3647
+ event_engine->Run([t = RefAsSubclass<grpc_chttp2_transport>(),
3648
+ watcher = watcher,
3649
+ max_concurrent_streams =
3650
+ settings.peer().max_concurrent_streams()]() mutable {
3651
+ grpc_core::ExecCtx exec_ctx;
3652
+ watcher->OnPeerMaxConcurrentStreamsUpdate(
3653
+ max_concurrent_streams,
3654
+ std::make_unique<MaxConcurrentStreamsUpdateOnDone>(std::move(t)));
3655
+ watcher.reset(); // Before ExecCtx goes out of scope.
3656
+ });
3657
+ }
3658
+
3659
+ void grpc_chttp2_transport::MaybeNotifyOnReceiveSettingsLocked(
3660
+ absl::StatusOr<uint32_t> max_concurrent_streams) {
3661
+ if (notify_on_receive_settings == nullptr) return;
3662
+ if (ep != nullptr && interested_parties_until_recv_settings != nullptr) {
3663
+ grpc_endpoint_delete_from_pollset_set(
3664
+ ep.get(), interested_parties_until_recv_settings);
3665
+ interested_parties_until_recv_settings = nullptr;
3666
+ }
3667
+ event_engine->Run(
3668
+ [notify_on_receive_settings = std::move(notify_on_receive_settings),
3669
+ max_concurrent_streams]() mutable {
3670
+ grpc_core::ExecCtx exec_ctx;
3671
+ std::move(notify_on_receive_settings)(max_concurrent_streams);
3672
+ });
3673
+ }