grpc 1.73.0 → 1.74.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (499) hide show
  1. checksums.yaml +4 -4
  2. data/Makefile +38 -17
  3. data/include/grpc/create_channel_from_endpoint.h +54 -0
  4. data/include/grpc/credentials.h +11 -5
  5. data/include/grpc/event_engine/event_engine.h +74 -17
  6. data/include/grpc/grpc_posix.h +20 -1
  7. data/include/grpc/impl/channel_arg_names.h +2 -4
  8. data/include/grpc/module.modulemap +1 -0
  9. data/include/grpc/support/json.h +24 -0
  10. data/src/core/call/interception_chain.h +7 -11
  11. data/src/core/channelz/channel_trace.cc +213 -115
  12. data/src/core/channelz/channel_trace.h +380 -86
  13. data/src/core/channelz/channelz.cc +270 -181
  14. data/src/core/channelz/channelz.h +168 -55
  15. data/src/core/channelz/channelz_registry.cc +2 -1
  16. data/src/core/channelz/channelz_registry.h +24 -0
  17. data/src/core/channelz/property_list.cc +357 -0
  18. data/src/core/channelz/property_list.h +202 -0
  19. data/src/core/channelz/ztrace_collector.h +3 -2
  20. data/src/core/client_channel/backup_poller.cc +17 -2
  21. data/src/core/client_channel/client_channel.cc +17 -28
  22. data/src/core/client_channel/client_channel_filter.cc +19 -29
  23. data/src/core/client_channel/config_selector.h +8 -2
  24. data/src/core/client_channel/dynamic_filters.cc +5 -6
  25. data/src/core/client_channel/dynamic_filters.h +1 -1
  26. data/src/core/client_channel/global_subchannel_pool.cc +4 -1
  27. data/src/core/client_channel/retry_filter.cc +21 -27
  28. data/src/core/client_channel/retry_filter.h +10 -7
  29. data/src/core/client_channel/retry_filter_legacy_call_data.cc +5 -5
  30. data/src/core/client_channel/retry_filter_legacy_call_data.h +1 -1
  31. data/src/core/client_channel/retry_interceptor.cc +30 -44
  32. data/src/core/client_channel/retry_interceptor.h +18 -17
  33. data/src/core/client_channel/retry_throttle.cc +46 -61
  34. data/src/core/client_channel/retry_throttle.h +17 -39
  35. data/src/core/client_channel/subchannel.cc +43 -19
  36. data/src/core/client_channel/subchannel.h +8 -0
  37. data/src/core/config/config_vars.cc +2 -0
  38. data/src/core/config/core_configuration.cc +1 -0
  39. data/src/core/config/core_configuration.h +11 -0
  40. data/src/core/credentials/call/call_creds_registry.h +125 -0
  41. data/src/core/credentials/call/call_creds_registry_init.cc +91 -0
  42. data/src/core/credentials/call/gcp_service_account_identity/gcp_service_account_identity_credentials.cc +6 -48
  43. data/src/core/credentials/call/jwt_token_file/jwt_token_file_call_credentials.cc +86 -0
  44. data/src/core/credentials/call/jwt_token_file/jwt_token_file_call_credentials.h +74 -0
  45. data/src/core/credentials/call/jwt_util.cc +70 -0
  46. data/src/core/credentials/call/jwt_util.h +32 -0
  47. data/src/core/credentials/transport/channel_creds_registry_init.cc +1 -1
  48. data/src/core/credentials/transport/google_default/google_default_credentials.cc +72 -4
  49. data/src/core/credentials/transport/ssl/ssl_credentials.cc +0 -1
  50. data/src/core/credentials/transport/tls/load_system_roots_supported.cc +1 -0
  51. data/src/core/credentials/transport/xds/xds_credentials.cc +0 -3
  52. data/src/core/ext/filters/gcp_authentication/gcp_authentication_filter.cc +8 -8
  53. data/src/core/ext/filters/gcp_authentication/gcp_authentication_filter.h +16 -16
  54. data/src/core/ext/filters/http/client_authority_filter.cc +2 -4
  55. data/src/core/ext/filters/http/message_compress/compression_filter.h +25 -22
  56. data/src/core/ext/filters/http/server/http_server_filter.h +12 -11
  57. data/src/core/ext/transport/chttp2/client/chttp2_connector.cc +120 -35
  58. data/src/core/ext/transport/chttp2/server/chttp2_server.cc +6 -5
  59. data/src/core/ext/transport/chttp2/transport/chttp2_transport.cc +162 -115
  60. data/src/core/ext/transport/chttp2/transport/chttp2_transport.h +0 -3
  61. data/src/core/ext/transport/chttp2/transport/decode_huff.cc +1239 -3514
  62. data/src/core/ext/transport/chttp2/transport/decode_huff.h +1008 -1486
  63. data/src/core/ext/transport/chttp2/transport/flow_control.h +22 -17
  64. data/src/core/ext/transport/chttp2/transport/frame.cc +10 -0
  65. data/src/core/ext/transport/chttp2/transport/frame.h +2 -2
  66. data/src/core/ext/transport/chttp2/transport/frame_data.cc +1 -1
  67. data/src/core/ext/transport/chttp2/transport/frame_settings.cc +7 -8
  68. data/src/core/ext/transport/chttp2/transport/frame_window_update.cc +4 -5
  69. data/src/core/ext/transport/chttp2/transport/header_assembler.h +299 -0
  70. data/src/core/ext/transport/chttp2/transport/hpack_parser.cc +1 -1
  71. data/src/core/ext/transport/chttp2/transport/hpack_parser_table.cc +11 -5
  72. data/src/core/ext/transport/chttp2/transport/hpack_parser_table.h +12 -1
  73. data/src/core/ext/transport/chttp2/transport/http2_client_transport.cc +1017 -0
  74. data/src/core/ext/transport/chttp2/transport/http2_client_transport.h +593 -0
  75. data/src/core/ext/transport/chttp2/transport/http2_settings.h +19 -22
  76. data/{third_party/abseil-cpp/absl/strings/cord_buffer.cc → src/core/ext/transport/chttp2/transport/http2_stats_collector.cc} +14 -14
  77. data/src/core/ext/transport/chttp2/transport/http2_stats_collector.h +33 -0
  78. data/src/core/ext/transport/chttp2/transport/http2_status.h +6 -1
  79. data/src/core/ext/transport/chttp2/transport/http2_transport.cc +43 -0
  80. data/src/core/ext/transport/chttp2/transport/http2_transport.h +65 -0
  81. data/src/core/ext/transport/chttp2/transport/http2_ztrace_collector.h +0 -29
  82. data/src/core/ext/transport/chttp2/transport/internal.h +18 -8
  83. data/src/core/ext/transport/chttp2/transport/keepalive.cc +105 -0
  84. data/src/core/ext/transport/chttp2/transport/keepalive.h +138 -0
  85. data/src/core/ext/transport/chttp2/transport/message_assembler.h +185 -0
  86. data/src/core/ext/transport/chttp2/transport/parsing.cc +2 -4
  87. data/src/core/ext/transport/chttp2/transport/ping_callbacks.h +19 -0
  88. data/src/core/ext/transport/chttp2/transport/ping_promise.cc +151 -0
  89. data/src/core/ext/transport/chttp2/transport/ping_promise.h +180 -0
  90. data/src/core/ext/transport/chttp2/transport/ping_rate_policy.cc +5 -9
  91. data/src/core/ext/transport/chttp2/transport/ping_rate_policy.h +11 -0
  92. data/src/core/ext/transport/chttp2/transport/stream_lists.cc +39 -1
  93. data/src/core/ext/transport/chttp2/transport/transport_common.cc +19 -0
  94. data/src/core/ext/transport/chttp2/transport/transport_common.h +27 -0
  95. data/src/core/ext/transport/chttp2/transport/writing.cc +37 -11
  96. data/src/core/ext/upb-gen/src/proto/grpc/channelz/v2/channelz.upb.h +571 -0
  97. data/src/core/ext/upb-gen/src/proto/grpc/channelz/v2/channelz.upb_minitable.c +120 -0
  98. data/src/core/ext/upb-gen/src/proto/grpc/channelz/v2/channelz.upb_minitable.h +36 -0
  99. data/src/core/ext/upb-gen/src/proto/grpc/channelz/v2/promise.upb.h +1272 -0
  100. data/src/core/ext/upb-gen/src/proto/grpc/channelz/v2/promise.upb_minitable.c +312 -0
  101. data/src/core/ext/upb-gen/src/proto/grpc/channelz/v2/promise.upb_minitable.h +50 -0
  102. data/src/core/ext/upb-gen/src/proto/grpc/channelz/v2/property_list.upb.h +984 -0
  103. data/src/core/ext/upb-gen/src/proto/grpc/channelz/v2/property_list.upb_minitable.c +226 -0
  104. data/src/core/ext/upb-gen/src/proto/grpc/channelz/v2/property_list.upb_minitable.h +44 -0
  105. data/src/core/ext/upbdefs-gen/src/proto/grpc/channelz/v2/promise.upbdefs.c +175 -0
  106. data/src/core/ext/upbdefs-gen/src/proto/grpc/channelz/v2/promise.upbdefs.h +82 -0
  107. data/src/core/ext/upbdefs-gen/src/proto/grpc/channelz/v2/property_list.upbdefs.c +135 -0
  108. data/src/core/ext/upbdefs-gen/src/proto/grpc/channelz/v2/property_list.upbdefs.h +67 -0
  109. data/src/core/filter/auth/auth_filters.h +0 -25
  110. data/src/core/filter/auth/client_auth_filter.cc +0 -118
  111. data/src/core/filter/filter_args.h +9 -23
  112. data/src/core/handshaker/handshaker.cc +23 -14
  113. data/src/core/handshaker/handshaker.h +3 -0
  114. data/src/core/handshaker/http_connect/http_connect_handshaker.cc +3 -1
  115. data/src/core/handshaker/security/legacy_secure_endpoint.cc +6 -5
  116. data/src/core/handshaker/security/secure_endpoint.cc +70 -25
  117. data/src/core/handshaker/security/security_handshaker.cc +4 -1
  118. data/src/core/handshaker/tcp_connect/tcp_connect_handshaker.cc +7 -1
  119. data/src/core/lib/channel/channel_args.cc +15 -0
  120. data/src/core/lib/channel/channel_args.h +3 -0
  121. data/src/core/lib/channel/channel_stack.cc +22 -23
  122. data/src/core/lib/channel/channel_stack.h +9 -7
  123. data/src/core/lib/channel/channel_stack_builder_impl.cc +1 -1
  124. data/src/core/lib/channel/channel_stack_builder_impl.h +2 -7
  125. data/src/core/lib/channel/promise_based_filter.h +5 -5
  126. data/src/core/lib/debug/trace_impl.h +0 -1
  127. data/src/core/lib/event_engine/ares_resolver.cc +165 -46
  128. data/src/core/lib/event_engine/ares_resolver.h +48 -2
  129. data/src/core/lib/event_engine/cf_engine/cf_engine.cc +3 -1
  130. data/src/core/lib/event_engine/cf_engine/cf_engine.h +1 -4
  131. data/src/core/lib/event_engine/cf_engine/cfstream_endpoint.h +2 -6
  132. data/src/core/lib/event_engine/endpoint_channel_arg_wrapper.cc +40 -0
  133. data/src/core/lib/event_engine/endpoint_channel_arg_wrapper.h +60 -0
  134. data/src/core/lib/event_engine/event_engine.cc +7 -0
  135. data/src/core/lib/event_engine/extensions/channelz.h +10 -6
  136. data/src/core/lib/event_engine/grpc_polled_fd.h +5 -0
  137. data/src/core/lib/event_engine/posix_engine/ev_epoll1_linux.cc +130 -162
  138. data/src/core/lib/event_engine/posix_engine/ev_epoll1_linux.h +11 -15
  139. data/src/core/lib/event_engine/posix_engine/ev_poll_posix.cc +75 -117
  140. data/src/core/lib/event_engine/posix_engine/ev_poll_posix.h +7 -9
  141. data/src/core/lib/event_engine/posix_engine/event_poller.h +18 -15
  142. data/src/core/lib/event_engine/posix_engine/event_poller_posix_default.cc +0 -18
  143. data/src/core/lib/event_engine/posix_engine/file_descriptor_collection.cc +124 -0
  144. data/src/core/lib/event_engine/posix_engine/file_descriptor_collection.h +243 -0
  145. data/src/core/lib/event_engine/posix_engine/grpc_polled_fd_posix.h +29 -19
  146. data/src/core/lib/event_engine/posix_engine/internal_errqueue.cc +6 -2
  147. data/src/core/lib/event_engine/posix_engine/internal_errqueue.h +6 -1
  148. data/src/core/lib/event_engine/posix_engine/posix_endpoint.cc +145 -92
  149. data/src/core/lib/event_engine/posix_engine/posix_endpoint.h +9 -19
  150. data/src/core/lib/event_engine/posix_engine/posix_engine.cc +333 -116
  151. data/src/core/lib/event_engine/posix_engine/posix_engine.h +61 -18
  152. data/src/core/lib/event_engine/posix_engine/posix_engine_listener.cc +45 -37
  153. data/src/core/lib/event_engine/posix_engine/posix_engine_listener.h +6 -4
  154. data/src/core/lib/event_engine/posix_engine/posix_engine_listener_utils.cc +32 -142
  155. data/src/core/lib/event_engine/posix_engine/posix_engine_listener_utils.h +6 -5
  156. data/src/core/lib/event_engine/posix_engine/posix_interface.h +211 -0
  157. data/src/core/lib/event_engine/posix_engine/posix_interface_posix.cc +1083 -0
  158. data/src/core/lib/event_engine/posix_engine/posix_interface_windows.cc +281 -0
  159. data/src/core/lib/event_engine/posix_engine/posix_write_event_sink.cc +154 -0
  160. data/src/core/lib/event_engine/posix_engine/posix_write_event_sink.h +174 -0
  161. data/src/core/lib/event_engine/posix_engine/tcp_socket_utils.cc +3 -719
  162. data/src/core/lib/event_engine/posix_engine/tcp_socket_utils.h +10 -170
  163. data/src/core/lib/event_engine/posix_engine/timer_manager.cc +33 -22
  164. data/src/core/lib/event_engine/posix_engine/timer_manager.h +13 -11
  165. data/src/core/lib/event_engine/posix_engine/traced_buffer_list.cc +117 -151
  166. data/src/core/lib/event_engine/posix_engine/traced_buffer_list.h +26 -94
  167. data/src/core/lib/event_engine/posix_engine/wakeup_fd_eventfd.cc +26 -25
  168. data/src/core/lib/event_engine/posix_engine/wakeup_fd_eventfd.h +6 -2
  169. data/src/core/lib/event_engine/posix_engine/wakeup_fd_pipe.cc +36 -62
  170. data/src/core/lib/event_engine/posix_engine/wakeup_fd_pipe.h +6 -2
  171. data/src/core/lib/event_engine/posix_engine/wakeup_fd_posix.h +7 -6
  172. data/src/core/lib/event_engine/posix_engine/wakeup_fd_posix_default.cc +12 -6
  173. data/src/core/lib/event_engine/posix_engine/wakeup_fd_posix_default.h +3 -1
  174. data/src/core/lib/event_engine/shim.cc +9 -0
  175. data/src/core/lib/event_engine/shim.h +3 -0
  176. data/src/core/lib/event_engine/thread_pool/thread_pool.h +7 -3
  177. data/src/core/lib/event_engine/thread_pool/thread_pool_factory.cc +0 -17
  178. data/src/core/lib/event_engine/thread_pool/work_stealing_thread_pool.cc +4 -2
  179. data/src/core/lib/event_engine/thread_pool/work_stealing_thread_pool.h +3 -2
  180. data/src/core/lib/event_engine/windows/grpc_polled_fd_windows.cc +4 -0
  181. data/src/core/lib/event_engine/windows/grpc_polled_fd_windows.h +4 -0
  182. data/src/core/lib/event_engine/windows/windows_endpoint.h +2 -6
  183. data/src/core/lib/event_engine/windows/windows_engine.cc +0 -1
  184. data/src/core/lib/event_engine/windows/windows_engine.h +1 -3
  185. data/src/core/lib/event_engine/windows/windows_listener.cc +14 -2
  186. data/src/core/lib/experiments/experiments.cc +45 -93
  187. data/src/core/lib/experiments/experiments.h +21 -51
  188. data/src/core/lib/iomgr/endpoint.cc +4 -3
  189. data/src/core/lib/iomgr/endpoint.h +7 -4
  190. data/src/core/lib/iomgr/endpoint_cfstream.cc +3 -2
  191. data/src/core/lib/iomgr/ev_epoll1_linux.cc +7 -2
  192. data/src/core/lib/iomgr/ev_poll_posix.cc +7 -2
  193. data/src/core/lib/iomgr/event_engine_shims/endpoint.cc +4 -6
  194. data/src/core/lib/iomgr/tcp_posix.cc +12 -6
  195. data/src/core/lib/iomgr/tcp_windows.cc +3 -2
  196. data/src/core/lib/promise/activity.h +1 -0
  197. data/src/core/lib/promise/arena_promise.h +23 -7
  198. data/src/core/lib/promise/detail/promise_factory.h +10 -0
  199. data/src/core/lib/promise/detail/promise_like.h +118 -11
  200. data/src/core/lib/promise/detail/promise_variant.h +50 -0
  201. data/src/core/lib/promise/detail/seq_state.h +687 -548
  202. data/src/core/lib/promise/if.h +20 -0
  203. data/src/core/lib/promise/inter_activity_latch.h +147 -0
  204. data/src/core/lib/promise/inter_activity_mutex.h +547 -0
  205. data/src/core/lib/promise/loop.h +65 -3
  206. data/src/core/lib/promise/map.h +24 -0
  207. data/src/core/lib/promise/match_promise.h +103 -0
  208. data/src/core/lib/promise/mpsc.cc +425 -0
  209. data/src/core/lib/promise/mpsc.h +490 -0
  210. data/src/core/lib/promise/party.cc +50 -1
  211. data/src/core/lib/promise/party.h +66 -1
  212. data/src/core/lib/promise/race.h +31 -0
  213. data/src/core/lib/promise/seq.h +4 -1
  214. data/src/core/lib/promise/status_flag.h +7 -0
  215. data/src/core/lib/promise/try_seq.h +4 -1
  216. data/src/core/lib/promise/wait_set.cc +28 -0
  217. data/src/core/lib/promise/wait_set.h +86 -0
  218. data/src/core/lib/resource_quota/arena.h +19 -0
  219. data/src/core/lib/slice/slice.h +5 -0
  220. data/src/core/lib/surface/channel_create.cc +88 -13
  221. data/src/core/lib/surface/channel_create.h +4 -0
  222. data/src/core/lib/surface/channel_init.cc +164 -47
  223. data/src/core/lib/surface/channel_init.h +64 -1
  224. data/src/core/lib/surface/filter_stack_call.cc +18 -9
  225. data/src/core/lib/surface/init.cc +6 -15
  226. data/src/core/lib/surface/legacy_channel.cc +3 -5
  227. data/src/core/lib/surface/legacy_channel.h +3 -1
  228. data/src/core/lib/surface/version.cc +2 -2
  229. data/src/core/lib/transport/promise_endpoint.cc +110 -0
  230. data/src/core/lib/transport/promise_endpoint.h +307 -0
  231. data/src/core/load_balancing/child_policy_handler.cc +2 -4
  232. data/src/core/load_balancing/delegating_helper.h +2 -3
  233. data/src/core/load_balancing/health_check_client.cc +1 -5
  234. data/src/core/load_balancing/lb_policy.h +1 -3
  235. data/src/core/load_balancing/oob_backend_metric.cc +1 -5
  236. data/src/core/load_balancing/pick_first/pick_first.cc +3 -0
  237. data/src/core/load_balancing/xds/cds.cc +10 -1
  238. data/src/core/plugin_registry/grpc_plugin_registry_extra.cc +2 -0
  239. data/src/core/resolver/xds/xds_config.cc +6 -3
  240. data/src/core/resolver/xds/xds_config.h +9 -4
  241. data/src/core/resolver/xds/xds_dependency_manager.cc +21 -6
  242. data/src/core/resolver/xds/xds_dependency_manager.h +2 -1
  243. data/src/core/resolver/xds/xds_resolver.cc +31 -11
  244. data/src/core/server/server.cc +83 -12
  245. data/src/core/server/server.h +21 -2
  246. data/src/core/server/xds_server_config_fetcher.cc +63 -25
  247. data/src/core/service_config/service_config.h +1 -1
  248. data/src/core/service_config/service_config_impl.h +1 -1
  249. data/src/core/telemetry/context_list_entry.cc +38 -0
  250. data/src/core/telemetry/context_list_entry.h +42 -12
  251. data/src/core/telemetry/stats_data.cc +233 -207
  252. data/src/core/telemetry/stats_data.h +250 -153
  253. data/src/core/telemetry/tcp_tracer.h +1 -1
  254. data/src/core/tsi/alts/zero_copy_frame_protector/alts_zero_copy_grpc_protector.cc +11 -3
  255. data/src/core/tsi/fake_transport_security.cc +17 -0
  256. data/src/core/tsi/ssl_transport_security.cc +2 -0
  257. data/src/core/tsi/transport_security_grpc.cc +8 -0
  258. data/src/core/tsi/transport_security_grpc.h +15 -0
  259. data/src/core/util/backoff.cc +1 -5
  260. data/src/core/util/backoff.h +1 -0
  261. data/src/core/util/down_cast.h +1 -1
  262. data/src/core/util/function_signature.h +15 -1
  263. data/src/core/util/http_client/httpcli.cc +12 -5
  264. data/src/core/util/http_client/httpcli.h +4 -1
  265. data/src/core/util/latent_see.h +8 -5
  266. data/src/core/util/log.cc +4 -0
  267. data/src/core/util/memory_usage.h +268 -0
  268. data/src/core/util/per_cpu.cc +2 -0
  269. data/src/core/util/per_cpu.h +7 -0
  270. data/src/core/util/shared_bit_gen.h +20 -0
  271. data/src/core/util/single_set_ptr.h +2 -2
  272. data/src/core/util/upb_utils.h +42 -0
  273. data/src/core/util/uri.cc +3 -2
  274. data/src/core/util/useful.h +53 -2
  275. data/src/core/util/wait_for_single_owner.cc +31 -0
  276. data/src/core/util/wait_for_single_owner.h +24 -0
  277. data/src/core/xds/grpc/xds_bootstrap_grpc.cc +2 -0
  278. data/src/core/xds/grpc/xds_bootstrap_grpc.h +5 -0
  279. data/src/core/xds/grpc/xds_client_grpc.cc +6 -2
  280. data/src/core/xds/grpc/xds_common_types_parser.cc +138 -50
  281. data/src/core/xds/grpc/xds_common_types_parser.h +12 -0
  282. data/src/core/xds/grpc/xds_http_filter.h +7 -0
  283. data/src/core/xds/grpc/xds_http_gcp_authn_filter.cc +22 -0
  284. data/src/core/xds/grpc/xds_http_gcp_authn_filter.h +3 -0
  285. data/src/core/xds/grpc/xds_route_config_parser.cc +15 -38
  286. data/src/core/xds/grpc/xds_server_grpc.cc +63 -13
  287. data/src/core/xds/grpc/xds_server_grpc.h +10 -2
  288. data/src/core/xds/grpc/xds_server_grpc_interface.h +4 -0
  289. data/src/core/xds/grpc/xds_transport_grpc.cc +18 -0
  290. data/src/core/xds/xds_client/xds_bootstrap.h +2 -0
  291. data/src/core/xds/xds_client/xds_client.cc +26 -5
  292. data/src/ruby/ext/grpc/extconf.rb +2 -0
  293. data/src/ruby/ext/grpc/rb_call.c +1 -8
  294. data/src/ruby/ext/grpc/rb_channel.c +72 -568
  295. data/src/ruby/ext/grpc/rb_channel.h +0 -3
  296. data/src/ruby/ext/grpc/rb_completion_queue.c +26 -14
  297. data/src/ruby/ext/grpc/rb_completion_queue.h +1 -7
  298. data/src/ruby/ext/grpc/rb_grpc.c +9 -5
  299. data/src/ruby/ext/grpc/rb_grpc_imports.generated.h +1 -1
  300. data/src/ruby/ext/grpc/rb_loader.c +0 -4
  301. data/src/ruby/ext/grpc/rb_server.c +31 -50
  302. data/src/ruby/lib/grpc/generic/client_stub.rb +4 -4
  303. data/src/ruby/lib/grpc/version.rb +1 -1
  304. data/src/ruby/spec/core_spec.rb +22 -0
  305. data/src/ruby/spec/generic/active_call_spec.rb +1 -1
  306. data/third_party/abseil-cpp/absl/algorithm/container.h +2 -19
  307. data/third_party/abseil-cpp/absl/base/attributes.h +76 -7
  308. data/third_party/abseil-cpp/absl/base/call_once.h +11 -12
  309. data/third_party/abseil-cpp/absl/base/config.h +20 -129
  310. data/third_party/abseil-cpp/absl/base/{internal/fast_type_id.h → fast_type_id.h} +11 -16
  311. data/third_party/abseil-cpp/absl/base/internal/cycleclock.cc +0 -5
  312. data/third_party/abseil-cpp/absl/base/internal/cycleclock_config.h +7 -7
  313. data/third_party/abseil-cpp/absl/base/internal/endian.h +34 -38
  314. data/third_party/abseil-cpp/absl/base/internal/iterator_traits.h +71 -0
  315. data/third_party/abseil-cpp/absl/base/internal/low_level_alloc.cc +6 -5
  316. data/third_party/abseil-cpp/absl/base/internal/{nullability_impl.h → nullability_deprecated.h} +45 -8
  317. data/third_party/abseil-cpp/absl/base/internal/spinlock.cc +0 -9
  318. data/third_party/abseil-cpp/absl/base/internal/spinlock.h +3 -13
  319. data/third_party/abseil-cpp/absl/base/internal/unaligned_access.h +6 -6
  320. data/third_party/abseil-cpp/absl/base/internal/unscaledcycleclock.h +8 -3
  321. data/third_party/abseil-cpp/absl/base/no_destructor.h +11 -32
  322. data/third_party/abseil-cpp/absl/base/nullability.h +84 -72
  323. data/third_party/abseil-cpp/absl/base/options.h +3 -80
  324. data/third_party/abseil-cpp/absl/base/policy_checks.h +7 -7
  325. data/third_party/abseil-cpp/absl/cleanup/cleanup.h +1 -3
  326. data/third_party/abseil-cpp/absl/cleanup/internal/cleanup.h +3 -4
  327. data/third_party/abseil-cpp/absl/container/btree_map.h +4 -2
  328. data/third_party/abseil-cpp/absl/container/btree_set.h +4 -2
  329. data/third_party/abseil-cpp/absl/container/fixed_array.h +7 -14
  330. data/third_party/abseil-cpp/absl/container/flat_hash_map.h +5 -0
  331. data/third_party/abseil-cpp/absl/container/flat_hash_set.h +6 -1
  332. data/third_party/abseil-cpp/absl/container/inlined_vector.h +8 -5
  333. data/third_party/abseil-cpp/absl/container/internal/btree.h +132 -29
  334. data/third_party/abseil-cpp/absl/container/internal/btree_container.h +175 -71
  335. data/third_party/abseil-cpp/absl/container/internal/common.h +43 -0
  336. data/third_party/abseil-cpp/absl/container/internal/common_policy_traits.h +1 -2
  337. data/third_party/abseil-cpp/absl/container/internal/container_memory.h +9 -10
  338. data/third_party/abseil-cpp/absl/container/internal/hash_function_defaults.h +1 -8
  339. data/third_party/abseil-cpp/absl/container/internal/hash_policy_traits.h +0 -4
  340. data/third_party/abseil-cpp/absl/container/internal/hashtable_control_bytes.h +527 -0
  341. data/third_party/abseil-cpp/absl/container/internal/hashtablez_sampler.cc +20 -4
  342. data/third_party/abseil-cpp/absl/container/internal/hashtablez_sampler.h +31 -12
  343. data/third_party/abseil-cpp/absl/container/internal/inlined_vector.h +2 -7
  344. data/third_party/abseil-cpp/absl/container/internal/layout.h +26 -42
  345. data/third_party/abseil-cpp/absl/container/internal/raw_hash_map.h +199 -68
  346. data/third_party/abseil-cpp/absl/container/internal/raw_hash_set.cc +1354 -183
  347. data/third_party/abseil-cpp/absl/container/internal/raw_hash_set.h +881 -1424
  348. data/third_party/abseil-cpp/absl/container/internal/raw_hash_set_resize_impl.h +80 -0
  349. data/third_party/abseil-cpp/absl/crc/crc32c.cc +0 -4
  350. data/third_party/abseil-cpp/absl/crc/crc32c.h +7 -5
  351. data/third_party/abseil-cpp/absl/crc/internal/crc32_x86_arm_combined_simd.h +0 -22
  352. data/third_party/abseil-cpp/absl/crc/internal/crc_x86_arm_combined.cc +45 -74
  353. data/third_party/abseil-cpp/absl/debugging/internal/addresses.h +57 -0
  354. data/third_party/abseil-cpp/absl/debugging/internal/decode_rust_punycode.cc +1 -1
  355. data/third_party/abseil-cpp/absl/debugging/internal/decode_rust_punycode.h +5 -5
  356. data/third_party/abseil-cpp/absl/debugging/internal/demangle.cc +8 -35
  357. data/third_party/abseil-cpp/absl/debugging/internal/demangle_rust.cc +16 -16
  358. data/third_party/abseil-cpp/absl/debugging/internal/stacktrace_aarch64-inl.inc +40 -37
  359. data/third_party/abseil-cpp/absl/debugging/internal/stacktrace_arm-inl.inc +16 -7
  360. data/third_party/abseil-cpp/absl/debugging/internal/stacktrace_emscripten-inl.inc +14 -5
  361. data/third_party/abseil-cpp/absl/debugging/internal/stacktrace_generic-inl.inc +10 -4
  362. data/third_party/abseil-cpp/absl/debugging/internal/stacktrace_powerpc-inl.inc +27 -16
  363. data/third_party/abseil-cpp/absl/debugging/internal/stacktrace_riscv-inl.inc +13 -4
  364. data/third_party/abseil-cpp/absl/debugging/internal/stacktrace_unimplemented-inl.inc +4 -3
  365. data/third_party/abseil-cpp/absl/debugging/internal/stacktrace_win32-inl.inc +15 -28
  366. data/third_party/abseil-cpp/absl/debugging/internal/stacktrace_x86-inl.inc +19 -9
  367. data/third_party/abseil-cpp/absl/debugging/stacktrace.cc +144 -27
  368. data/third_party/abseil-cpp/absl/debugging/stacktrace.h +73 -5
  369. data/third_party/abseil-cpp/absl/debugging/symbolize_elf.inc +19 -9
  370. data/third_party/abseil-cpp/absl/debugging/symbolize_emscripten.inc +3 -2
  371. data/third_party/abseil-cpp/absl/debugging/symbolize_win32.inc +25 -6
  372. data/third_party/abseil-cpp/absl/flags/commandlineflag.h +2 -2
  373. data/third_party/abseil-cpp/absl/flags/flag.h +4 -3
  374. data/third_party/abseil-cpp/absl/flags/internal/commandlineflag.h +2 -2
  375. data/third_party/abseil-cpp/absl/flags/internal/flag.cc +2 -1
  376. data/third_party/abseil-cpp/absl/flags/internal/flag.h +7 -6
  377. data/third_party/abseil-cpp/absl/flags/internal/registry.h +4 -3
  378. data/third_party/abseil-cpp/absl/flags/reflection.cc +2 -3
  379. data/third_party/abseil-cpp/absl/functional/any_invocable.h +8 -10
  380. data/third_party/abseil-cpp/absl/functional/function_ref.h +2 -9
  381. data/third_party/abseil-cpp/absl/functional/internal/any_invocable.h +110 -226
  382. data/third_party/abseil-cpp/absl/functional/internal/front_binder.h +10 -12
  383. data/third_party/abseil-cpp/absl/functional/internal/function_ref.h +2 -5
  384. data/third_party/abseil-cpp/absl/hash/hash.h +18 -0
  385. data/third_party/abseil-cpp/absl/hash/internal/hash.cc +1 -5
  386. data/third_party/abseil-cpp/absl/hash/internal/hash.h +86 -61
  387. data/third_party/abseil-cpp/absl/hash/internal/low_level_hash.cc +25 -68
  388. data/third_party/abseil-cpp/absl/hash/internal/low_level_hash.h +2 -6
  389. data/third_party/abseil-cpp/absl/hash/internal/weakly_mixed_integer.h +38 -0
  390. data/third_party/abseil-cpp/absl/log/check.h +2 -1
  391. data/third_party/abseil-cpp/absl/log/globals.h +4 -5
  392. data/third_party/abseil-cpp/absl/log/internal/append_truncated.h +28 -0
  393. data/third_party/abseil-cpp/absl/log/internal/check_op.cc +22 -22
  394. data/third_party/abseil-cpp/absl/log/internal/check_op.h +65 -62
  395. data/third_party/abseil-cpp/absl/log/internal/conditions.cc +5 -3
  396. data/third_party/abseil-cpp/absl/log/internal/conditions.h +7 -2
  397. data/third_party/abseil-cpp/absl/log/internal/log_message.cc +85 -43
  398. data/third_party/abseil-cpp/absl/log/internal/log_message.h +84 -59
  399. data/third_party/abseil-cpp/absl/log/internal/nullstream.h +1 -0
  400. data/third_party/abseil-cpp/absl/log/internal/proto.cc +3 -2
  401. data/third_party/abseil-cpp/absl/log/internal/proto.h +3 -3
  402. data/third_party/abseil-cpp/absl/log/internal/strip.h +4 -12
  403. data/third_party/abseil-cpp/absl/log/internal/vlog_config.h +8 -6
  404. data/third_party/abseil-cpp/absl/log/internal/voidify.h +10 -4
  405. data/third_party/abseil-cpp/absl/log/log.h +48 -35
  406. data/third_party/abseil-cpp/absl/log/log_sink_registry.h +2 -2
  407. data/third_party/abseil-cpp/absl/meta/type_traits.h +46 -175
  408. data/third_party/abseil-cpp/absl/numeric/bits.h +68 -2
  409. data/third_party/abseil-cpp/absl/numeric/int128.cc +0 -52
  410. data/third_party/abseil-cpp/absl/numeric/internal/bits.h +7 -3
  411. data/third_party/abseil-cpp/absl/profiling/internal/exponential_biased.cc +1 -1
  412. data/third_party/abseil-cpp/absl/random/bit_gen_ref.h +10 -11
  413. data/third_party/abseil-cpp/absl/random/distributions.h +6 -8
  414. data/third_party/abseil-cpp/absl/random/gaussian_distribution.h +1 -1
  415. data/third_party/abseil-cpp/absl/random/internal/distribution_caller.h +5 -6
  416. data/third_party/abseil-cpp/absl/random/internal/{pool_urbg.cc → entropy_pool.cc} +22 -90
  417. data/third_party/abseil-cpp/absl/random/internal/entropy_pool.h +35 -0
  418. data/third_party/abseil-cpp/absl/random/internal/nonsecure_base.h +5 -6
  419. data/third_party/abseil-cpp/absl/random/internal/randen_detect.cc +1 -1
  420. data/third_party/abseil-cpp/absl/random/internal/seed_material.cc +20 -12
  421. data/third_party/abseil-cpp/absl/random/internal/seed_material.h +5 -5
  422. data/third_party/abseil-cpp/absl/random/random.h +88 -53
  423. data/third_party/abseil-cpp/absl/random/seed_sequences.cc +6 -2
  424. data/third_party/abseil-cpp/absl/status/internal/status_internal.cc +3 -4
  425. data/third_party/abseil-cpp/absl/status/internal/status_internal.h +3 -4
  426. data/third_party/abseil-cpp/absl/status/internal/statusor_internal.h +4 -3
  427. data/third_party/abseil-cpp/absl/status/status.cc +4 -8
  428. data/third_party/abseil-cpp/absl/status/status.h +8 -8
  429. data/third_party/abseil-cpp/absl/status/status_payload_printer.h +2 -2
  430. data/third_party/abseil-cpp/absl/status/statusor.cc +2 -2
  431. data/third_party/abseil-cpp/absl/status/statusor.h +6 -6
  432. data/third_party/abseil-cpp/absl/strings/ascii.cc +9 -9
  433. data/third_party/abseil-cpp/absl/strings/ascii.h +18 -18
  434. data/third_party/abseil-cpp/absl/strings/charconv.cc +21 -22
  435. data/third_party/abseil-cpp/absl/strings/charconv.h +5 -5
  436. data/third_party/abseil-cpp/absl/strings/cord.cc +54 -58
  437. data/third_party/abseil-cpp/absl/strings/cord.h +94 -83
  438. data/third_party/abseil-cpp/absl/strings/cord_analysis.cc +11 -11
  439. data/third_party/abseil-cpp/absl/strings/cord_analysis.h +3 -3
  440. data/third_party/abseil-cpp/absl/strings/escaping.cc +130 -149
  441. data/third_party/abseil-cpp/absl/strings/escaping.h +9 -10
  442. data/third_party/abseil-cpp/absl/strings/internal/charconv_bigint.cc +1 -1
  443. data/third_party/abseil-cpp/absl/strings/internal/cord_internal.h +6 -8
  444. data/third_party/abseil-cpp/absl/strings/internal/cord_rep_btree.cc +0 -4
  445. data/third_party/abseil-cpp/absl/strings/internal/cordz_info.cc +0 -4
  446. data/third_party/abseil-cpp/absl/strings/internal/str_format/arg.cc +7 -63
  447. data/third_party/abseil-cpp/absl/strings/internal/str_format/arg.h +1 -11
  448. data/third_party/abseil-cpp/absl/strings/internal/str_format/extension.cc +0 -22
  449. data/third_party/abseil-cpp/absl/strings/internal/str_format/output.cc +5 -3
  450. data/third_party/abseil-cpp/absl/strings/internal/str_format/parser.h +4 -2
  451. data/third_party/abseil-cpp/absl/strings/internal/str_join_internal.h +3 -3
  452. data/third_party/abseil-cpp/absl/strings/internal/string_constant.h +0 -5
  453. data/third_party/abseil-cpp/absl/strings/internal/utf8.cc +96 -1
  454. data/third_party/abseil-cpp/absl/strings/internal/utf8.h +15 -1
  455. data/third_party/abseil-cpp/absl/strings/numbers.cc +53 -32
  456. data/third_party/abseil-cpp/absl/strings/numbers.h +87 -58
  457. data/third_party/abseil-cpp/absl/strings/str_cat.cc +6 -7
  458. data/third_party/abseil-cpp/absl/strings/str_cat.h +32 -32
  459. data/third_party/abseil-cpp/absl/strings/str_format.h +18 -18
  460. data/third_party/abseil-cpp/absl/strings/str_replace.cc +3 -3
  461. data/third_party/abseil-cpp/absl/strings/str_replace.h +6 -6
  462. data/third_party/abseil-cpp/absl/strings/string_view.cc +4 -9
  463. data/third_party/abseil-cpp/absl/strings/string_view.h +27 -32
  464. data/third_party/abseil-cpp/absl/strings/strip.h +4 -4
  465. data/third_party/abseil-cpp/absl/strings/substitute.cc +5 -4
  466. data/third_party/abseil-cpp/absl/strings/substitute.h +66 -64
  467. data/third_party/abseil-cpp/absl/synchronization/internal/futex_waiter.cc +0 -4
  468. data/third_party/abseil-cpp/absl/synchronization/internal/kernel_timeout.cc +0 -5
  469. data/third_party/abseil-cpp/absl/synchronization/internal/pthread_waiter.cc +0 -4
  470. data/third_party/abseil-cpp/absl/synchronization/internal/sem_waiter.cc +0 -4
  471. data/third_party/abseil-cpp/absl/synchronization/internal/stdcpp_waiter.cc +0 -4
  472. data/third_party/abseil-cpp/absl/synchronization/internal/waiter_base.cc +0 -4
  473. data/third_party/abseil-cpp/absl/synchronization/internal/win32_waiter.cc +0 -4
  474. data/third_party/abseil-cpp/absl/synchronization/mutex.cc +1 -1
  475. data/third_party/abseil-cpp/absl/synchronization/mutex.h +97 -69
  476. data/third_party/abseil-cpp/absl/synchronization/notification.h +1 -1
  477. data/third_party/abseil-cpp/absl/time/civil_time.cc +1 -0
  478. data/third_party/abseil-cpp/absl/time/duration.cc +12 -7
  479. data/third_party/abseil-cpp/absl/time/internal/cctz/include/cctz/time_zone.h +1 -1
  480. data/third_party/abseil-cpp/absl/time/internal/cctz/src/time_zone_lookup.cc +90 -111
  481. data/third_party/abseil-cpp/absl/time/time.h +20 -15
  482. data/third_party/abseil-cpp/absl/types/optional.h +7 -747
  483. data/third_party/abseil-cpp/absl/types/span.h +13 -11
  484. data/third_party/abseil-cpp/absl/types/variant.h +5 -784
  485. data/third_party/abseil-cpp/absl/utility/utility.h +10 -185
  486. metadata +72 -20
  487. data/src/core/lib/event_engine/forkable.cc +0 -105
  488. data/src/core/lib/event_engine/forkable.h +0 -67
  489. data/src/core/lib/iomgr/python_util.h +0 -46
  490. data/third_party/abseil-cpp/absl/base/internal/inline_variable.h +0 -108
  491. data/third_party/abseil-cpp/absl/base/internal/invoke.h +0 -241
  492. data/third_party/abseil-cpp/absl/log/log_entry.cc +0 -41
  493. data/third_party/abseil-cpp/absl/random/internal/pool_urbg.h +0 -131
  494. data/third_party/abseil-cpp/absl/types/bad_optional_access.cc +0 -66
  495. data/third_party/abseil-cpp/absl/types/bad_optional_access.h +0 -78
  496. data/third_party/abseil-cpp/absl/types/bad_variant_access.cc +0 -82
  497. data/third_party/abseil-cpp/absl/types/bad_variant_access.h +0 -82
  498. data/third_party/abseil-cpp/absl/types/internal/optional.h +0 -352
  499. data/third_party/abseil-cpp/absl/types/internal/variant.h +0 -1622
