grpc 1.75.0.pre1 → 1.76.0.pre1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (387) hide show
  1. checksums.yaml +4 -4
  2. data/Makefile +18 -5
  3. data/include/grpc/credentials.h +21 -5
  4. data/src/core/call/call_filters.cc +4 -4
  5. data/src/core/call/call_filters.h +36 -36
  6. data/src/core/call/call_spine.h +27 -27
  7. data/src/core/call/client_call.cc +6 -5
  8. data/src/core/call/filter_fusion.h +5 -5
  9. data/src/core/call/metadata_batch.h +3 -3
  10. data/src/core/call/security_context.cc +1 -1
  11. data/src/core/call/server_call.cc +4 -4
  12. data/src/core/call/server_call.h +1 -1
  13. data/src/core/channelz/channelz.cc +12 -18
  14. data/src/core/channelz/channelz.h +32 -16
  15. data/src/core/channelz/channelz_registry.h +11 -0
  16. data/src/core/channelz/property_list.cc +18 -0
  17. data/src/core/channelz/property_list.h +10 -1
  18. data/src/core/channelz/text_encode.cc +66 -0
  19. data/src/core/channelz/text_encode.h +29 -0
  20. data/src/core/channelz/v2tov1/convert.cc +11 -0
  21. data/src/core/channelz/v2tov1/legacy_api.cc +15 -8
  22. data/src/core/channelz/ztrace_collector.h +247 -86
  23. data/src/core/client_channel/backup_poller.cc +5 -6
  24. data/src/core/client_channel/client_channel.cc +20 -13
  25. data/src/core/client_channel/client_channel_filter.cc +53 -45
  26. data/src/core/client_channel/client_channel_filter.h +2 -2
  27. data/src/core/client_channel/client_channel_internal.h +3 -4
  28. data/src/core/client_channel/config_selector.h +3 -3
  29. data/src/core/client_channel/dynamic_filters.cc +3 -3
  30. data/src/core/client_channel/global_subchannel_pool.cc +0 -37
  31. data/src/core/client_channel/global_subchannel_pool.h +0 -27
  32. data/src/core/client_channel/load_balanced_call_destination.cc +7 -7
  33. data/src/core/client_channel/local_subchannel_pool.cc +4 -4
  34. data/src/core/client_channel/retry_filter.h +3 -3
  35. data/src/core/client_channel/retry_filter_legacy_call_data.cc +5 -5
  36. data/src/core/client_channel/subchannel.cc +8 -8
  37. data/src/core/client_channel/subchannel_stream_client.cc +4 -4
  38. data/src/core/config/config_vars.cc +30 -1
  39. data/src/core/config/config_vars.h +21 -0
  40. data/src/core/config/core_configuration.cc +5 -5
  41. data/src/core/config/core_configuration.h +7 -7
  42. data/src/core/config/load_config.cc +12 -0
  43. data/src/core/config/load_config.h +2 -0
  44. data/src/core/credentials/call/call_credentials.h +2 -2
  45. data/src/core/credentials/call/call_creds_util.cc +4 -3
  46. data/src/core/credentials/call/composite/composite_call_credentials.cc +4 -4
  47. data/src/core/credentials/call/external/aws_external_account_credentials.cc +3 -3
  48. data/src/core/credentials/call/external/external_account_credentials.cc +1 -1
  49. data/src/core/credentials/call/external/url_external_account_credentials.cc +1 -1
  50. data/src/core/credentials/call/iam/iam_credentials.cc +4 -4
  51. data/src/core/credentials/call/jwt/json_token.cc +3 -3
  52. data/src/core/credentials/call/jwt/jwt_credentials.cc +2 -2
  53. data/src/core/credentials/call/jwt/jwt_verifier.cc +14 -13
  54. data/src/core/credentials/call/oauth2/oauth2_credentials.cc +20 -12
  55. data/src/core/credentials/call/plugin/plugin_credentials.cc +2 -2
  56. data/src/core/credentials/transport/alts/alts_credentials.cc +4 -4
  57. data/src/core/credentials/transport/alts/alts_security_connector.cc +14 -12
  58. data/src/core/credentials/transport/alts/grpc_alts_credentials_client_options.cc +22 -2
  59. data/src/core/credentials/transport/alts/grpc_alts_credentials_options.cc +10 -1
  60. data/src/core/credentials/transport/alts/grpc_alts_credentials_options.h +31 -0
  61. data/src/core/credentials/transport/alts/grpc_alts_credentials_server_options.cc +8 -3
  62. data/src/core/credentials/transport/composite/composite_channel_credentials.cc +5 -5
  63. data/src/core/credentials/transport/fake/fake_security_connector.cc +2 -2
  64. data/src/core/credentials/transport/google_default/google_default_credentials.cc +78 -28
  65. data/src/core/credentials/transport/insecure/insecure_security_connector.cc +3 -3
  66. data/src/core/credentials/transport/local/local_security_connector.cc +8 -8
  67. data/src/core/credentials/transport/security_connector.cc +5 -5
  68. data/src/core/credentials/transport/ssl/ssl_credentials.cc +12 -12
  69. data/src/core/credentials/transport/ssl/ssl_credentials.h +2 -2
  70. data/src/core/credentials/transport/ssl/ssl_security_connector.cc +3 -3
  71. data/src/core/credentials/transport/tls/certificate_provider_registry.cc +2 -2
  72. data/src/core/credentials/transport/tls/grpc_tls_certificate_distributor.cc +24 -24
  73. data/src/core/credentials/transport/tls/grpc_tls_certificate_provider.cc +5 -5
  74. data/src/core/credentials/transport/tls/grpc_tls_certificate_provider.h +2 -2
  75. data/src/core/credentials/transport/tls/grpc_tls_certificate_verifier.cc +2 -2
  76. data/src/core/credentials/transport/tls/grpc_tls_certificate_verifier.h +2 -2
  77. data/src/core/credentials/transport/tls/grpc_tls_credentials_options.cc +17 -17
  78. data/src/core/credentials/transport/tls/ssl_utils.cc +14 -9
  79. data/src/core/credentials/transport/tls/tls_credentials.cc +2 -2
  80. data/src/core/credentials/transport/tls/tls_security_connector.cc +11 -11
  81. data/src/core/credentials/transport/transport_credentials.cc +2 -2
  82. data/src/core/credentials/transport/transport_credentials.h +2 -2
  83. data/src/core/credentials/transport/xds/xds_credentials.cc +5 -5
  84. data/src/core/ext/filters/channel_idle/legacy_channel_idle_filter.cc +2 -0
  85. data/src/core/ext/filters/gcp_authentication/gcp_authentication_filter.cc +1 -1
  86. data/src/core/ext/filters/http/message_compress/compression_filter.cc +8 -8
  87. data/src/core/ext/filters/http/message_compress/compression_filter.h +3 -3
  88. data/src/core/ext/filters/stateful_session/stateful_session_filter.cc +7 -7
  89. data/src/core/ext/transport/chttp2/alpn/alpn.cc +2 -2
  90. data/src/core/ext/transport/chttp2/client/chttp2_connector.cc +10 -9
  91. data/src/core/ext/transport/chttp2/server/chttp2_server.cc +10 -7
  92. data/src/core/ext/transport/chttp2/transport/bin_decoder.cc +5 -5
  93. data/src/core/ext/transport/chttp2/transport/bin_encoder.cc +6 -6
  94. data/src/core/ext/transport/chttp2/transport/chttp2_transport.cc +96 -88
  95. data/src/core/ext/transport/chttp2/transport/flow_control.cc +3 -3
  96. data/src/core/ext/transport/chttp2/transport/flow_control.h +12 -7
  97. data/src/core/ext/transport/chttp2/transport/flow_control_manager.h +60 -0
  98. data/src/core/ext/transport/chttp2/transport/frame.cc +32 -10
  99. data/src/core/ext/transport/chttp2/transport/frame.h +16 -2
  100. data/src/core/ext/transport/chttp2/transport/frame_data.cc +2 -2
  101. data/src/core/ext/transport/chttp2/transport/frame_goaway.cc +4 -4
  102. data/src/core/ext/transport/chttp2/transport/frame_ping.cc +2 -2
  103. data/src/core/ext/transport/chttp2/transport/frame_rst_stream.cc +2 -2
  104. data/src/core/ext/transport/chttp2/transport/frame_window_update.cc +3 -3
  105. data/src/core/ext/transport/chttp2/transport/header_assembler.h +28 -12
  106. data/src/core/ext/transport/chttp2/transport/hpack_encoder.cc +2 -2
  107. data/src/core/ext/transport/chttp2/transport/hpack_encoder.h +4 -2
  108. data/src/core/ext/transport/chttp2/transport/hpack_encoder_table.cc +8 -8
  109. data/src/core/ext/transport/chttp2/transport/hpack_parse_result.cc +2 -2
  110. data/src/core/ext/transport/chttp2/transport/hpack_parse_result.h +2 -2
  111. data/src/core/ext/transport/chttp2/transport/hpack_parser.cc +27 -27
  112. data/src/core/ext/transport/chttp2/transport/hpack_parser.h +2 -3
  113. data/src/core/ext/transport/chttp2/transport/hpack_parser_table.cc +4 -4
  114. data/src/core/ext/transport/chttp2/transport/http2_client_transport.cc +543 -366
  115. data/src/core/ext/transport/chttp2/transport/http2_client_transport.h +198 -277
  116. data/src/core/ext/transport/chttp2/transport/http2_settings_manager.cc +3 -0
  117. data/src/core/ext/transport/chttp2/transport/http2_settings_manager.h +11 -0
  118. data/src/core/ext/transport/chttp2/transport/http2_settings_promises.h +179 -0
  119. data/src/core/ext/transport/chttp2/transport/http2_transport.cc +51 -23
  120. data/src/core/ext/transport/chttp2/transport/http2_transport.h +13 -6
  121. data/src/core/ext/transport/chttp2/transport/http2_ztrace_collector.h +115 -71
  122. data/src/core/ext/transport/chttp2/transport/internal.h +6 -14
  123. data/src/core/ext/transport/chttp2/transport/message_assembler.h +7 -7
  124. data/src/core/ext/transport/chttp2/transport/parsing.cc +17 -15
  125. data/src/core/ext/transport/chttp2/transport/ping_callbacks.cc +2 -2
  126. data/src/core/ext/transport/chttp2/transport/ping_promise.cc +62 -26
  127. data/src/core/ext/transport/chttp2/transport/ping_promise.h +58 -22
  128. data/src/core/ext/transport/chttp2/transport/stream.h +207 -0
  129. data/src/core/ext/transport/chttp2/transport/stream_data_queue.h +328 -187
  130. data/src/core/ext/transport/chttp2/transport/stream_lists.cc +7 -7
  131. data/src/core/ext/transport/chttp2/transport/transport_common.cc +17 -1
  132. data/src/core/ext/transport/chttp2/transport/transport_common.h +52 -0
  133. data/src/core/ext/transport/chttp2/transport/varint.h +2 -2
  134. data/src/core/ext/transport/chttp2/transport/writable_streams.h +181 -79
  135. data/src/core/ext/transport/chttp2/transport/write_size_policy.cc +2 -2
  136. data/src/core/ext/transport/chttp2/transport/writing.cc +3 -3
  137. data/src/core/ext/transport/inproc/inproc_transport.cc +1 -1
  138. data/src/core/ext/transport/inproc/legacy_inproc_transport.cc +3 -3
  139. data/src/core/ext/upb-gen/src/proto/grpc/channelz/v2/service.upb.h +740 -0
  140. data/src/core/ext/upb-gen/src/proto/grpc/channelz/v2/service.upb_minitable.c +218 -0
  141. data/src/core/ext/upb-gen/src/proto/grpc/channelz/v2/service.upb_minitable.h +46 -0
  142. data/src/core/ext/upb-gen/src/proto/grpc/gcp/handshaker.upb.h +87 -55
  143. data/src/core/ext/upb-gen/src/proto/grpc/gcp/handshaker.upb_minitable.c +23 -21
  144. data/src/core/ext/upbdefs-gen/src/proto/grpc/channelz/v2/channelz.upbdefs.c +80 -0
  145. data/src/core/ext/upbdefs-gen/src/proto/grpc/channelz/v2/channelz.upbdefs.h +47 -0
  146. data/src/core/ext/upbdefs-gen/src/proto/grpc/channelz/v2/service.upbdefs.c +129 -0
  147. data/src/core/ext/upbdefs-gen/src/proto/grpc/channelz/v2/service.upbdefs.h +72 -0
  148. data/src/core/filter/auth/server_auth_filter.cc +2 -2
  149. data/src/core/handshaker/handshaker.cc +3 -3
  150. data/src/core/handshaker/http_connect/http_proxy_mapper.cc +2 -2
  151. data/src/core/handshaker/security/legacy_secure_endpoint.cc +2 -2
  152. data/src/core/handshaker/security/pipelined_secure_endpoint.cc +31 -8
  153. data/src/core/handshaker/security/secure_endpoint.cc +16 -6
  154. data/src/core/handshaker/security/security_handshaker.cc +3 -3
  155. data/src/core/handshaker/tcp_connect/tcp_connect_handshaker.cc +2 -2
  156. data/src/core/lib/channel/channel_stack.cc +8 -5
  157. data/src/core/lib/channel/channel_stack.h +3 -0
  158. data/src/core/lib/channel/channel_stack_builder_impl.cc +1 -0
  159. data/src/core/lib/channel/connected_channel.cc +2 -2
  160. data/src/core/lib/channel/promise_based_filter.cc +69 -64
  161. data/src/core/lib/channel/promise_based_filter.h +16 -15
  162. data/src/core/lib/compression/compression_internal.cc +2 -2
  163. data/src/core/lib/compression/message_compress.cc +7 -7
  164. data/src/core/lib/event_engine/ares_resolver.cc +22 -20
  165. data/src/core/lib/event_engine/cf_engine/cf_engine.cc +2 -2
  166. data/src/core/lib/event_engine/cf_engine/dns_service_resolver.cc +2 -2
  167. data/src/core/lib/event_engine/cf_engine/dns_service_resolver.h +2 -2
  168. data/src/core/lib/event_engine/extensions/channelz.h +2 -2
  169. data/src/core/lib/event_engine/extensions/supports_fd.h +5 -5
  170. data/src/core/lib/event_engine/posix_engine/ev_epoll1_linux.cc +8 -8
  171. data/src/core/lib/event_engine/posix_engine/ev_poll_posix.cc +10 -10
  172. data/src/core/lib/event_engine/posix_engine/lockfree_event.cc +2 -2
  173. data/src/core/lib/event_engine/posix_engine/posix_endpoint.cc +23 -22
  174. data/src/core/lib/event_engine/posix_engine/posix_endpoint.h +11 -11
  175. data/src/core/lib/event_engine/posix_engine/posix_engine.cc +168 -170
  176. data/src/core/lib/event_engine/posix_engine/posix_engine.h +33 -54
  177. data/src/core/lib/event_engine/posix_engine/posix_engine_listener.cc +4 -3
  178. data/src/core/lib/event_engine/posix_engine/posix_engine_listener_utils.cc +5 -5
  179. data/src/core/lib/event_engine/posix_engine/posix_interface.h +1 -1
  180. data/src/core/lib/event_engine/posix_engine/tcp_socket_utils.cc +1 -1
  181. data/src/core/lib/event_engine/posix_engine/timer_manager.cc +3 -3
  182. data/src/core/lib/event_engine/resolved_address.cc +3 -3
  183. data/src/core/lib/event_engine/shim.cc +8 -11
  184. data/src/core/lib/event_engine/shim.h +2 -1
  185. data/src/core/lib/event_engine/slice.cc +2 -2
  186. data/src/core/lib/event_engine/tcp_socket_utils.cc +11 -11
  187. data/src/core/lib/event_engine/thread_pool/work_stealing_thread_pool.cc +7 -7
  188. data/src/core/lib/event_engine/windows/grpc_polled_fd_windows.cc +31 -31
  189. data/src/core/lib/event_engine/windows/iocp.cc +10 -10
  190. data/src/core/lib/event_engine/windows/win_socket.cc +6 -6
  191. data/src/core/lib/event_engine/windows/windows_endpoint.cc +11 -11
  192. data/src/core/lib/event_engine/windows/windows_engine.cc +16 -14
  193. data/src/core/lib/event_engine/windows/windows_listener.cc +7 -7
  194. data/src/core/lib/experiments/experiments.cc +105 -18
  195. data/src/core/lib/experiments/experiments.h +43 -11
  196. data/src/core/lib/iomgr/call_combiner.cc +3 -3
  197. data/src/core/lib/iomgr/endpoint_cfstream.cc +6 -6
  198. data/src/core/lib/iomgr/endpoint_pair_posix.cc +5 -5
  199. data/src/core/lib/iomgr/endpoint_pair_windows.cc +15 -14
  200. data/src/core/lib/iomgr/ev_epoll1_linux.cc +15 -15
  201. data/src/core/lib/iomgr/ev_poll_posix.cc +11 -11
  202. data/src/core/lib/iomgr/event_engine_shims/endpoint.cc +5 -4
  203. data/src/core/lib/iomgr/event_engine_shims/endpoint.h +1 -1
  204. data/src/core/lib/iomgr/iocp_windows.cc +8 -8
  205. data/src/core/lib/iomgr/iomgr_windows.cc +3 -3
  206. data/src/core/lib/iomgr/lockfree_event.cc +2 -2
  207. data/src/core/lib/iomgr/polling_entity.cc +3 -3
  208. data/src/core/lib/iomgr/socket_utils_common_posix.cc +2 -2
  209. data/src/core/lib/iomgr/socket_windows.cc +4 -4
  210. data/src/core/lib/iomgr/tcp_client_posix.cc +4 -4
  211. data/src/core/lib/iomgr/tcp_client_windows.cc +4 -4
  212. data/src/core/lib/iomgr/tcp_posix.cc +42 -42
  213. data/src/core/lib/iomgr/tcp_server.cc +5 -0
  214. data/src/core/lib/iomgr/tcp_server.h +7 -0
  215. data/src/core/lib/iomgr/tcp_server_posix.cc +47 -27
  216. data/src/core/lib/iomgr/tcp_server_utils_posix.h +3 -0
  217. data/src/core/lib/iomgr/tcp_server_utils_posix_common.cc +5 -5
  218. data/src/core/lib/iomgr/tcp_server_utils_posix_ifaddrs.cc +2 -2
  219. data/src/core/lib/iomgr/tcp_server_windows.cc +68 -29
  220. data/src/core/lib/iomgr/tcp_windows.cc +7 -7
  221. data/src/core/lib/iomgr/timer_generic.cc +2 -2
  222. data/src/core/lib/iomgr/timer_manager.cc +2 -2
  223. data/src/core/lib/iomgr/unix_sockets_posix.cc +2 -2
  224. data/src/core/lib/iomgr/unix_sockets_posix_noop.cc +2 -2
  225. data/src/core/lib/promise/activity.cc +2 -2
  226. data/src/core/lib/promise/activity.h +6 -6
  227. data/src/core/lib/promise/context.h +2 -2
  228. data/src/core/lib/promise/detail/join_state.h +9 -9
  229. data/src/core/lib/promise/detail/seq_state.h +13 -13
  230. data/src/core/lib/promise/detail/status.h +2 -2
  231. data/src/core/lib/promise/for_each.h +5 -5
  232. data/src/core/lib/promise/interceptor_list.h +2 -2
  233. data/src/core/lib/promise/latch.h +7 -7
  234. data/src/core/lib/promise/mpsc.cc +26 -26
  235. data/src/core/lib/promise/mpsc.h +2 -2
  236. data/src/core/lib/promise/observable.h +4 -4
  237. data/src/core/lib/promise/party.cc +32 -25
  238. data/src/core/lib/promise/party.h +16 -19
  239. data/src/core/lib/promise/pipe.h +15 -15
  240. data/src/core/lib/promise/poll.h +5 -4
  241. data/src/core/lib/promise/promise.h +0 -2
  242. data/src/core/lib/promise/sleep.cc +3 -1
  243. data/src/core/lib/promise/status_flag.h +7 -7
  244. data/src/core/lib/promise/try_join.h +2 -2
  245. data/src/core/lib/promise/try_seq.h +2 -2
  246. data/src/core/lib/resource_quota/arena.h +15 -2
  247. data/src/core/lib/resource_quota/connection_quota.cc +9 -7
  248. data/src/core/lib/resource_quota/memory_quota.cc +45 -24
  249. data/src/core/lib/resource_quota/memory_quota.h +48 -16
  250. data/src/core/lib/resource_quota/telemetry.h +54 -0
  251. data/src/core/lib/resource_quota/thread_quota.cc +2 -2
  252. data/src/core/lib/resource_tracker/resource_tracker.cc +33 -0
  253. data/src/core/lib/resource_tracker/resource_tracker.h +46 -0
  254. data/src/core/lib/security/authorization/audit_logging.cc +5 -5
  255. data/src/core/lib/security/authorization/grpc_authorization_engine.cc +2 -2
  256. data/src/core/lib/security/authorization/stdout_logger.cc +3 -3
  257. data/src/core/lib/surface/byte_buffer_reader.cc +2 -2
  258. data/src/core/lib/surface/call.cc +16 -14
  259. data/src/core/lib/surface/call.h +1 -1
  260. data/src/core/lib/surface/call_utils.cc +2 -2
  261. data/src/core/lib/surface/call_utils.h +2 -2
  262. data/src/core/lib/surface/channel.cc +4 -4
  263. data/src/core/lib/surface/channel_create.cc +10 -6
  264. data/src/core/lib/surface/channel_init.cc +80 -23
  265. data/src/core/lib/surface/channel_init.h +26 -11
  266. data/src/core/lib/surface/completion_queue.cc +17 -16
  267. data/src/core/lib/surface/completion_queue_factory.cc +7 -7
  268. data/src/core/lib/surface/connection_context.h +45 -2
  269. data/src/core/lib/surface/filter_stack_call.cc +12 -23
  270. data/src/core/lib/surface/filter_stack_call.h +3 -4
  271. data/src/core/lib/surface/legacy_channel.cc +7 -7
  272. data/src/core/lib/surface/validate_metadata.h +2 -2
  273. data/src/core/lib/surface/version.cc +2 -2
  274. data/src/core/lib/transport/bdp_estimator.cc +2 -2
  275. data/src/core/lib/transport/bdp_estimator.h +3 -3
  276. data/src/core/lib/transport/promise_endpoint.cc +3 -3
  277. data/src/core/lib/transport/promise_endpoint.h +8 -8
  278. data/src/core/lib/transport/timeout_encoding.cc +4 -4
  279. data/src/core/load_balancing/child_policy_handler.cc +4 -4
  280. data/src/core/load_balancing/endpoint_list.cc +2 -2
  281. data/src/core/load_balancing/grpclb/grpclb.cc +24 -24
  282. data/src/core/load_balancing/health_check_client.cc +4 -4
  283. data/src/core/load_balancing/health_check_client_internal.h +2 -2
  284. data/src/core/load_balancing/lb_policy_registry.cc +2 -2
  285. data/src/core/load_balancing/oob_backend_metric.cc +4 -4
  286. data/src/core/load_balancing/oob_backend_metric_internal.h +2 -2
  287. data/src/core/load_balancing/outlier_detection/outlier_detection.cc +2 -2
  288. data/src/core/load_balancing/pick_first/pick_first.cc +14 -14
  289. data/src/core/load_balancing/priority/priority.cc +23 -24
  290. data/src/core/load_balancing/ring_hash/ring_hash.cc +3 -3
  291. data/src/core/load_balancing/rls/rls.cc +13 -13
  292. data/src/core/load_balancing/round_robin/round_robin.cc +9 -9
  293. data/src/core/load_balancing/weighted_round_robin/static_stride_scheduler.cc +3 -3
  294. data/src/core/load_balancing/weighted_round_robin/weighted_round_robin.cc +33 -26
  295. data/src/core/load_balancing/weighted_target/weighted_target.cc +5 -5
  296. data/src/core/load_balancing/xds/cds.cc +76 -32
  297. data/src/core/load_balancing/xds/xds_cluster_impl.cc +3 -3
  298. data/src/core/load_balancing/xds/xds_override_host.cc +4 -4
  299. data/src/core/resolver/dns/c_ares/grpc_ares_ev_driver_posix.cc +2 -2
  300. data/src/core/resolver/dns/c_ares/grpc_ares_ev_driver_windows.cc +33 -33
  301. data/src/core/resolver/dns/c_ares/grpc_ares_wrapper.cc +10 -10
  302. data/src/core/resolver/dns/dns_resolver_plugin.cc +6 -3
  303. data/src/core/resolver/dns/event_engine/event_engine_client_channel_resolver.cc +2 -2
  304. data/src/core/resolver/endpoint_addresses.cc +3 -3
  305. data/src/core/resolver/endpoint_addresses.h +3 -0
  306. data/src/core/resolver/fake/fake_resolver.cc +2 -2
  307. data/src/core/resolver/google_c2p/google_c2p_resolver.cc +41 -54
  308. data/src/core/resolver/polling_resolver.cc +3 -3
  309. data/src/core/resolver/resolver_registry.cc +5 -4
  310. data/src/core/resolver/xds/xds_dependency_manager.cc +5 -5
  311. data/src/core/resolver/xds/xds_resolver.cc +9 -9
  312. data/src/core/server/server.cc +38 -38
  313. data/src/core/server/server_call_tracer_filter.h +4 -4
  314. data/src/core/server/server_config_selector_filter.cc +2 -2
  315. data/src/core/server/xds_server_config_fetcher.cc +9 -8
  316. data/src/core/service_config/service_config_impl.h +2 -2
  317. data/src/core/telemetry/call_tracer.cc +39 -49
  318. data/src/core/telemetry/call_tracer.h +199 -22
  319. data/src/core/telemetry/histogram.h +205 -0
  320. data/src/core/telemetry/instrument.cc +719 -0
  321. data/src/core/telemetry/instrument.h +932 -0
  322. data/src/core/telemetry/metrics.cc +13 -5
  323. data/src/core/telemetry/metrics.h +3 -1
  324. data/src/core/telemetry/stats_data.cc +0 -19
  325. data/src/core/telemetry/stats_data.h +0 -19
  326. data/src/core/transport/auth_context.cc +2 -2
  327. data/src/core/tsi/alts/handshaker/alts_handshaker_client.cc +78 -45
  328. data/src/core/tsi/alts/handshaker/alts_handshaker_client.h +1 -0
  329. data/src/core/tsi/alts/handshaker/alts_shared_resource.cc +3 -3
  330. data/src/core/tsi/alts/handshaker/alts_tsi_handshaker.cc +39 -31
  331. data/src/core/tsi/alts/handshaker/alts_tsi_utils.cc +3 -3
  332. data/src/core/tsi/alts/zero_copy_frame_protector/alts_grpc_integrity_only_record_protocol.cc +3 -3
  333. data/src/core/tsi/alts/zero_copy_frame_protector/alts_grpc_record_protocol_common.cc +7 -7
  334. data/src/core/tsi/alts/zero_copy_frame_protector/alts_zero_copy_grpc_protector.cc +3 -3
  335. data/src/core/tsi/fake_transport_security.cc +4 -4
  336. data/src/core/tsi/ssl/key_logging/ssl_key_logging.cc +4 -4
  337. data/src/core/tsi/ssl/session_cache/ssl_session_cache.cc +9 -9
  338. data/src/core/tsi/ssl/session_cache/ssl_session_openssl.cc +3 -3
  339. data/src/core/tsi/ssl_transport_security.cc +26 -25
  340. data/src/core/tsi/ssl_transport_security_utils.cc +9 -9
  341. data/src/core/util/chunked_vector.h +4 -4
  342. data/src/core/util/event_log.cc +2 -2
  343. data/src/core/util/gcp_metadata_query.cc +2 -2
  344. data/src/core/util/grpc_check.cc +22 -0
  345. data/src/core/util/grpc_check.h +103 -0
  346. data/src/core/util/http_client/httpcli.cc +3 -3
  347. data/src/core/util/http_client/parser.cc +4 -4
  348. data/src/core/util/latent_see.h +7 -4
  349. data/src/core/util/lru_cache.h +4 -4
  350. data/src/core/util/memory_usage.h +16 -0
  351. data/src/core/util/posix/directory_reader.cc +3 -2
  352. data/src/core/util/posix/sync.cc +24 -24
  353. data/src/core/util/postmortem_emit.cc +52 -0
  354. data/src/core/util/postmortem_emit.h +30 -0
  355. data/src/core/util/ref_counted_ptr.h +5 -0
  356. data/src/core/util/trie_lookup.h +170 -0
  357. data/src/core/util/unique_ptr_with_bitset.h +5 -5
  358. data/src/core/xds/grpc/xds_bootstrap_grpc.h +6 -1
  359. data/src/core/xds/grpc/xds_certificate_provider.cc +3 -3
  360. data/src/core/xds/grpc/xds_client_grpc.cc +34 -15
  361. data/src/core/xds/grpc/xds_client_grpc.h +4 -1
  362. data/src/core/xds/grpc/xds_cluster_parser.cc +2 -2
  363. data/src/core/xds/grpc/xds_cluster_specifier_plugin.cc +2 -2
  364. data/src/core/xds/grpc/xds_endpoint_parser.cc +2 -2
  365. data/src/core/xds/grpc/xds_http_filter_registry.cc +4 -3
  366. data/src/core/xds/grpc/xds_listener_parser.cc +3 -3
  367. data/src/core/xds/grpc/xds_matcher.cc +277 -0
  368. data/src/core/xds/grpc/xds_matcher.h +432 -0
  369. data/src/core/xds/grpc/xds_matcher_action.cc +47 -0
  370. data/src/core/xds/grpc/xds_matcher_action.h +48 -0
  371. data/src/core/xds/grpc/xds_matcher_context.cc +29 -0
  372. data/src/core/xds/grpc/xds_matcher_context.h +46 -0
  373. data/src/core/xds/grpc/xds_matcher_input.cc +79 -0
  374. data/src/core/xds/grpc/xds_matcher_input.h +105 -0
  375. data/src/core/xds/grpc/xds_matcher_parse.cc +356 -0
  376. data/src/core/xds/grpc/xds_matcher_parse.h +39 -0
  377. data/src/core/xds/grpc/xds_metadata.cc +4 -3
  378. data/src/core/xds/grpc/xds_route_config_parser.cc +6 -6
  379. data/src/core/xds/grpc/xds_routing.cc +3 -3
  380. data/src/core/xds/grpc/xds_transport_grpc.cc +10 -10
  381. data/src/core/xds/xds_client/lrs_client.cc +6 -6
  382. data/src/core/xds/xds_client/xds_client.cc +9 -9
  383. data/src/ruby/ext/grpc/rb_grpc_imports.generated.h +2 -2
  384. data/src/ruby/lib/grpc/version.rb +1 -1
  385. data/third_party/abseil-cpp/absl/container/internal/node_slot_policy.h +95 -0
  386. data/third_party/abseil-cpp/absl/container/node_hash_map.h +687 -0
  387. metadata +37 -2
