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
@@ -20,13 +20,13 @@
20
20
 
21
21
  #include <grpc/support/port_platform.h>
22
22
 
23
- #include "absl/log/check.h"
24
23
  #include "absl/log/log.h"
25
24
  #include "src/core/ext/transport/chttp2/transport/internal.h"
26
25
  #include "src/core/ext/transport/chttp2/transport/legacy_frame.h"
27
26
  #include "src/core/lib/debug/trace.h"
28
27
  #include "src/core/lib/experiments/experiments.h"
29
28
  #include "src/core/util/bitset.h"
29
+ #include "src/core/util/grpc_check.h"
30
30
 
31
31
  static const char* stream_list_id_string(grpc_chttp2_stream_list_id id) {
32
32
  switch (id) {
@@ -59,7 +59,7 @@ static bool stream_list_pop(grpc_chttp2_transport* t,
59
59
  grpc_chttp2_stream* s = t->lists[id].head;
60
60
  if (s) {
61
61
  grpc_chttp2_stream* new_head = s->links[id].next;
62
- CHECK(s->included.is_set(id));
62
+ GRPC_CHECK(s->included.is_set(id));
63
63
  if (new_head) {
64
64
  t->lists[id].head = new_head;
65
65
  new_head->links[id].prev = nullptr;
@@ -79,12 +79,12 @@ static bool stream_list_pop(grpc_chttp2_transport* t,
79
79
 
80
80
  static void stream_list_remove(grpc_chttp2_transport* t, grpc_chttp2_stream* s,
81
81
  grpc_chttp2_stream_list_id id) {
82
- CHECK(s->included.is_set(id));
82
+ GRPC_CHECK(s->included.is_set(id));
83
83
  s->included.clear(id);
84
84
  if (s->links[id].prev) {
85
85
  s->links[id].prev->links[id].next = s->links[id].next;
86
86
  } else {
87
- CHECK(t->lists[id].head == s);
87
+ GRPC_CHECK(t->lists[id].head == s);
88
88
  t->lists[id].head = s->links[id].next;
89
89
  }
90
90
  if (s->links[id].next) {
@@ -112,7 +112,7 @@ static void stream_list_add_tail(grpc_chttp2_transport* t,
112
112
  grpc_chttp2_stream* s,
113
113
  grpc_chttp2_stream_list_id id) {
114
114
  grpc_chttp2_stream* old_tail;
115
- CHECK(!s->included.is_set(id));
115
+ GRPC_CHECK(!s->included.is_set(id));
116
116
  old_tail = t->lists[id].tail;
117
117
  s->links[id].next = nullptr;
118
118
  s->links[id].prev = old_tail;
@@ -132,7 +132,7 @@ static void stream_list_add_head(grpc_chttp2_transport* t,
132
132
  grpc_chttp2_stream* s,
133
133
  grpc_chttp2_stream_list_id id) {
134
134
  grpc_chttp2_stream* old_head;
135
- CHECK(!s->included.is_set(id));
135
+ GRPC_CHECK(!s->included.is_set(id));
136
136
  old_head = t->lists[id].head;
137
137
  s->links[id].next = old_head;
138
138
  s->links[id].prev = nullptr;
@@ -170,7 +170,7 @@ static bool stream_list_prepend(grpc_chttp2_transport* t, grpc_chttp2_stream* s,
170
170
 
171
171
  bool grpc_chttp2_list_add_writable_stream(grpc_chttp2_transport* t,
172
172
  grpc_chttp2_stream* s) {
173
- CHECK_NE(s->id, 0u);
173
+ GRPC_CHECK_NE(s->id, 0u);
174
174
  if (grpc_core::IsPrioritizeFinishedRequestsEnabled() &&
175
175
  s->send_trailing_metadata != nullptr) {
176
176
  return stream_list_prepend(t, s, GRPC_CHTTP2_LIST_WRITABLE);
@@ -16,4 +16,20 @@
16
16
  //
17
17
  //
18
18
 
19
- namespace grpc_core {} // namespace grpc_core
19
+ #include "src/core/ext/transport/chttp2/transport/transport_common.h"
20
+
21
+ #include <cstdint>
22
+
23
+ #include "absl/random/random.h"
24
+ #include "src/core/util/shared_bit_gen.h"
25
+ #include "src/core/util/time.h"
26
+
27
+ namespace grpc_core {
28
+
29
+ Duration TarpitDuration(const int min_tarpit_duration_ms,
30
+ const int max_tarpit_duration_ms) {
31
+ return Duration::Milliseconds(absl::LogUniform<int>(
32
+ SharedBitGen(), min_tarpit_duration_ms, max_tarpit_duration_ms));
33
+ }
34
+
35
+ } // namespace grpc_core
@@ -19,9 +19,61 @@
19
19
  #ifndef GRPC_SRC_CORE_EXT_TRANSPORT_CHTTP2_TRANSPORT_TRANSPORT_COMMON_H
20
20
  #define GRPC_SRC_CORE_EXT_TRANSPORT_CHTTP2_TRANSPORT_TRANSPORT_COMMON_H
21
21
 
22
+ #include <cstdint>
23
+
24
+ #include "src/core/util/time.h"
25
+
22
26
  // For an HTTP2 connection, this must be sent before the settings frame is sent.
23
27
  #define GRPC_CHTTP2_CLIENT_CONNECT_STRING "PRI * HTTP/2.0\r\n\r\nSM\r\n\r\n"
24
28
  #define GRPC_CHTTP2_CLIENT_CONNECT_STRLEN \
25
29
  (sizeof(GRPC_CHTTP2_CLIENT_CONNECT_STRING) - 1)
26
30
 
31
+ // EXPERIMENTAL: control tarpitting in chttp2
32
+ #define GRPC_ARG_HTTP_ALLOW_TARPIT "grpc.http.tarpit"
33
+ #define GRPC_ARG_HTTP_TARPIT_MIN_DURATION_MS "grpc.http.tarpit_min_duration_ms"
34
+ #define GRPC_ARG_HTTP_TARPIT_MAX_DURATION_MS "grpc.http.tarpit_max_duration_ms"
35
+
36
+ // EXPERIMENTAL: provide protection against overloading a server with too many
37
+ // requests: wait for streams to be deallocated before they stop counting
38
+ // against MAX_CONCURRENT_STREAMS
39
+ #define GRPC_ARG_MAX_CONCURRENT_STREAMS_OVERLOAD_PROTECTION \
40
+ "grpc.http.overload_protection"
41
+
42
+ // EXPERIMENTAL: Fail requests at the client if the client is over max
43
+ // concurrent streams, so they may be retried elsewhere.
44
+ #define GRPC_ARG_MAX_CONCURRENT_STREAMS_REJECT_ON_CLIENT \
45
+ "grpc.http.max_concurrent_streams_reject_on_client"
46
+
47
+ namespace grpc_core {
48
+
49
+ Duration TarpitDuration(int min_tarpit_duration_ms, int max_tarpit_duration_ms);
50
+
51
+ namespace http2 {
52
+ enum class WritableStreamPriority : uint8_t {
53
+ // Highest priority
54
+ kStreamClosed = 0,
55
+ kWaitForTransportFlowControl,
56
+ // Lowest Priority
57
+ kDefault,
58
+ kLastPriority
59
+ };
60
+
61
+ // Debug helper function to convert a WritableStreamPriority to a string.
62
+ inline std::string GetWritableStreamPriorityString(
63
+ const WritableStreamPriority priority) {
64
+ switch (priority) {
65
+ case WritableStreamPriority::kStreamClosed:
66
+ return "StreamClosed";
67
+ case WritableStreamPriority::kWaitForTransportFlowControl:
68
+ return "WaitForTransportFlowControl";
69
+ case WritableStreamPriority::kDefault:
70
+ return "Default";
71
+ default:
72
+ return "unknown";
73
+ }
74
+ }
75
+ } // namespace http2
76
+
77
+ } // namespace grpc_core
78
+
27
79
  #endif // GRPC_SRC_CORE_EXT_TRANSPORT_CHTTP2_TRANSPORT_TRANSPORT_COMMON_H
@@ -23,7 +23,7 @@
23
23
  #include <stdint.h>
24
24
  #include <stdlib.h>
25
25
 
26
- #include "absl/log/check.h"
26
+ #include "src/core/util/grpc_check.h"
27
27
 
28
28
  // Helpers for hpack varint encoding
29
29
 
@@ -49,7 +49,7 @@ class VarintWriter {
49
49
  explicit VarintWriter(size_t value)
50
50
  : value_(value),
51
51
  length_(value < kMaxInPrefix ? 1 : VarintLength(value - kMaxInPrefix)) {
52
- CHECK(value <= UINT32_MAX);
52
+ GRPC_CHECK(value <= UINT32_MAX);
53
53
  }
54
54
 
55
55
  size_t value() const { return value_; }
@@ -21,28 +21,42 @@
21
21
 
22
22
  #include <queue>
23
23
 
24
- #include "absl/log/check.h"
25
24
  #include "absl/log/log.h"
25
+ #include "src/core/ext/transport/chttp2/transport/transport_common.h"
26
26
  #include "src/core/lib/promise/if.h"
27
27
  #include "src/core/lib/promise/mpsc.h"
28
28
  #include "src/core/lib/promise/race.h"
29
29
  #include "src/core/lib/promise/try_seq.h"
30
+ #include "src/core/util/grpc_check.h"
30
31
 
31
32
  namespace grpc_core {
32
33
  namespace http2 {
33
34
 
35
+ namespace writable_streams_internal {
36
+ template <typename StreamPtr, typename = void>
37
+ struct HasGetStreamId {
38
+ static constexpr bool value = false;
39
+ };
40
+
41
+ template <typename StreamPtr>
42
+ struct HasGetStreamId<
43
+ StreamPtr,
44
+ absl::void_t<decltype(std::declval<StreamPtr>()->GetStreamId())>> {
45
+ static constexpr bool value =
46
+ std::is_same_v<decltype(std::declval<StreamPtr>()->GetStreamId()),
47
+ uint32_t>;
48
+ };
49
+
50
+ } // namespace writable_streams_internal
51
+
34
52
  #define GRPC_WRITABLE_STREAMS_DEBUG VLOG(2)
35
53
 
54
+ template <typename StreamPtr>
36
55
  class WritableStreams {
56
+ static_assert(writable_streams_internal::HasGetStreamId<StreamPtr>::value,
57
+ "StreamPtr must have a GetStreamId() function");
58
+
37
59
  public:
38
- enum class StreamPriority : uint8_t {
39
- // Highest priority
40
- kStreamClosed = 0,
41
- kWaitForTransportFlowControl,
42
- // Lowest Priority
43
- kDefault,
44
- kLastPriority
45
- };
46
60
  explicit WritableStreams(
47
61
  const uint32_t max_queue_size = std::numeric_limits<uint32_t>::max())
48
62
  : queue_(max_queue_size), sender_(queue_.MakeSender()) {}
@@ -55,32 +69,35 @@ class WritableStreams {
55
69
 
56
70
  // Enqueues a stream id with the given priority.
57
71
  // If this returns error, transport MUST be closed.
58
- absl::Status Enqueue(const uint32_t stream_id,
59
- const StreamPriority priority) {
72
+ absl::Status Enqueue(const StreamPtr stream,
73
+ const WritableStreamPriority priority) {
60
74
  // Streams waiting for transport flow control MUST not be added to list of
61
75
  // writable streams via this API, instead they MUST be added via
62
76
  // BlockedOnTransportFlowControl. The reason being there is no merit in
63
77
  // re-adding the stream to mpsc queue while it can be immediately enqueued
64
78
  // to the prioritized queue.
65
- DCHECK(priority != StreamPriority::kWaitForTransportFlowControl);
79
+ GRPC_DCHECK(priority !=
80
+ WritableStreamPriority::kWaitForTransportFlowControl);
66
81
  StatusFlag status = sender_.UnbufferedImmediateSend(
67
- StreamIDAndPriority{stream_id, priority}, /*tokens*/ 1);
68
- GRPC_WRITABLE_STREAMS_DEBUG << "UnbufferedImmediateEnqueue stream id "
69
- << stream_id << " with priority "
70
- << GetPriorityString(priority) << " status "
71
- << status;
72
- return (status.ok()) ? absl::OkStatus()
73
- : absl::InternalError(absl::StrCat(
74
- "Failed to enqueue stream id ", stream_id));
82
+ StreamIDAndPriority{stream, priority}, /*tokens*/ 1);
83
+ GRPC_WRITABLE_STREAMS_DEBUG
84
+ << "UnbufferedImmediateEnqueue stream id: " << stream->GetStreamId()
85
+ << " with priority " << GetWritableStreamPriorityString(priority)
86
+ << " status " << status;
87
+
88
+ return (status.ok())
89
+ ? absl::OkStatus()
90
+ : absl::InternalError(absl::StrCat(
91
+ "Failed to enqueue stream id: ", stream->GetStreamId()));
75
92
  }
76
93
 
77
94
  // A synchronous function to add a stream id to the transport flow control
78
95
  // wait list.
79
- absl::Status BlockedOnTransportFlowControl(const uint32_t stream_id) {
80
- prioritized_queue_.Push(stream_id,
81
- StreamPriority::kWaitForTransportFlowControl);
82
- GRPC_WRITABLE_STREAMS_DEBUG << "BlockedOnTransportFlowControl stream id "
83
- << stream_id;
96
+ absl::Status BlockedOnTransportFlowControl(const StreamPtr stream) {
97
+ prioritized_queue_.Push(
98
+ stream, WritableStreamPriority::kWaitForTransportFlowControl);
99
+ GRPC_WRITABLE_STREAMS_DEBUG << "BlockedOnTransportFlowControl stream id: "
100
+ << stream->GetStreamId();
84
101
  return absl::OkStatus();
85
102
  }
86
103
 
@@ -100,29 +117,33 @@ class WritableStreams {
100
117
  // prioritized queue.
101
118
  // 6. Return the stream id with the highest priority.
102
119
  // If this returns error, transport MUST be closed.
120
+ // TODO(akshitpatel) : [PH2][P2] - This will be deprecated in favor of
121
+ // WaitForReady.
103
122
  auto Next(const bool transport_tokens_available) {
104
123
  // TODO(akshitpatel) : [PH2][P2] - Need to add an immediate dequeue option
105
124
  // for the mpsc queue in favor of the race.
106
125
 
107
- return AssertResultType<absl::StatusOr<uint32_t>>(TrySeq(
126
+ return AssertResultType<absl::StatusOr<StreamPtr>>(TrySeq(
108
127
  // The current MPSC queue does not have a version of NextBatch that
109
128
  // resolves immediately. So we made this Race to ensure that the
110
129
  // "Dequeue" from the mpsc resolves immediately - Either with data , or
111
130
  // empty.
112
- Race(queue_.NextBatch(kMaxBatchSize),
113
- Immediate(ValueOrFailure<std::vector<StreamIDAndPriority>>(
114
- std::vector<StreamIDAndPriority>()))),
115
- [this,
116
- transport_tokens_available](std::vector<StreamIDAndPriority> batch) {
131
+ Race(
132
+ queue_.NextBatch(kMaxBatchSize),
133
+ Immediate(
134
+ ValueOrFailure<std::vector<std::optional<StreamIDAndPriority>>>(
135
+ std::vector<std::optional<StreamIDAndPriority>>()))),
136
+ [this, transport_tokens_available](
137
+ std::vector<std::optional<StreamIDAndPriority>> batch) {
117
138
  AddToPrioritizedQueue(batch);
118
- std::optional<uint32_t> stream_id =
139
+ std::optional<StreamPtr> stream =
119
140
  prioritized_queue_.Pop(transport_tokens_available);
120
141
  return If(
121
- stream_id.has_value(),
122
- [stream_id]() -> absl::StatusOr<uint32_t> {
123
- GRPC_WRITABLE_STREAMS_DEBUG << "Next stream id "
124
- << stream_id.value();
125
- return stream_id.value();
142
+ stream.has_value(),
143
+ [stream]() -> absl::StatusOr<StreamPtr> {
144
+ GRPC_WRITABLE_STREAMS_DEBUG << "Next stream id: "
145
+ << (*stream)->GetStreamId();
146
+ return stream.value();
126
147
  },
127
148
  [this, transport_tokens_available] {
128
149
  GRPC_WRITABLE_STREAMS_DEBUG << "Query queue for next batch";
@@ -131,22 +152,24 @@ class WritableStreams {
131
152
  // on mpsc queue to get a new batch of stream ids.
132
153
  queue_.NextBatch(kMaxBatchSize),
133
154
  [this, transport_tokens_available](
134
- ValueOrFailure<std::vector<StreamIDAndPriority>> batch)
135
- -> absl::StatusOr<uint32_t> {
155
+ ValueOrFailure<
156
+ std::vector<std::optional<StreamIDAndPriority>>>
157
+ batch) -> absl::StatusOr<StreamPtr> {
136
158
  if (batch.ok()) {
137
159
  GRPC_WRITABLE_STREAMS_DEBUG << "Next batch size "
138
160
  << batch.value().size();
139
161
  AddToPrioritizedQueue(batch.value());
140
- std::optional<uint32_t> stream_id =
162
+ std::optional<StreamPtr> stream =
141
163
  prioritized_queue_.Pop(transport_tokens_available);
142
164
  // TODO(akshitpatel) : [PH2][P4] - This DCHECK should
143
165
  // ideally be fine. But in case if queue_.NextBatch
144
166
  // spuriously returns an empty batch, move to a Loop
145
167
  // to avoid this.
146
- DCHECK(stream_id.has_value());
147
- GRPC_WRITABLE_STREAMS_DEBUG << "Next stream id "
148
- << stream_id.value();
149
- return stream_id.value();
168
+ GRPC_DCHECK(stream.has_value());
169
+ GRPC_WRITABLE_STREAMS_DEBUG
170
+ << "Next stream id: "
171
+ << stream.value()->GetStreamId();
172
+ return stream.value();
150
173
  }
151
174
  return absl::InternalError("Failed to read from queue");
152
175
  });
@@ -154,18 +177,55 @@ class WritableStreams {
154
177
  }));
155
178
  }
156
179
 
157
- // Debug helper function to convert a StreamPriority to a string.
158
- static inline std::string GetPriorityString(const StreamPriority priority) {
159
- switch (priority) {
160
- case StreamPriority::kStreamClosed:
161
- return "StreamClosed";
162
- case StreamPriority::kWaitForTransportFlowControl:
163
- return "WaitForTransportFlowControl";
164
- case StreamPriority::kDefault:
165
- return "Default";
166
- default:
167
- return "unknown";
168
- }
180
+ // Wait for a stream to be ready to be dequeued. This is a blocking call.
181
+ // This returns a promise that resolves when there is a writeable stream ready
182
+ // to be dequeued or ForceReadyForWrite() is called.
183
+ auto WaitForReady(const bool transport_tokens_available) {
184
+ return TrySeq(
185
+ If(
186
+ PrioritizedQueueHasWritableStreams(transport_tokens_available),
187
+ [this]() {
188
+ // TODO(akshitpatel) : [PH2][P3] - This is temporary. Replace with
189
+ // native MPSC::ImmediateNextBatch.
190
+ // We already have writable streams in the prioritized queue.
191
+ // We check for any newly added streams to the un-prioritised
192
+ // queue. We dequeue to honor the priority of any newly enqueued
193
+ // streams.
194
+ return Race(
195
+ queue_.NextBatch(kMaxBatchSize),
196
+ Immediate(ValueOrFailure<
197
+ std::vector<std::optional<StreamIDAndPriority>>>(
198
+ std::vector<std::optional<StreamIDAndPriority>>())));
199
+ },
200
+ // The prioritised queue is empty. So we wait for something to
201
+ // enter the un-prioritised queue and then dequeue it.
202
+ [this]() { return queue_.NextBatch(kMaxBatchSize); }),
203
+ [this](std::vector<std::optional<StreamIDAndPriority>> batch) {
204
+ AddToPrioritizedQueue(batch);
205
+ return Empty{};
206
+ });
207
+ }
208
+
209
+ // Synchronously drain the prioritized queue.
210
+ std::optional<StreamPtr> ImmediateNext(
211
+ const bool transport_tokens_available) {
212
+ return prioritized_queue_.Pop(transport_tokens_available);
213
+ }
214
+
215
+ // Force resolve WaitForReady. This is used to induce a write cycle on the
216
+ // transport.
217
+ absl::Status ForceReadyForWrite() {
218
+ StatusFlag status =
219
+ sender_.UnbufferedImmediateSend(std::nullopt, /*tokens*/ 1);
220
+ GRPC_WRITABLE_STREAMS_DEBUG << "ForceReadyForWrite status " << status;
221
+ return (status.ok()) ? absl::OkStatus()
222
+ : absl::InternalError(
223
+ "Failed to enqueue to list of writable streams");
224
+ }
225
+
226
+ bool TestOnlyPriorityQueueHasWritableStreams(
227
+ const bool transport_tokens_available) const {
228
+ return !prioritized_queue_.HasNoWritableStreams(transport_tokens_available);
169
229
  }
170
230
 
171
231
  private:
@@ -176,21 +236,26 @@ class WritableStreams {
176
236
  // Pushes a stream id with the given priority to the queue. Sorting is done
177
237
  // based on the priority. If the priority is higher than the max priority,
178
238
  // it will be set to the default priority.
179
- void Push(const uint32_t stream_id, StreamPriority priority) {
180
- if (priority >= StreamPriority::kLastPriority) {
181
- priority = StreamPriority::kDefault;
239
+ void Push(const StreamPtr stream, WritableStreamPriority priority) {
240
+ if (priority >= WritableStreamPriority::kLastPriority) {
241
+ priority = WritableStreamPriority::kDefault;
182
242
  }
183
243
 
184
- GRPC_WRITABLE_STREAMS_DEBUG << "Pushing stream id " << stream_id
185
- << " with priority "
186
- << GetPriorityString(priority);
187
- buckets_[static_cast<uint8_t>(priority)].push(stream_id);
244
+ total_streams_++;
245
+ GRPC_WRITABLE_STREAMS_DEBUG
246
+ << "Pushing stream id: " << stream->GetStreamId() << " with priority "
247
+ << GetWritableStreamPriorityString(priority) << " with total streams "
248
+ << total_streams_;
249
+ buckets_[static_cast<uint8_t>(priority)].push(stream);
188
250
  }
189
251
 
190
252
  // Pops a stream id from the queue based on the priority. If the priority is
191
253
  // kWaitForTransportFlowControl, transport_tokens_available is checked to
192
254
  // see if the stream id can be popped.
193
- std::optional<uint32_t> Pop(const bool transport_tokens_available) {
255
+ std::optional<StreamPtr> Pop(const bool transport_tokens_available) {
256
+ if (HasNoWritableStreams(transport_tokens_available)) {
257
+ return std::nullopt;
258
+ }
194
259
  for (uint8_t i = 0; i < buckets_.size(); ++i) {
195
260
  auto& bucket = buckets_[i];
196
261
  if (!bucket.empty()) {
@@ -202,36 +267,73 @@ class WritableStreams {
202
267
  continue;
203
268
  }
204
269
 
205
- uint32_t stream_id = bucket.front();
270
+ StreamPtr stream = bucket.front();
206
271
  bucket.pop();
272
+ total_streams_--;
207
273
  GRPC_WRITABLE_STREAMS_DEBUG
208
- << "Popping stream id " << stream_id << " from priority "
209
- << GetPriorityString(static_cast<StreamPriority>(i));
210
- return stream_id;
274
+ << "Popping stream id: " << stream->GetStreamId()
275
+ << " from priority "
276
+ << GetWritableStreamPriorityString(
277
+ static_cast<WritableStreamPriority>(i))
278
+ << " with " << total_streams_ << " streams remaining";
279
+ return stream;
211
280
  }
212
281
  }
213
282
  return std::nullopt;
214
283
  }
215
284
 
285
+ // Returns true if the queue does not have any stream that can be popped.
286
+ // If transport_tokens_available is false, streams with priority of
287
+ // kWaitForTransportFlowControl are not considered.
288
+ inline bool HasNoWritableStreams(
289
+ const bool transport_tokens_available) const {
290
+ return (transport_tokens_available)
291
+ ? (total_streams_ == 0)
292
+ : (total_streams_ -
293
+ buckets_[kWaitForTransportFlowControlIndex].size() ==
294
+ 0);
295
+ }
296
+
216
297
  static constexpr uint8_t kLastPriority =
217
- static_cast<uint8_t>(StreamPriority::kLastPriority);
298
+ static_cast<uint8_t>(WritableStreamPriority::kLastPriority);
218
299
  static constexpr uint8_t kWaitForTransportFlowControlIndex =
219
- static_cast<uint8_t>(StreamPriority::kWaitForTransportFlowControl);
220
- std::vector<std::queue<uint32_t>> buckets_;
300
+ static_cast<uint8_t>(
301
+ WritableStreamPriority::kWaitForTransportFlowControl);
302
+ std::vector<std::queue<StreamPtr>> buckets_;
303
+ uint32_t total_streams_ = 0u;
221
304
  };
222
305
 
223
306
  struct StreamIDAndPriority {
224
- const uint32_t stream_id;
225
- const StreamPriority priority;
307
+ const StreamPtr stream;
308
+ const WritableStreamPriority priority;
226
309
  };
227
310
 
228
- void AddToPrioritizedQueue(const std::vector<StreamIDAndPriority>& batch) {
229
- for (auto stream_id_priority : batch) {
230
- prioritized_queue_.Push(stream_id_priority.stream_id,
231
- stream_id_priority.priority);
311
+ void AddToPrioritizedQueue(
312
+ const std::vector<std::optional<StreamIDAndPriority>>& batch) {
313
+ GRPC_WRITABLE_STREAMS_DEBUG << "AddToPrioritizedQueue batch size "
314
+ << batch.size();
315
+ for (const std::optional<StreamIDAndPriority>& stream_id_priority : batch) {
316
+ // Ignore stream id kInvalidStreamID. These are used to force resolve
317
+ // WaitForReady().
318
+ if (!stream_id_priority.has_value()) {
319
+ GRPC_WRITABLE_STREAMS_DEBUG << "Skipping nullopt from batch";
320
+ continue;
321
+ }
322
+ prioritized_queue_.Push(stream_id_priority->stream,
323
+ stream_id_priority->priority);
232
324
  }
233
325
  }
234
326
 
327
+ // Returns true if the prioritized queue has any stream that can be popped.
328
+ bool PrioritizedQueueHasWritableStreams(
329
+ const bool transport_tokens_available) const {
330
+ GRPC_WRITABLE_STREAMS_DEBUG
331
+ << "PrioritizedQueueHasWritableStreams "
332
+ << !prioritized_queue_.HasNoWritableStreams(transport_tokens_available)
333
+ << " transport_tokens_available " << transport_tokens_available;
334
+ return !prioritized_queue_.HasNoWritableStreams(transport_tokens_available);
335
+ }
336
+
235
337
  // TODO(akshitpatel) : [PH2][P4] - Verify if this works for large number of
236
338
  // active streams based on the load tests. The reasoning to use max uint32_t
237
339
  // is that even when the streams are dequeued from the queue, the streams
@@ -243,8 +345,8 @@ class WritableStreams {
243
345
  static constexpr uint32_t kMaxBatchSize =
244
346
  std::numeric_limits<uint32_t>::max();
245
347
 
246
- MpscReceiver<StreamIDAndPriority> queue_;
247
- MpscSender<StreamIDAndPriority> sender_;
348
+ MpscReceiver<std::optional<StreamIDAndPriority>> queue_;
349
+ MpscSender<std::optional<StreamIDAndPriority>> sender_;
248
350
  PrioritizedQueue prioritized_queue_;
249
351
  };
250
352
 
@@ -18,14 +18,14 @@
18
18
 
19
19
  #include <algorithm>
20
20
 
21
- #include "absl/log/check.h"
21
+ #include "src/core/util/grpc_check.h"
22
22
 
23
23
  namespace grpc_core {
24
24
 
25
25
  size_t Chttp2WriteSizePolicy::WriteTargetSize() { return current_target_; }
26
26
 
27
27
  void Chttp2WriteSizePolicy::BeginWrite(size_t size) {
28
- CHECK(experiment_start_time_ == Timestamp::InfFuture());
28
+ GRPC_CHECK_EQ(experiment_start_time_, Timestamp::InfFuture());
29
29
  if (size < current_target_ * 7 / 10) {
30
30
  // If we were trending fast but stopped getting enough data to verify, then
31
31
  // reset back to the default state.
@@ -31,7 +31,6 @@
31
31
  #include <utility>
32
32
 
33
33
  #include "absl/container/flat_hash_map.h"
34
- #include "absl/log/check.h"
35
34
  #include "absl/log/log.h"
36
35
  #include "absl/status/status.h"
37
36
  #include "src/core/call/metadata_batch.h"
@@ -69,6 +68,7 @@
69
68
  #include "src/core/telemetry/stats.h"
70
69
  #include "src/core/telemetry/stats_data.h"
71
70
  #include "src/core/telemetry/tcp_tracer.h"
71
+ #include "src/core/util/grpc_check.h"
72
72
  #include "src/core/util/match.h"
73
73
  #include "src/core/util/ref_counted.h"
74
74
  #include "src/core/util/ref_counted_ptr.h"
@@ -273,7 +273,7 @@ class WriteContext {
273
273
  grpc_core::Http2Frame frame(std::move(*update));
274
274
  Serialize(absl::Span<grpc_core::Http2Frame>(&frame, 1), t_->outbuf);
275
275
  if (t_->keepalive_timeout != grpc_core::Duration::Infinity()) {
276
- CHECK(
276
+ GRPC_CHECK(
277
277
  t_->settings_ack_watchdog ==
278
278
  grpc_event_engine::experimental::EventEngine::TaskHandle::kInvalid);
279
279
  // We base settings timeout on keepalive timeout, but double it to allow
@@ -293,7 +293,7 @@ class WriteContext {
293
293
  // simple writes are queued to qbuf, and flushed here
294
294
  grpc_slice_buffer_move_into(&t_->qbuf, t_->outbuf.c_slice_buffer());
295
295
  t_->num_pending_induced_frames = 0;
296
- CHECK_EQ(t_->qbuf.count, 0u);
296
+ GRPC_CHECK_EQ(t_->qbuf.count, 0u);
297
297
  }
298
298
 
299
299
  void FlushWindowUpdates() {
@@ -20,7 +20,6 @@
20
20
  #include <atomic>
21
21
  #include <memory>
22
22
 
23
- #include "absl/log/check.h"
24
23
  #include "absl/log/log.h"
25
24
  #include "absl/status/status.h"
26
25
  #include "src/core/call/metadata.h"
@@ -36,6 +35,7 @@
36
35
  #include "src/core/server/server.h"
37
36
  #include "src/core/util/crash.h"
38
37
  #include "src/core/util/debug_location.h"
38
+ #include "src/core/util/grpc_check.h"
39
39
 
40
40
  namespace grpc_core {
41
41
 
@@ -35,7 +35,6 @@
35
35
  #include <string>
36
36
  #include <utility>
37
37
 
38
- #include "absl/log/check.h"
39
38
  #include "absl/log/log.h"
40
39
  #include "absl/status/status.h"
41
40
  #include "absl/status/statusor.h"
@@ -61,6 +60,7 @@
61
60
  #include "src/core/lib/transport/transport.h"
62
61
  #include "src/core/server/server.h"
63
62
  #include "src/core/util/debug_location.h"
63
+ #include "src/core/util/grpc_check.h"
64
64
  #include "src/core/util/ref_counted_ptr.h"
65
65
  #include "src/core/util/status_helper.h"
66
66
  #include "src/core/util/time.h"
@@ -1275,7 +1275,7 @@ grpc_channel* grpc_legacy_inproc_channel_create(grpc_server* server,
1275
1275
  auto new_channel = grpc_core::ChannelCreate(
1276
1276
  "inproc", client_args, GRPC_CLIENT_DIRECT_CHANNEL, client_transport);
1277
1277
  if (!new_channel.ok()) {
1278
- CHECK(!channel);
1278
+ GRPC_CHECK(!channel);
1279
1279
  LOG(ERROR) << "Failed to create client channel: "
1280
1280
  << grpc_core::StatusToString(error);
1281
1281
  intptr_t integer;
@@ -1293,7 +1293,7 @@ grpc_channel* grpc_legacy_inproc_channel_create(grpc_server* server,
1293
1293
  channel = new_channel->release()->c_ptr();
1294
1294
  }
1295
1295
  } else {
1296
- CHECK(!channel);
1296
+ GRPC_CHECK(!channel);
1297
1297
  LOG(ERROR) << "Failed to create server channel: "
1298
1298
  << grpc_core::StatusToString(error);
1299
1299
  intptr_t integer;