@@ -26,8 +26,11 @@
26
26
  #include <utility>
27
27
 
28
28
  #include "absl/base/attributes.h"
29
+ #include "absl/functional/any_invocable.h"
29
30
  #include "absl/log/check.h"
30
31
  #include "absl/strings/string_view.h"
32
+ #include "src/core/channelz/channelz.h"
33
+ #include "src/core/channelz/property_list.h"
31
34
  #include "src/core/lib/debug/trace.h"
32
35
  #include "src/core/lib/event_engine/event_engine_context.h"
33
36
  #include "src/core/lib/promise/activity.h"
@@ -38,6 +41,7 @@
38
41
  #include "src/core/util/check_class_size.h"
39
42
  #include "src/core/util/construct_destruct.h"
40
43
  #include "src/core/util/crash.h"
44
+ #include "src/core/util/json/json_writer.h"
41
45
  #include "src/core/util/ref_counted.h"
42
46
  #include "src/core/util/ref_counted_ptr.h"
43
47
 
@@ -167,6 +171,9 @@ class Party : public Activity, private Wakeable {
167
171
  // Destroy the participant before finishing.
168
172
  virtual void Destroy() = 0;
169
173
 
174
+ // Return a description of this participant.
175
+ virtual channelz::PropertyList ChannelzProperties() = 0;
176
+
170
177
  // Return a Handle instance for this participant.
171
178
  Wakeable* MakeNonOwningWakeable(Party* party);
172
179
 
@@ -281,6 +288,20 @@ class Party : public Activity, private Wakeable {
281
288
  party_->state_.load(std::memory_order_relaxed), wakeup_mask_);
282
289
  }