@@ -47,7 +47,6 @@
47
47
  #include "absl/base/attributes.h"
48
48
  #include "absl/container/flat_hash_map.h"
49
49
  #include "absl/hash/hash.h"
50
- #include "absl/log/check.h"
51
50
  #include "absl/log/log.h"
52
51
  #include "absl/meta/type_traits.h"
53
52
  #include "absl/random/random.h"
@@ -78,6 +77,7 @@
78
77
  #include "src/core/ext/transport/chttp2/transport/ping_callbacks.h"
79
78
  #include "src/core/ext/transport/chttp2/transport/ping_rate_policy.h"
80
79
  #include "src/core/ext/transport/chttp2/transport/stream_lists.h"
80
+ #include "src/core/ext/transport/chttp2/transport/transport_common.h"
81
81
  #include "src/core/ext/transport/chttp2/transport/varint.h"
82
82
  #include "src/core/ext/transport/chttp2/transport/write_size_policy.h"
83
83
  #include "src/core/lib/channel/channel_args.h"
@@ -109,6 +109,7 @@
109
109
  #include "src/core/telemetry/call_tracer.h"
110
110
  #include "src/core/telemetry/context_list_entry.h"
111
111
  #include "src/core/telemetry/default_tcp_tracer.h"
112
+ #include "src/core/telemetry/instrument.h"
112
113
  #include "src/core/telemetry/stats.h"
113
114
  #include "src/core/telemetry/stats_data.h"
114
115
  #include "src/core/telemetry/tcp_tracer.h"
@@ -116,6 +117,7 @@
116
117
  #include "src/core/util/bitset.h"
117
118
  #include "src/core/util/crash.h"
118
119
  #include "src/core/util/debug_location.h"
120
+ #include "src/core/util/grpc_check.h"
119
121
  #include "src/core/util/http_client/parser.h"
120
122
  #include "src/core/util/notification.h"
121
123
  #include "src/core/util/ref_counted.h"
@@ -149,11 +151,6 @@ static grpc_core::Duration g_default_server_keepalive_timeout =
149
151
  static bool g_default_client_keepalive_permit_without_calls = false;
150
152
  static bool g_default_server_keepalive_permit_without_calls = false;
151
153
 
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
154
  #define MAX_CLIENT_STREAM_ID 0x7fffffffu
158
155
 
159
156
  // forward declarations of various callbacks that we'll build closures around
@@ -377,11 +374,11 @@ grpc_chttp2_transport::~grpc_chttp2_transport() {
377
374
  grpc_chttp2_goaway_parser_destroy(&goaway_parser);
378
375
 
379
376
  for (i = 0; i < STREAM_LIST_COUNT; i++) {
380
- CHECK_EQ(lists[i].head, nullptr);
381
- CHECK_EQ(lists[i].tail, nullptr);
377
+ GRPC_CHECK_EQ(lists[i].head, nullptr);
378
+ GRPC_CHECK_EQ(lists[i].tail, nullptr);
382
379
  }
383
380
 
384
- CHECK(stream_map.empty());
381
+ GRPC_CHECK(stream_map.empty());
385
382
  GRPC_COMBINER_UNREF(combiner, "chttp2_transport");
386
383
 
387
384
  while (write_cb_pool) {
@@ -547,7 +544,7 @@ static void read_channel_args(grpc_chttp2_transport* t,
547
544
  static void init_keepalive_pings_if_enabled_locked(
548
545
  grpc_core::RefCountedPtr<grpc_chttp2_transport> t,
549
546
  GRPC_UNUSED grpc_error_handle error) {
550
- DCHECK(error.ok());
547
+ GRPC_DCHECK(error.ok());
551
548
  if (t->keepalive_time != grpc_core::Duration::Infinity()) {
552
549
  t->keepalive_state = GRPC_CHTTP2_KEEPALIVE_STATE_WAITING;
553
550
  t->keepalive_ping_timer_handle =
@@ -630,17 +627,20 @@ void grpc_chttp2_transport::ChannelzDataSource::AddData(
630
627
  }
631
628
  return "unknown";
632
629
  }())
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
- }()));
630
+ .Set("write_state",
631
+ [t]() {
632
+ switch (t->write_state) {
633
+ case GRPC_CHTTP2_WRITE_STATE_IDLE:
634
+ return "idle";
635
+ case GRPC_CHTTP2_WRITE_STATE_WRITING:
636
+ return "writing";
637
+ case GRPC_CHTTP2_WRITE_STATE_WRITING_WITH_MORE:
638
+ return "writing_with_more";
639
+ }
640
+ return "unknown";
641
+ }())
642
+ .Set("tarpit_extra_streams", t->extra_streams)
643
+ .Set("stream_map_size", t->stream_map.size()));
644
644
  }),