283
290
 
291
+ channelz::PropertyList ChannelzProperties() override {
292
+ channelz::PropertyList properties;
293
+ if (active_ != nullptr) {
294
+ properties.Set("active", active_->ChannelzProperties());
295
+ }
296
+ properties.Set("queued", [this]() {
297
+ channelz::PropertyTable queued;
298
+ next_.ForEach(
299
+ [&](Participant* p) { queued.AppendRow(p->ChannelzProperties()); });
300
+ return queued;
301
+ }());
302
+ return properties;
303
+ }
304
+
284
305
  private:
285
306
  friend class Party;
286
307
  friend class Arena;
@@ -367,6 +388,14 @@ class Party : public Activity, private Wakeable {
367
388
  return serializer;
368
389
  }
369
390
 
391
+ // Convert the party to a JSON object for visualization.
392
+ // This is an async operation because the party cannot be locked
393
+ // synchronously.
394
+ void ToJson(absl::AnyInvocable<void(Json::Object)>);
395
+
396
+ // Export the party to channelz.
397
+ void ExportToChannelz(std::string name, channelz::DataSink sink);
398
+
370
399
  protected:
371
400
  friend class Arena;
372
401
 
@@ -407,6 +436,7 @@ class Party : public Activity, private Wakeable {
407
436
  }