645
645
  absl::OkStatus());
646
646
  });
@@ -695,6 +695,11 @@ grpc_chttp2_transport::grpc_chttp2_transport(
695
695
  ->CreateMemoryOwner()),
696
696
  self_reservation(
697
697
  memory_owner.MakeReservation(sizeof(grpc_chttp2_transport))),
698
+ // TODO(ctiller): clean this up so we don't need to RefAsSubclass
699
+ resource_quota_telemetry_storage(
700
+ memory_owner.telemetry_storage()
701
+ ->RefAsSubclass<grpc_core::InstrumentStorage<
702
+ grpc_core::ResourceQuotaDomain>>()),
698
703
  event_engine(
699
704
  channel_args
700
705
  .GetObjectRef<grpc_event_engine::experimental::EventEngine>()),
@@ -736,8 +741,8 @@ grpc_chttp2_transport::grpc_chttp2_transport(
736
741
  }
737
742
  }
738
743
 
739
- CHECK(strlen(GRPC_CHTTP2_CLIENT_CONNECT_STRING) ==
740
- GRPC_CHTTP2_CLIENT_CONNECT_STRLEN);
744
+ GRPC_CHECK(strlen(GRPC_CHTTP2_CLIENT_CONNECT_STRING) ==
745
+ GRPC_CHTTP2_CLIENT_CONNECT_STRLEN);
741
746
 
742
747
  grpc_slice_buffer_init(&read_buffer);
743
748
  if (is_client) {
@@ -849,7 +854,7 @@ static void close_transport_locked(grpc_chttp2_transport* t,
849
854
  grpc_error_add_child(t->close_transport_on_writes_finished, error);
850
855
  return;
851
856
  }
852
- CHECK(!error.ok());
857
+ GRPC_CHECK(!error.ok());
853
858
  t->closed_with_error = error;
854
859
  connectivity_state_set(t, GRPC_CHANNEL_SHUTDOWN, absl::Status(),
855
860
  "close_transport");
@@ -893,7 +898,7 @@ static void close_transport_locked(grpc_chttp2_transport* t,
893
898
  while (grpc_chttp2_list_pop_writable_stream(t, &s)) {
894
899
  GRPC_CHTTP2_STREAM_UNREF(s, "chttp2_writing:close");
895
900
  }
896
- CHECK(t->write_state == GRPC_CHTTP2_WRITE_STATE_IDLE);
901
+ GRPC_CHECK(t->write_state == GRPC_CHTTP2_WRITE_STATE_IDLE);
897
902
  if (t->interested_parties_until_recv_settings != nullptr) {
898
903
  grpc_endpoint_delete_from_pollset_set(
899
904
  t->ep.get(), t->interested_parties_until_recv_settings);
@@ -954,7 +959,7 @@ grpc_chttp2_stream::grpc_chttp2_stream(grpc_chttp2_transport* t,
954
959
  arena(arena),
955
960
  flow_control(&t->flow_control),
956
961
  call_tracer_wrapper(this),
957
- call_tracer(arena->GetContext<grpc_core::CallTracerInterface>()) {
962
+ call_tracer(arena->GetContext<grpc_core::CallTracer>()) {
958
963
  t->streams_allocated.fetch_add(1, std::memory_order_relaxed);
959
964
  if (server_data) {
960
965
  id = static_cast<uint32_t>(reinterpret_cast<uintptr_t>(server_data));
@@ -983,9 +988,9 @@ grpc_chttp2_stream::~grpc_chttp2_stream() {
983
988
  }
984
989
  }
985
990
 
986
- CHECK((write_closed && read_closed) || id == 0);
991
+ GRPC_CHECK((write_closed && read_closed) || id == 0);
987
992
  if (id != 0) {
988
- CHECK_EQ(t->stream_map.count(id), 0u);
993
+ GRPC_CHECK_EQ(t->stream_map.count(id), 0u);
989
994
  }
990
995
 
991
996
  grpc_slice_buffer_destroy(&frame_storage);
@@ -998,11 +1003,11 @@ grpc_chttp2_stream::~grpc_chttp2_stream() {
998
1003
  }
999
1004
  }
1000
1005
 
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);
1006
+ GRPC_CHECK_EQ(send_initial_metadata_finished, nullptr);
1007
+ GRPC_CHECK_EQ(send_trailing_metadata_finished, nullptr);
1008
+ GRPC_CHECK_EQ(recv_initial_metadata_ready, nullptr);
1009
+ GRPC_CHECK_EQ(recv_message_ready, nullptr);
1010
+ GRPC_CHECK_EQ(recv_trailing_metadata_finished, nullptr);
1006
1011
  grpc_slice_buffer_destroy(&flow_controlled_buffer);
1007
1012
  grpc_core::ExecCtx::Run(DEBUG_LOCATION, destroy_stream_arg, absl::OkStatus());
1008
1013
  }
@@ -1035,7 +1040,7 @@ grpc_chttp2_stream* grpc_chttp2_parsing_accept_stream(grpc_chttp2_transport* t,
1035
1040
  return nullptr;
1036
1041
  }
1037
1042
  grpc_chttp2_stream* accepting = nullptr;
1038
- CHECK_EQ(t->accepting_stream, nullptr);
1043
+ GRPC_CHECK_EQ(t->accepting_stream, nullptr);
1039
1044
  t->accepting_stream = &accepting;
1040
1045
  t->accept_stream_cb(t->accept_stream_cb_user_data, t,
1041
1046
  reinterpret_cast<void*>(id));
@@ -1138,7 +1143,7 @@ static void write_action_begin_locked(
1138
1143
  grpc_core::RefCountedPtr<grpc_chttp2_transport> t,
1139
1144
  grpc_error_handle /*error_ignored*/) {
1140
1145
  GRPC_LATENT_SEE_ALWAYS_ON_SCOPE("write_action_begin_locked");
1141
- CHECK(t->write_state != GRPC_CHTTP2_WRITE_STATE_IDLE);
1146
+ GRPC_CHECK(t->write_state != GRPC_CHTTP2_WRITE_STATE_IDLE);
1142
1147
  grpc_chttp2_begin_write_result r;
1143
1148
  if (!t->closed_with_error.ok()) {
1144
1149
  r.writing = false;
@@ -1152,7 +1157,7 @@ static void write_action_begin_locked(
1152
1157
  begin_writing_desc(r.partial));
1153
1158
  write_action(t.get(), std::move(r.tcp_call_tracers));
1154
1159
  if (t->reading_paused_on_pending_induced_frames) {
1155
- CHECK_EQ(t->num_pending_induced_frames, 0u);
1160
+ GRPC_CHECK_EQ(t->num_pending_induced_frames, 0u);
1156
1161
  // We had paused reading, because we had many induced frames (SETTINGS
1157
1162
  // ACK, PINGS ACK and RST_STREAMS) pending in t->qbuf. Now that we have
1158
1163
  // been able to flush qbuf, we can resume reading.
@@ -1403,7 +1408,7 @@ static void maybe_start_some_streams(grpc_chttp2_transport* t) {
1403
1408
  << " allocating new grpc_chttp2_stream " << s << " to id "
1404
1409
  << t->next_stream_id;
1405
1410
 
1406
- CHECK_EQ(s->id, 0u);
1411
+ GRPC_CHECK_EQ(s->id, 0u);
1407
1412
  s->id = t->next_stream_id;
1408
1413
  t->next_stream_id += 2;
1409
1414
 
@@ -1534,7 +1539,7 @@ static void send_initial_metadata_locked(
1534
1539
  if (t->is_client && t->channelz_socket != nullptr) {
1535
1540
  t->channelz_socket->RecordStreamStartedFromLocal();
1536
1541
  }
1537
- CHECK_EQ(s->send_initial_metadata_finished, nullptr);
1542
+ GRPC_CHECK_EQ(s->send_initial_metadata_finished, nullptr);
1538
1543
  on_complete->next_data.scratch |= t->closure_barrier_may_cover_write;
1539
1544
 
1540
1545
  s->send_initial_metadata_finished = add_closure_barrier(on_complete);
@@ -1552,7 +1557,7 @@ static void send_initial_metadata_locked(
1552
1557
  if (!s->write_closed) {
1553
1558
  if (t->is_client) {
1554
1559
  if (t->closed_with_error.ok()) {
1555
- CHECK_EQ(s->id, 0u);
1560
+ GRPC_CHECK_EQ(s->id, 0u);
1556
1561
  if (t->max_concurrent_streams_reject_on_client &&
1557
1562
  t->stream_map.size() >=
1558
1563
  t->settings.peer().max_concurrent_streams()) {
@@ -1585,7 +1590,7 @@ static void send_initial_metadata_locked(
1585
1590
  false);
1586
1591
  }
1587
1592
  } else {
1588
- CHECK_NE(s->id, 0u);
1593
+ GRPC_CHECK_NE(s->id, 0u);
1589
1594
  grpc_chttp2_mark_stream_writable(t, s);
1590
1595
  if (!(op->send_message &&
1591
1596
  (op->payload->send_message.flags & GRPC_WRITE_BUFFER_HINT))) {
@@ -1689,7 +1694,7 @@ static void send_trailing_metadata_locked(
1689
1694
  grpc_transport_stream_op_batch* op, grpc_chttp2_stream* s,
1690
1695
  grpc_transport_stream_op_batch_payload* op_payload,
1691
1696
  grpc_chttp2_transport* t, grpc_closure* on_complete) {
1692
- CHECK_EQ(s->send_trailing_metadata_finished, nullptr);
1697
+ GRPC_CHECK_EQ(s->send_trailing_metadata_finished, nullptr);
1693
1698
  on_complete->next_data.scratch |= t->closure_barrier_may_cover_write;
1694
1699
  s->send_trailing_metadata_finished = add_closure_barrier(on_complete);
1695
1700
  s->send_trailing_metadata =
@@ -1721,7 +1726,7 @@ static void send_trailing_metadata_locked(
1721
1726
  static void recv_initial_metadata_locked(
1722
1727
  grpc_chttp2_stream* s, grpc_transport_stream_op_batch_payload* op_payload,
1723
1728
  grpc_chttp2_transport* t) {
1724
- CHECK_EQ(s->recv_initial_metadata_ready, nullptr);
1729
+ GRPC_CHECK_EQ(s->recv_initial_metadata_ready, nullptr);
1725
1730
  s->recv_initial_metadata_ready =
1726
1731
  op_payload->recv_initial_metadata.recv_initial_metadata_ready;
1727
1732
  s->recv_initial_metadata =
@@ -1737,7 +1742,7 @@ static void recv_initial_metadata_locked(
1737
1742
  static void recv_message_locked(
1738
1743
  grpc_chttp2_stream* s, grpc_transport_stream_op_batch_payload* op_payload,
1739
1744
  grpc_chttp2_transport* t) {
1740
- CHECK_EQ(s->recv_message_ready, nullptr);
1745
+ GRPC_CHECK_EQ(s->recv_message_ready, nullptr);
1741
1746
  s->recv_message_ready = op_payload->recv_message.recv_message_ready;
1742
1747
  s->recv_message = op_payload->recv_message.recv_message;
1743
1748
  s->recv_message->emplace();
@@ -1750,9 +1755,9 @@ static void recv_message_locked(
1750
1755
  static void recv_trailing_metadata_locked(
1751
1756
  grpc_chttp2_stream* s, grpc_transport_stream_op_batch_payload* op_payload,
1752
1757
  grpc_chttp2_transport* t) {
1753
- CHECK_EQ(s->collecting_stats, nullptr);
1758
+ GRPC_CHECK_EQ(s->collecting_stats, nullptr);
1754
1759
  s->collecting_stats = op_payload->recv_trailing_metadata.collect_stats;
1755
- CHECK_EQ(s->recv_trailing_metadata_finished, nullptr);
1760
+ GRPC_CHECK_EQ(s->recv_trailing_metadata_finished, nullptr);
1756
1761
  s->recv_trailing_metadata_finished =
1757
1762
  op_payload->recv_trailing_metadata.recv_trailing_metadata_ready;
1758
1763
  s->recv_trailing_metadata =
@@ -1776,7 +1781,7 @@ static void perform_stream_op_locked(void* stream_op,
1776
1781
  // client_channel filter.)
1777
1782
  if (!t->is_client && !grpc_core::IsCallTracerInTransportEnabled() &&
1778
1783
  op->send_initial_metadata) {
1779
- s->call_tracer = s->arena->GetContext<grpc_core::CallTracerInterface>();
1784
+ s->call_tracer = s->arena->GetContext<grpc_core::CallTracer>();
1780
1785
  }
1781
1786
  if (GRPC_TRACE_FLAG_ENABLED(http)) {
1782
1787
  LOG(INFO) << "perform_stream_op_locked[s=" << s << "; op=" << op
@@ -1844,14 +1849,14 @@ void grpc_chttp2_transport::PerformStreamOp(
1844
1849
 
1845
1850
  if (!is_client) {
1846
1851
  if (op->send_initial_metadata) {
1847
- CHECK(!op->payload->send_initial_metadata.send_initial_metadata
1848
- ->get(grpc_core::GrpcTimeoutMetadata())
1849
- .has_value());
1852
+ GRPC_CHECK(!op->payload->send_initial_metadata.send_initial_metadata
1853
+ ->get(grpc_core::GrpcTimeoutMetadata())
1854
+ .has_value());
1850
1855
  }
1851
1856
  if (op->send_trailing_metadata) {
1852
- CHECK(!op->payload->send_trailing_metadata.send_trailing_metadata
1853
- ->get(grpc_core::GrpcTimeoutMetadata())
1854
- .has_value());
1857
+ GRPC_CHECK(!op->payload->send_trailing_metadata.send_trailing_metadata
1858
+ ->get(grpc_core::GrpcTimeoutMetadata())
1859
+ .has_value());
1855
1860
  }
1856
1861
  }
1857
1862
 
@@ -1942,8 +1947,8 @@ void grpc_chttp2_retry_initiate_ping(
1942
1947
  static void retry_initiate_ping_locked(
1943
1948
  grpc_core::RefCountedPtr<grpc_chttp2_transport> t,
1944
1949
  GRPC_UNUSED grpc_error_handle error) {
1945
- DCHECK(error.ok());
1946
- CHECK(t->delayed_ping_timer_handle != TaskHandle::kInvalid);
1950
+ GRPC_DCHECK(error.ok());
1951
+ GRPC_CHECK(t->delayed_ping_timer_handle != TaskHandle::kInvalid);
1947
1952
  t->delayed_ping_timer_handle = TaskHandle::kInvalid;
1948
1953
  grpc_chttp2_initiate_write(t.get(),
1949
1954
  GRPC_CHTTP2_INITIATE_WRITE_RETRY_SEND_PING);
@@ -2280,7 +2285,7 @@ void grpc_chttp2_maybe_complete_recv_message(grpc_chttp2_transport* t,
2280
2285
  } else {
2281
2286
  if (s->frame_storage.length != 0) {
2282
2287
  while (true) {
2283
- CHECK_GT(s->frame_storage.length, 0u);
2288
+ GRPC_CHECK_GT(s->frame_storage.length, 0u);
2284
2289
  int64_t min_progress_size;
2285
2290
  auto r = grpc_deframe_unprocessed_incoming_frames(
2286
2291
  s, &min_progress_size, &**s->recv_message, s->recv_message_flags);
@@ -2362,7 +2367,7 @@ void grpc_chttp2_maybe_complete_recv_trailing_metadata(grpc_chttp2_transport* t,
2362
2367
  static grpc_chttp2_transport::RemovedStreamHandle remove_stream(
2363
2368
  grpc_chttp2_transport* t, uint32_t id, grpc_error_handle error) {
2364
2369
  grpc_chttp2_stream* s = t->stream_map.extract(id).mapped();
2365
- DCHECK(s);
2370
+ GRPC_DCHECK(s);
2366
2371
  if (t->incoming_stream == s) {
2367
2372
  t->incoming_stream = nullptr;
2368
2373
  grpc_chttp2_parsing_become_skip_parser(t);
@@ -2391,18 +2396,14 @@ static grpc_chttp2_transport::RemovedStreamHandle remove_stream(
2391
2396
  namespace grpc_core {
2392
2397
  namespace {
2393
2398
 
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
2399
  template <typename F>
2400
2400
  void MaybeTarpit(grpc_chttp2_transport* t, bool tarpit, F fn) {
2401
2401
  if (!tarpit || !t->allow_tarpit || t->is_client) {
2402
2402
  fn(t);
2403
2403
  return;
2404
2404
  }
2405
- const auto duration = TarpitDuration(t);
2405
+ const auto duration =
2406
+ TarpitDuration(t->min_tarpit_duration_ms, t->max_tarpit_duration_ms);
2406
2407
  t->event_engine->RunAfter(
2407
2408
  duration, [t = t->Ref(), fn = std::move(fn)]() mutable {
2408
2409
  ExecCtx exec_ctx;
@@ -2621,8 +2622,8 @@ static void close_from_api(grpc_chttp2_transport* t, grpc_chttp2_stream* s,
2621
2622
  grpc_error_get_status(error, s->deadline, &grpc_status, &message, nullptr,
2622
2623
  nullptr);
2623
2624
 
2624
- CHECK_GE(grpc_status, 0);
2625
- CHECK_LT((int)grpc_status, 100);
2625
+ GRPC_CHECK_GE(grpc_status, 0);
2626
+ GRPC_CHECK_LT((int)grpc_status, 100);
2626
2627
 
2627
2628
  auto remove_stream_handle = grpc_chttp2_mark_stream_closed(t, s, 1, 1, error);
2628
2629
  grpc_core::MaybeTarpit(
@@ -2663,7 +2664,7 @@ static void close_from_api(grpc_chttp2_transport* t, grpc_chttp2_stream* s,
2663
2664
  *p++ = '2';
2664
2665
  *p++ = '0';
2665
2666
  *p++ = '0';
2666
- CHECK(p == GRPC_SLICE_END_PTR(http_status_hdr));
2667
+ GRPC_CHECK(p == GRPC_SLICE_END_PTR(http_status_hdr));
2667
2668
  len += static_cast<uint32_t> GRPC_SLICE_LENGTH(http_status_hdr);
2668
2669
 
2669
2670
  content_type_hdr = GRPC_SLICE_MALLOC(31);
@@ -2699,7 +2700,7 @@ static void close_from_api(grpc_chttp2_transport* t, grpc_chttp2_stream* s,
2699
2700
  *p++ = 'r';
2700
2701
  *p++ = 'p';
2701
2702
  *p++ = 'c';
2702
- CHECK(p == GRPC_SLICE_END_PTR(content_type_hdr));
2703
+ GRPC_CHECK(p == GRPC_SLICE_END_PTR(content_type_hdr));
2703
2704
  len += static_cast<uint32_t> GRPC_SLICE_LENGTH(content_type_hdr);
2704
2705
  }
2705
2706
 
@@ -2726,11 +2727,11 @@ static void close_from_api(grpc_chttp2_transport* t, grpc_chttp2_stream* s,
2726
2727
  *p++ = static_cast<uint8_t>('0' + (grpc_status / 10));
2727
2728
  *p++ = static_cast<uint8_t>('0' + (grpc_status % 10));
2728
2729
  }
2729
- CHECK(p == GRPC_SLICE_END_PTR(status_hdr));
2730
+ GRPC_CHECK(p == GRPC_SLICE_END_PTR(status_hdr));
2730
2731
  len += static_cast<uint32_t> GRPC_SLICE_LENGTH(status_hdr);
2731
2732
 
2732
2733
  size_t msg_len = message.length();
2733
- CHECK(msg_len <= UINT32_MAX);
2734
+ GRPC_CHECK(msg_len <= UINT32_MAX);
2734
2735
  grpc_core::VarintWriter<1> msg_len_writer(
2735
2736
  static_cast<uint32_t>(msg_len));
2736
2737
  message_pfx = GRPC_SLICE_MALLOC(14 + msg_len_writer.length());
@@ -2751,7 +2752,7 @@ static void close_from_api(grpc_chttp2_transport* t, grpc_chttp2_stream* s,
2751
2752
  *p++ = 'e';
2752
2753
  msg_len_writer.Write(0, p);
2753
2754
  p += msg_len_writer.length();
2754
- CHECK(p == GRPC_SLICE_END_PTR(message_pfx));
2755
+ GRPC_CHECK(p == GRPC_SLICE_END_PTR(message_pfx));
2755
2756
  len += static_cast<uint32_t> GRPC_SLICE_LENGTH(message_pfx);
2756
2757
  len += static_cast<uint32_t>(msg_len);
2757
2758
 
@@ -2767,7 +2768,7 @@ static void close_from_api(grpc_chttp2_transport* t, grpc_chttp2_stream* s,
2767
2768
  *p++ = static_cast<uint8_t>(id >> 16);
2768
2769
  *p++ = static_cast<uint8_t>(id >> 8);
2769
2770
  *p++ = static_cast<uint8_t>(id);
2770
- CHECK(p == GRPC_SLICE_END_PTR(hdr));
2771
+ GRPC_CHECK(p == GRPC_SLICE_END_PTR(hdr));
2771
2772
 
2772
2773
  grpc_slice_buffer_add(&t->qbuf, hdr);
2773
2774
  if (!sent_initial_metadata) {
@@ -2830,28 +2831,33 @@ static void WithUrgency(grpc_chttp2_transport* t,
2830
2831
  void grpc_chttp2_act_on_flowctl_action(
2831
2832
  const grpc_core::chttp2::FlowControlAction& action,
2832
2833
  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]() {
2834
+ WithUrgency(/*t=*/t, /*urgency=*/action.send_stream_update(),
2835
+ /*reason=*/GRPC_CHTTP2_INITIATE_WRITE_STREAM_FLOW_CONTROL,
2836
+ /*action=*/[t, s]() {
2835
2837
  if (s->id != 0 && !s->read_closed) {
2836
2838
  grpc_chttp2_mark_stream_writable(t, s);
2837
2839
  }
2838
2840
  });
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]() {
2841
+ WithUrgency(/*t=*/t, /*urgency=*/action.send_transport_update(),
2842
+ /*reason=*/GRPC_CHTTP2_INITIATE_WRITE_TRANSPORT_FLOW_CONTROL,
2843
+ /*action=*/[]() {});
2844
+ WithUrgency(/*t=*/t, /*urgency=*/action.send_initial_window_update(),
2845
+ /*reason=*/GRPC_CHTTP2_INITIATE_WRITE_SEND_SETTINGS,
2846
+ /*action=*/[t, &action]() {
2843
2847
  t->settings.mutable_local().SetInitialWindowSize(
2844
2848
  action.initial_window_size());
2845
2849
  });
2846
2850
  WithUrgency(
2847
- t, action.send_max_frame_size_update(),
2848
- GRPC_CHTTP2_INITIATE_WRITE_SEND_SETTINGS, [t, &action]() {
2851
+ /*t=*/t, /*urgency=*/action.send_max_frame_size_update(),
2852
+ /*reason=*/GRPC_CHTTP2_INITIATE_WRITE_SEND_SETTINGS,
2853
+ /*action=*/[t, &action]() {
2849
2854
  t->settings.mutable_local().SetMaxFrameSize(action.max_frame_size());
2850
2855
  });
2851
2856
  if (t->enable_preferred_rx_crypto_frame_advertisement) {
2852
2857
  WithUrgency(
2853
- t, action.preferred_rx_crypto_frame_size_update(),
2854
- GRPC_CHTTP2_INITIATE_WRITE_SEND_SETTINGS, [t, &action]() {
2858
+ /*t=*/t, /*urgency=*/action.preferred_rx_crypto_frame_size_update(),
2859
+ /*reason=*/GRPC_CHTTP2_INITIATE_WRITE_SEND_SETTINGS,
2860
+ /*action=*/[t, &action]() {
2855
2861
  t->settings.mutable_local().SetPreferredReceiveCryptoMessageSize(
2856
2862
  action.preferred_rx_crypto_frame_size());
2857
2863
  });
@@ -3078,7 +3084,7 @@ static void finish_bdp_ping_locked(
3078
3084
  t->flow_control.bdp_estimator()->CompletePing();
3079
3085
  grpc_chttp2_act_on_flowctl_action(t->flow_control.PeriodicUpdate(), t.get(),
3080
3086
  nullptr);
3081
- CHECK(t->next_bdp_ping_timer_handle == TaskHandle::kInvalid);
3087
+ GRPC_CHECK(t->next_bdp_ping_timer_handle == TaskHandle::kInvalid);
3082
3088
  t->next_bdp_ping_timer_handle =
3083
3089
  t->event_engine->RunAfter(next_ping - grpc_core::Timestamp::Now(), [t] {
3084
3090
  grpc_core::ExecCtx exec_ctx;
@@ -3096,7 +3102,7 @@ static void next_bdp_ping_timer_expired(grpc_chttp2_transport* t) {
3096
3102
  static void next_bdp_ping_timer_expired_locked(
3097
3103
  grpc_core::RefCountedPtr<grpc_chttp2_transport> t,
3098
3104
  GRPC_UNUSED grpc_error_handle error) {
3099
- DCHECK(error.ok());
3105
+ GRPC_DCHECK(error.ok());
3100
3106
  t->next_bdp_ping_timer_handle = TaskHandle::kInvalid;
3101
3107
  if (t->flow_control.bdp_estimator()->accumulator() == 0) {
3102
3108
  // Block the bdp ping till we receive more data.
@@ -3164,9 +3170,9 @@ static void init_keepalive_ping(
3164
3170
  static void init_keepalive_ping_locked(
3165
3171
  grpc_core::RefCountedPtr<grpc_chttp2_transport> t,
3166
3172
  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);
3173
+ GRPC_DCHECK(error.ok());
3174
+ GRPC_CHECK(t->keepalive_state == GRPC_CHTTP2_KEEPALIVE_STATE_WAITING);
3175
+ GRPC_CHECK(t->keepalive_ping_timer_handle != TaskHandle::kInvalid);
3170
3176
  t->keepalive_ping_timer_handle = TaskHandle::kInvalid;
3171
3177
  grpc_core::Timestamp now = grpc_core::Timestamp::Now();
3172
3178
  grpc_core::Timestamp adjusted_keepalive_timestamp = std::exchange(
@@ -3217,7 +3223,7 @@ static void finish_keepalive_ping_locked(
3217
3223
  << ": Finish keepalive ping";
3218
3224
  }
3219
3225
  t->keepalive_state = GRPC_CHTTP2_KEEPALIVE_STATE_WAITING;
3220
- CHECK(t->keepalive_ping_timer_handle == TaskHandle::kInvalid);
3226
+ GRPC_CHECK(t->keepalive_ping_timer_handle == TaskHandle::kInvalid);
3221
3227
  t->keepalive_ping_timer_handle =
3222
3228
  t->event_engine->RunAfter(t->keepalive_time, [t] {
3223
3229
  grpc_core::ExecCtx exec_ctx;
@@ -3349,7 +3355,8 @@ static void benign_reclaimer_locked(
3349
3355
  if (error.ok() && t->stream_map.empty()) {
3350
3356
  // Channel with no active streams: send a goaway to try and make it
3351
3357
  // disconnect cleanly
3352
- grpc_core::global_stats().IncrementRqConnectionsDropped();
3358
+ t->resource_quota_telemetry_storage->Increment(
3359
+ grpc_core::ResourceQuotaDomain::kConnectionsDropped);
3353
3360
  GRPC_TRACE_LOG(resource_quota, INFO)
3354
3361
  << "HTTP2: " << t->peer_string.as_string_view()
3355
3362
  << " - send goaway to free memory";
@@ -3380,7 +3387,8 @@ static void destructive_reclaimer_locked(
3380
3387
  GRPC_TRACE_LOG(resource_quota, INFO)
3381
3388
  << "HTTP2: " << t->peer_string.as_string_view()
3382
3389
  << " - abandon stream id " << s->id;
3383
- grpc_core::global_stats().IncrementRqCallsDropped();
3390
+ t->resource_quota_telemetry_storage->Increment(
3391
+ grpc_core::ResourceQuotaDomain::kCallsDropped);
3384
3392
  grpc_chttp2_cancel_stream(
3385
3393
  t.get(), s,
3386
3394
  grpc_error_set_int(
@@ -28,7 +28,6 @@
28
28
  #include <tuple>
29
29
  #include <vector>
30
30
 
31
- #include "absl/log/check.h"
32
31
  #include "absl/log/log.h"
33
32
  #include "absl/strings/str_cat.h"
34
33
  #include "absl/strings/str_format.h"
@@ -37,6 +36,7 @@
37
36
  #include "src/core/ext/transport/chttp2/transport/http2_settings_manager.h"
38
37
  #include "src/core/lib/experiments/experiments.h"
39
38
  #include "src/core/lib/resource_quota/memory_quota.h"
39
+ #include "src/core/util/grpc_check.h"
40
40
  #include "src/core/util/useful.h"
41
41
 
42
42
  namespace grpc_core {
@@ -333,7 +333,7 @@ void StreamFlowControl::SentUpdate(uint32_t announce) {
333
333
  TransportFlowControl::IncomingUpdateContext tfc_upd(tfc_);
334
334
  pending_size_ = std::nullopt;
335
335
  tfc_upd.UpdateAnnouncedWindowDelta(&announced_window_delta_, announce);
336
- CHECK_EQ(DesiredAnnounceSize(), 0u);
336
+ GRPC_CHECK_EQ(DesiredAnnounceSize(), 0u);
337
337
  std::ignore = tfc_upd.MakeAction();
338
338
  }
339
339
 
@@ -383,7 +383,7 @@ FlowControlAction StreamFlowControl::UpdateAction(FlowControlAction action) {
383
383
 
384
384
  void StreamFlowControl::IncomingUpdateContext::SetPendingSize(
385
385
  int64_t pending_size) {
386
- CHECK_GE(pending_size, 0);
386
+ GRPC_CHECK_GE(pending_size, 0);
387
387
  sfc_->pending_size_ = pending_size;
388
388
  }
389
389
 
@@ -29,7 +29,6 @@
29
29
  #include <utility>
30
30
 
31
31
  #include "absl/functional/function_ref.h"
32
- #include "absl/log/check.h"
33
32
  #include "absl/status/status.h"
34
33
  #include "absl/strings/string_view.h"
35
34
  #include "src/core/channelz/property_list.h"
@@ -38,6 +37,7 @@
38
37
  #include "src/core/lib/debug/trace.h"
39
38
  #include "src/core/lib/resource_quota/memory_quota.h"
40
39
  #include "src/core/lib/transport/bdp_estimator.h"
40
+ #include "src/core/util/grpc_check.h"
41
41
  #include "src/core/util/time.h"
42
42
 
43
43
  namespace grpc {
@@ -59,10 +59,6 @@ static constexpr const uint32_t kMaxInitialWindowSize = (1u << 30);
59
59
  static constexpr const int64_t kMaxWindowDelta = (1u << 20);
60
60
  static constexpr const int kDefaultPreferredRxCryptoFrameSize = INT_MAX;
61
61
 
62
- // TODO(ctiller): clean up when flow_control_fixes is enabled by default
63
- static constexpr uint32_t kFrameSize = 1024 * 1024;
64
- static constexpr const uint32_t kMinInitialWindowSize = 128;
65
-
66
62
  class TransportFlowControl;
67
63
  class StreamFlowControl;
68
64
 
@@ -94,6 +90,15 @@ class GRPC_MUST_USE_RESULT FlowControlAction {
94
90
  Urgency preferred_rx_crypto_frame_size_update() const {
95
91
  return preferred_rx_crypto_frame_size_update_;
96
92
  }
93
+ bool AnyUpdateImmediately() const {
94
+ return send_stream_update_ == Urgency::UPDATE_IMMEDIATELY ||
95
+ send_transport_update_ == Urgency::UPDATE_IMMEDIATELY ||
96
+ send_initial_window_update_ == Urgency::UPDATE_IMMEDIATELY ||
97
+ send_max_frame_size_update_ == Urgency::UPDATE_IMMEDIATELY ||
98
+ preferred_rx_crypto_frame_size_update_ ==
99
+ Urgency::UPDATE_IMMEDIATELY;
100
+ }
101
+
97
102
  uint32_t initial_window_size() const { return initial_window_size_; }
98
103
  uint32_t max_frame_size() const { return max_frame_size_; }
99
104
  uint32_t preferred_rx_crypto_frame_size() const {
@@ -130,7 +135,7 @@ class GRPC_MUST_USE_RESULT FlowControlAction {
130
135
  static const char* UrgencyString(Urgency u);
131
136
  std::string DebugString() const;
132
137
 
133
- void AssertEmpty() { CHECK(*this == FlowControlAction()); }
138
+ void AssertEmpty() { GRPC_CHECK(*this == FlowControlAction()); }
134
139
 
135
140
  bool operator==(const FlowControlAction& other) const {
136
141
  return send_stream_update_ == other.send_stream_update_ &&
@@ -193,7 +198,7 @@ class TransportFlowControl final {
193
198
  class IncomingUpdateContext {
194
199
  public:
195
200
  explicit IncomingUpdateContext(TransportFlowControl* tfc) : tfc_(tfc) {}
196
- ~IncomingUpdateContext() { CHECK_EQ(tfc_, nullptr); }
201
+ ~IncomingUpdateContext() { GRPC_CHECK_EQ(tfc_, nullptr); }
197
202
 
198
203
  IncomingUpdateContext(const IncomingUpdateContext&) = delete;
199
204
  IncomingUpdateContext& operator=(const IncomingUpdateContext&) = delete;
@@ -0,0 +1,60 @@
1
+ //
2
+ //
3
+ // Copyright 2025 gRPC authors.
4
+ //
5
+ // Licensed under the Apache License, Version 2.0 (the "License");
6
+ // you may not use this file except in compliance with the License.
7
+ // You may obtain a copy of the License at
8
+ //
9
+ // http://www.apache.org/licenses/LICENSE-2.0
10
+ //
11
+ // Unless required by applicable law or agreed to in writing, software
12
+ // distributed under the License is distributed on an "AS IS" BASIS,
13
+ // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14
+ // See the License for the specific language governing permissions and
15
+ // limitations under the License.
16
+ //
17
+ //
18
+
19
+ #ifndef GRPC_SRC_CORE_EXT_TRANSPORT_CHTTP2_TRANSPORT_FLOW_CONTROL_MANAGER_H
20
+ #define GRPC_SRC_CORE_EXT_TRANSPORT_CHTTP2_TRANSPORT_FLOW_CONTROL_MANAGER_H
21
+
22
+ #include <cstdint>
23
+ #include <vector>
24
+
25
+ #include "absl/container/flat_hash_map.h"
26
+ #include "src/core/ext/transport/chttp2/transport/flow_control.h"
27
+ #include "src/core/ext/transport/chttp2/transport/frame.h"
28
+ #include "src/core/ext/transport/chttp2/transport/http2_settings.h"
29
+
30
+ namespace grpc_core {
31
+ namespace http2 {
32
+
33
+ constexpr chttp2::FlowControlAction::Urgency kNoActionNeeded =
34
+ chttp2::FlowControlAction::Urgency::NO_ACTION_NEEDED;
35
+ constexpr chttp2::FlowControlAction::Urgency kUpdateImmediately =
36
+ chttp2::FlowControlAction::Urgency::UPDATE_IMMEDIATELY;
37
+
38
+ // Function to update local settings based on FlowControlAction.
39
+ // This function does the settings related tasks equivalent to
40
+ // grpc_chttp2_act_on_flowctl_action in chttp2_transport.cc
41
+ inline void ActOnFlowControlActionSettings(
42
+ const chttp2::FlowControlAction& action, Http2Settings& local_settings,
43
+ const bool enable_preferred_rx_crypto_frame_advertisement) {
44
+ if (action.send_initial_window_update() != kNoActionNeeded) {
45
+ local_settings.SetInitialWindowSize(action.initial_window_size());
46
+ }
47
+ if (action.send_max_frame_size_update() != kNoActionNeeded) {
48
+ local_settings.SetMaxFrameSize(action.max_frame_size());
49
+ }
50
+ if (enable_preferred_rx_crypto_frame_advertisement &&
51
+ action.preferred_rx_crypto_frame_size_update() != kNoActionNeeded) {
52
+ local_settings.SetPreferredReceiveCryptoMessageSize(
53
+ action.preferred_rx_crypto_frame_size());
54
+ }
55
+ }
56
+
57
+ } // namespace http2
58
+ } // namespace grpc_core
59
+
60
+ #endif // GRPC_SRC_CORE_EXT_TRANSPORT_CHTTP2_TRANSPORT_FLOW_CONTROL_MANAGER_H