408
437
 
409
438
  bool PollParticipantPromise() override {
439
+ GRPC_LATENT_SEE_INNER_SCOPE(TypeName<SuppliedFactory>());
410
440
  if (!started_) {
411
441
  auto p = factory_.Make();
412
442
  Destruct(&factory_);
@@ -422,6 +452,21 @@ class Party : public Activity, private Wakeable {
422
452
  return false;
423
453
  }
424
454
 
455
+ channelz::PropertyList ChannelzProperties() override {
456
+ return channelz::PropertyList()
457
+ .Set("on_complete", TypeName<OnComplete>())
458
+ .Set("factory", [this]() {
459
+ channelz::PropertyList factory;
460
+ if (started_) {
461
+ factory.Set("promise", PromiseProperty(&promise_));
462
+ } else {
463
+ factory.Set("factory",
464
+ TypeName<typename Factory::UnderlyingFactory>());
465
+ }
466
+ return factory;
467
+ }());
468
+ }
469
+
425
470
  void Destroy() override { delete this; }
426
471
 
427
472
  private:
@@ -463,6 +508,7 @@ class Party : public Activity, private Wakeable {
463
508
 
464
509
  // Inside party poll: drive from factory -> promise -> result
465
510
  bool PollParticipantPromise() override {
511
+ GRPC_LATENT_SEE_INNER_SCOPE(TypeName<SuppliedFactory>());
466
512
  switch (state_.load(std::memory_order_relaxed)) {
467
513
  case State::kFactory: {
468
514
  auto p = factory_.Make();
@@ -503,6 +549,23 @@ class Party : public Activity, private Wakeable {
503
549
 
504
550
  void Destroy() override { this->Unref(); }
505
551
 
552
+ channelz::PropertyList ChannelzProperties() override {
553
+ channelz::PropertyList properties;
554
+ switch (state_.load(std::memory_order_relaxed)) {
555
+ case State::kFactory:
556
+ properties.Set("factory",
557
+ TypeName<typename Factory::UnderlyingFactory>());
558
+ break;
559
+ case State::kPromise:
560
+ properties.Set("promise", PromiseProperty(&promise_));
561
+ break;
562
+ case State::kResult:
563
+ properties.Set("result", TypeName<typename Promise::Result>());
564
+ break;
565
+ }
566
+ return properties;
567
+ }
568
+
506
569
  private:
507
570
  enum class State : uint8_t { kFactory, kPromise, kResult };
508
571
  union {
@@ -580,7 +643,7 @@ class Party : public Activity, private Wakeable {
580
643
  // If the party is locked, we need to set the wakeup bits, and then
581
644
  // we'll immediately unref. Since something is running this should never
582
645
  // bring the refcount to zero.
583
- if (kReffed) {
646
+ if constexpr (kReffed) {
584
647
  DCHECK_GT(cur_state & kRefMask, kOneRef);
585
648
  } else {
586
649
  DCHECK_GE(cur_state & kRefMask, kOneRef);
@@ -626,6 +689,8 @@ class Party : public Activity, private Wakeable {
626
689
  new_state);
627
690
  }
628
691
 
692
+ channelz::PropertyList ChannelzPropertiesLocked();
693
+
629
694
  // Sentinel value for currently_polling_ when no participant is being polled.
630
695
  static constexpr uint8_t kNotPolling = 255;
631
696
 
@@ -19,6 +19,9 @@
19
19
 
20
20
  #include <utility>
21
21
 
22
+ #include "src/core/util/json/json.h"
23
+ #include "src/proto/grpc/channelz/v2/promise.upb.h"
24
+
22
25
  namespace grpc_core {
23
26
 
24
27
  /// Run all the promises, return the first result that's available.
@@ -47,6 +50,24 @@ class Race<Promise, Promises...> {
47
50
  return std::move(r.value());
48
51
  }
49
52
 
53
+ void ToProto(grpc_channelz_v2_Promise* promise_proto,
54
+ upb_Arena* arena) const {
55
+ auto* race_promise =
56
+ grpc_channelz_v2_Promise_mutable_race_promise(promise_proto, arena);
57
+ auto** children = grpc_channelz_v2_Promise_Race_resize_children(
58
+ race_promise, 1 + sizeof...(Promises), arena);
59
+ for (size_t i = 0; i < 1 + sizeof...(Promises); ++i) {
60
+ children[i] = grpc_channelz_v2_Promise_new(arena);
61
+ }
62
+ SetChildrenProto(children, 0, arena);
63
+ }
64
+
65
+ void SetChildrenProto(grpc_channelz_v2_Promise** promise_protos, int index,
66
+ upb_Arena* arena) const {
67
+ PromiseAsProto(promise_, promise_protos[index], arena);
68
+ next_.SetChildrenProto(promise_protos, index + 1, arena);
69
+ }
70
+
50
71
  private:
51
72
  // The Promise checked by this instance.
52
73
  Promise promise_;
@@ -64,6 +85,16 @@ class Race<Promise> {
64
85
  return promise_();
65
86
  }
66
87
 
88
+ void ToProto(grpc_channelz_v2_Promise* promise_proto,
89
+ upb_Arena* arena) const {
90
+ PromiseAsProto(promise_, promise_proto, arena);
91
+ }
92
+
93
+ void SetChildrenProto(grpc_channelz_v2_Promise** promise_protos, int index,
94
+ upb_Arena* arena) const {
95
+ PromiseAsProto(promise_, promise_protos[index], arena);
96
+ }
97
+
67
98
  private:
68
99
  Promise promise_;
69
100
  };
@@ -108,7 +108,10 @@ class Seq {
108
108
  return state_.PollOnce();
109
109
  }
110
110
 
111
- Json ToJson() const { return state_.ToJson("Seq"); }
111
+ void ToProto(grpc_channelz_v2_Promise* promise_proto,
112
+ upb_Arena* arena) const {
113
+ state_.ToProto(grpc_channelz_v2_Promise_NORMAL, promise_proto, arena);
114
+ }
112
115
 
113
116
  private:
114
117
  SeqState<SeqTraits, P, Fs...> state_;
@@ -275,6 +275,13 @@ class ValueOrFailure {
275
275
  return value_ != other;
276
276
  }
277
277
 
278
+ GPR_ATTRIBUTE_ALWAYS_INLINE_FUNCTION bool operator==(Failure) const {
279
+ return !value_.has_value();
280
+ }
281
+ GPR_ATTRIBUTE_ALWAYS_INLINE_FUNCTION bool operator!=(Failure) const {
282
+ return value_.has_value();
283
+ }
284
+
278
285
  private:
279
286
  std::optional<T> value_;
280
287
  };
@@ -263,7 +263,10 @@ class TrySeq {
263
263
  return state_.PollOnce();
264
264
  }
265
265
 
266
- Json ToJson() const { return state_.ToJson("TrySeq"); }
266
+ void ToProto(grpc_channelz_v2_Promise* promise_proto,
267
+ upb_Arena* arena) const {
268
+ state_.ToProto(grpc_channelz_v2_Promise_TRY, promise_proto, arena);
269
+ }
267
270
 
268
271
  private:
269
272
  SeqState<TrySeqTraits, P, Fs...> state_;
@@ -0,0 +1,28 @@
1
+ // Copyright 2025 gRPC authors.
2
+ //
3
+ // Licensed under the Apache License, Version 2.0 (the "License");
4
+ // you may not use this file except in compliance with the License.
5
+ // You may obtain a copy of the License at
6
+ //
7
+ // http://www.apache.org/licenses/LICENSE-2.0
8
+ //
9
+ // Unless required by applicable law or agreed to in writing, software
10
+ // distributed under the License is distributed on an "AS IS" BASIS,
11
+ // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12
+ // See the License for the specific language governing permissions and
13
+ // limitations under the License.
14
+
15
+ #include "src/core/lib/promise/wait_set.h"
16
+
17
+ #include "absl/strings/str_join.h"
18
+
19
+ namespace grpc_core {
20
+
21
+ std::string WaitSet::ToString() {
22
+ return absl::StrJoin(pending_, ", ",
23
+ [](std::string* out, const Waker& waker) {
24
+ absl::StrAppend(out, waker.DebugString());
25
+ });
26
+ }
27
+
28
+ } // namespace grpc_core
@@ -0,0 +1,86 @@
1
+ // Copyright 2021 gRPC authors.
2
+ //
3
+ // Licensed under the Apache License, Version 2.0 (the "License");
4
+ // you may not use this file except in compliance with the License.
5
+ // You may obtain a copy of the License at
6
+ //
7
+ // http://www.apache.org/licenses/LICENSE-2.0
8
+ //
9
+ // Unless required by applicable law or agreed to in writing, software
10
+ // distributed under the License is distributed on an "AS IS" BASIS,
11
+ // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12
+ // See the License for the specific language governing permissions and
13
+ // limitations under the License.
14
+
15
+ #ifndef GRPC_SRC_CORE_LIB_PROMISE_WAIT_SET_H
16
+ #define GRPC_SRC_CORE_LIB_PROMISE_WAIT_SET_H
17
+
18
+ #include <grpc/support/port_platform.h>
19
+
20
+ #include <utility>
21
+
22
+ #include "absl/container/flat_hash_set.h"
23
+ #include "absl/hash/hash.h"
24
+ #include "src/core/lib/promise/activity.h"
25
+ #include "src/core/lib/promise/poll.h"
26
+
27
+ namespace grpc_core {
28
+
29
+ // Helper type that can be used to enqueue many Activities waiting for some
30
+ // external state.
31
+ // Typically the external state should be guarded by mu_, and a call to
32
+ // WakeAllAndUnlock should be made when the state changes.
33
+ // Promises should bottom out polling inside pending(), which will register for
34
+ // wakeup and return Pending().
35
+ // Queues handles to Activities, and not Activities themselves, meaning that if
36
+ // an Activity is destroyed prior to wakeup we end up holding only a small
37
+ // amount of memory (around 16 bytes + malloc overhead) until the next wakeup
38
+ // occurs.
39
+ class WaitSet final {
40
+ using WakerSet = absl::flat_hash_set<Waker>;
41
+
42
+ public:
43
+ // Register for wakeup, return Pending(). If state is not ready to proceed,
44
+ // Promises should bottom out here.
45
+ Pending AddPending(Waker waker) {
46
+ pending_.emplace(std::move(waker));
47
+ return Pending();
48
+ }
49
+
50
+ class WakeupSet {
51
+ public:
52
+ void Wakeup() {
53
+ while (!wakeup_.empty()) {
54
+ wakeup_.extract(wakeup_.begin()).value().Wakeup();
55
+ }
56
+ }
57
+
58
+ private:
59
+ friend class WaitSet;
60
+ explicit WakeupSet(WakerSet&& wakeup)
61
+ : wakeup_(std::forward<WakerSet>(wakeup)) {}
62
+ WakerSet wakeup_;
63
+ };
64
+
65
+ GRPC_MUST_USE_RESULT WakeupSet TakeWakeupSet() {
66
+ auto ret = WakeupSet(std::move(pending_));
67
+ pending_.clear(); // reinitialize after move.
68
+ return ret;
69
+ }
70
+
71
+ void WakeupAsync() {
72
+ while (!pending_.empty()) {
73
+ pending_.extract(pending_.begin()).value().WakeupAsync();
74
+ }
75
+ }
76
+
77
+ std::string ToString();
78
+
79
+ private:
80
+ // Handles to activities that need to be awoken.
81
+ WakerSet pending_;
82
+ };
83
+
84
+ } // namespace grpc_core
85
+
86
+ #endif // GRPC_SRC_CORE_LIB_PROMISE_WAIT_SET_H
@@ -409,6 +409,25 @@ class ArenaSpsc {
409
409
  return result;
410
410
  }
411
411
 
412
+ T* Peek() {
413
+ Node* n = tail_.load(std::memory_order_relaxed);
414
+ Node* next = n->next.load(std::memory_order_acquire);
415
+ if (next == nullptr) return nullptr;
416
+ return &next->value;
417
+ }
418
+
419
+ // Iterate over queued nodes. At most one thread can be calling this at a
420
+ // time, and no other thread can be calling Pop().
421
+ template <typename F>
422
+ void ForEach(F f) {
423
+ Node* tail = tail_.load(std::memory_order_relaxed);
424
+ Node* n = tail->next.load(std::memory_order_acquire);
425
+ while (n != nullptr) {
426
+ f(n->value);
427
+ n = n->next.load(std::memory_order_acquire);
428
+ }
429
+ }
430
+
412
431
  private:
413
432
  struct Node {
414
433
  Node() {}
@@ -294,6 +294,11 @@ class GPR_MSVC_EMPTY_BASE_CLASS_WORKAROUND MutableSlice
294
294
  return MutableSlice(NoCheck{}, grpc_slice_split_head(c_slice_ptr(), n));
295
295
  }
296
296
 
297
+ MutableSlice TakeFirstNoInline(size_t n) {
298
+ return MutableSlice(NoCheck{},
299
+ grpc_slice_split_head_no_inline(c_slice_ptr(), n));
300
+ }
301
+
297
302
  // Iterator access to the underlying bytes
298
303
  uint8_t* begin() { return mutable_data(); }
299
304
  uint8_t* end() { return mutable_data() + size(); }
@@ -16,6 +16,7 @@
16
16
 
17
17
  #include "src/core/lib/surface/channel_create.h"
18
18
 
19
+ #include <grpc/create_channel_from_endpoint.h>
19
20
  #include <grpc/grpc.h>
20
21
  #include <grpc/impl/channel_arg_names.h>
21
22
  #include <grpc/support/port_platform.h>
@@ -30,12 +31,19 @@
30
31
  #include "src/core/credentials/transport/transport_credentials.h"
31
32
  #include "src/core/lib/channel/channel_args.h"
32
33
  #include "src/core/lib/channel/channel_args_preconditioning.h"
34
+ #include "src/core/lib/event_engine/channel_args_endpoint_config.h"
35
+ #include "src/core/lib/event_engine/endpoint_channel_arg_wrapper.h"
36
+ #include "src/core/lib/event_engine/extensions/supports_fd.h"
37
+ #include "src/core/lib/event_engine/query_extensions.h"
38
+ #include "src/core/lib/event_engine/resolved_address_internal.h"
39
+ #include "src/core/lib/event_engine/tcp_socket_utils.h"
33
40
  #include "src/core/lib/experiments/experiments.h"
34
41
  #include "src/core/lib/iomgr/exec_ctx.h"
35
42
  #include "src/core/lib/surface/channel.h"
36
43
  #include "src/core/lib/surface/channel_stack_type.h"
37
44
  #include "src/core/lib/surface/lame_client.h"
38
45
  #include "src/core/lib/surface/legacy_channel.h"
46
+ #include "src/core/resolver/fake/fake_resolver.h"
39
47
  #include "src/core/telemetry/stats.h"
40
48
  #include "src/core/telemetry/stats_data.h"
41
49
  #include "src/core/transport/endpoint_transport.h"
@@ -75,9 +83,7 @@ absl::StatusOr<RefCountedPtr<Channel>> ChannelCreate(
75
83
  std::string channelz_node_target{target.empty() ? "unknown" : target};
76
84
  auto channelz_node = MakeRefCounted<channelz::ChannelNode>(
77
85
  channelz_node_target, channel_tracer_max_memory, is_internal_channel);
78
- channelz_node->AddTraceEvent(
79
- channelz::ChannelTrace::Severity::Info,
80
- grpc_slice_from_static_string("Channel created"));
86
+ GRPC_CHANNELZ_LOG(channelz_node) << "Channel created";
81
87
  channelz_node->SetChannelArgs(args);
82
88
  // Add channelz node to channel args.
83
89
  // We remove the is_internal_channel arg, since we no longer need it.
@@ -105,25 +111,24 @@ absl::StatusOr<RefCountedPtr<Channel>> ChannelCreate(
105
111
  }
106
112
  }
107
113
 
108
- namespace {
109
114
  absl::StatusOr<grpc_channel*> CreateClientEndpointChannel(
110
115
  const char* target, grpc_channel_credentials* creds,
111
- const grpc_channel_args* c_args) {
116
+ const ChannelArgs& args) {
112
117
  const auto& c = CoreConfiguration::Get();
113
118
  if (target == nullptr) {
114
119
  return absl::InternalError("channel target is NULL");
115
120
  }
116
121
  if (creds == nullptr) return absl::InternalError("No credentials provided");
117
- auto args = creds->update_arguments(c.channel_args_preconditioning()
118
- .PreconditionChannelArgs(c_args)
119
- .SetObject(creds->Ref()));
122
+ auto final_args = creds->update_arguments(args.SetObject(creds->Ref()));
120
123
  std::vector<absl::string_view> transport_preferences = absl::StrSplit(
121
- args.GetString(GRPC_ARG_PREFERRED_TRANSPORT_PROTOCOLS).value_or("h2"),
124
+ final_args.GetString(GRPC_ARG_PREFERRED_TRANSPORT_PROTOCOLS)
125
+ .value_or("h2"),
122
126
  ',');
123
127
  if (transport_preferences.size() != 1) {
124
128
  return absl::InternalError(absl::StrCat(
125
129
  "Only one preferred transport name is currently supported: requested='",
126
- *args.GetOwnedString(GRPC_ARG_PREFERRED_TRANSPORT_PROTOCOLS), "'"));
130
+ *final_args.GetOwnedString(GRPC_ARG_PREFERRED_TRANSPORT_PROTOCOLS),
131
+ "'"));
127
132
  }
128
133
  auto* transport =
129
134
  c.endpoint_transport_registry().GetTransport(transport_preferences[0]);
@@ -131,10 +136,77 @@ absl::StatusOr<grpc_channel*> CreateClientEndpointChannel(
131
136
  return absl::InternalError(
132
137
  absl::StrCat("Unknown transport '", transport_preferences[0], "'"));
133
138
  }
134
- return transport->ChannelCreate(target, args);
139
+ return transport->ChannelCreate(target, final_args);
135
140
  }
136
141
 
137
- } // namespace
142
+ namespace experimental {
143
+
144
+ using ::grpc_event_engine::experimental::ChannelArgsEndpointConfig;
145
+ using ::grpc_event_engine::experimental::EndpointChannelArgWrapper;
146
+ using ::grpc_event_engine::experimental::EventEngine;
147
+ using ::grpc_event_engine::experimental::EventEngineSupportsFdExtension;
148
+ using ::grpc_event_engine::experimental::QueryExtension;
149
+
150
+ grpc_channel* CreateChannelFromEndpoint(
151
+ std::unique_ptr<EventEngine::Endpoint> endpoint,
152
+ grpc_channel_credentials* creds, const grpc_channel_args* args) {
153
+ auto address_str = ResolvedAddressToString(endpoint->GetPeerAddress());
154
+ // TODO(rishesh@) once https://github.com/grpc/grpc/issues/34172 is
155
+ // resolved, we should use a different address that will be less confusing for
156
+ // debuggability.
157
+ grpc_resolved_address address =
158
+ CreateGRPCResolvedAddress(endpoint->GetPeerAddress());
159
+ auto response_generator = MakeRefCounted<FakeResolverResponseGenerator>();
160
+ ChannelArgs channel_args =
161
+ CoreConfiguration::Get()
162
+ .channel_args_preconditioning()
163
+ .PreconditionChannelArgs(args)
164
+ .SetObject(
165
+ MakeRefCounted<EndpointChannelArgWrapper>(std::move(endpoint)));
166
+ if (address_str.ok() && !address_str->empty()) {
167
+ channel_args = channel_args.SetIfUnset(
168
+ GRPC_ARG_DEFAULT_AUTHORITY, URI::PercentEncodeAuthority(*address_str));
169
+ }
170
+ Resolver::Result result;
171
+ result.args = channel_args;
172
+ result.addresses = EndpointAddressesList({EndpointAddresses{address, {}}});
173
+ response_generator->SetResponseAsync(std::move(result));
174
+ auto r = CreateClientEndpointChannel(
175
+ "fake:created-from-endpoint", creds,
176
+ channel_args.SetObject(std::move(response_generator)));
177
+ if (!r.ok()) {
178
+ return grpc_lame_client_channel_create(
179
+ "fake:created-from-endpoint",
180
+ static_cast<grpc_status_code>(r.status().code()),
181
+ absl::StrCat(
182
+ "Failed to create channel to 'fake:created-from-endpoint':",
183
+ r.status().message())
184
+ .c_str());
185
+ }
186
+ return *r;
187
+ }
188
+
189
+ grpc_channel* CreateChannelFromFd(int fd, grpc_channel_credentials* creds,
190
+ const grpc_channel_args* args) {
191
+ ChannelArgs channel_args = CoreConfiguration::Get()
192
+ .channel_args_preconditioning()
193
+ .PreconditionChannelArgs(args);
194
+ EventEngineSupportsFdExtension* supports_fd =
195
+ QueryExtension<EventEngineSupportsFdExtension>(
196
+ channel_args.GetObjectRef<EventEngine>().get());
197
+ if (supports_fd == nullptr) {
198
+ return grpc_lame_client_channel_create("fake:created-from-endpoint",
199
+ GRPC_STATUS_INTERNAL,
200
+ "Failed to create client channel");
201
+ }
202
+ std::unique_ptr<EventEngine::Endpoint> endpoint =
203
+ supports_fd->CreateEndpointFromFd(
204
+ fd, ChannelArgsEndpointConfig(channel_args));
205
+ return CreateChannelFromEndpoint(std::move(endpoint), creds,
206
+ channel_args.ToC().get());
207
+ }
208
+ } // namespace experimental
209
+
138
210
  } // namespace grpc_core
139
211
 
140
212
  grpc_channel* grpc_lame_client_channel_create(const char* target,
@@ -173,7 +245,10 @@ grpc_channel* grpc_channel_create(const char* target,
173
245
  GRPC_TRACE_LOG(api, INFO)
174
246
  << "grpc_channel_create(target=" << target << ", creds=" << (void*)creds
175
247
  << ", args=" << (void*)c_args << ")";
176
- auto r = grpc_core::CreateClientEndpointChannel(target, creds, c_args);
248
+ const auto& c = grpc_core::CoreConfiguration::Get();
249
+ grpc_core::ChannelArgs channel_args =
250
+ c.channel_args_preconditioning().PreconditionChannelArgs(c_args);
251
+ auto r = grpc_core::CreateClientEndpointChannel(target, creds, channel_args);
177
252
  if (!r.ok()) {
178
253
  return grpc_lame_client_channel_create(
179
254
  target, static_cast<grpc_status_code>(r.status().code()),
@@ -37,6 +37,10 @@ absl::StatusOr<RefCountedPtr<Channel>> ChannelCreate(
37
37
  std::string target, ChannelArgs args,
38
38
  grpc_channel_stack_type channel_stack_type, Transport* optional_transport);
39
39
 
40
+ absl::StatusOr<grpc_channel*> CreateClientEndpointChannel(
41
+ const char* target, grpc_channel_credentials* creds,
42
+ const ChannelArgs& args);
43
+
40
44
  } // namespace grpc_core
41
45
 
42
46
  #endif // GRPC_SRC_CORE_LIB_SURFACE_CHANNEL_CREATE_H