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
@@ -15,6 +15,7 @@
15
15
 
16
16
  #include <grpc/support/port_platform.h>
17
17
 
18
+ #include <cstddef>
18
19
  #include <string>
19
20
  #include <vector>
20
21
 
@@ -53,13 +54,14 @@
53
54
  #include <utility>
54
55
 
55
56
  #include "absl/functional/any_invocable.h"
56
- #include "absl/hash/hash.h"
57
57
  #include "absl/log/check.h"
58
58
  #include "absl/log/log.h"
59
59
  #include "absl/strings/match.h"
60
60
  #include "absl/strings/numbers.h"
61
61
  #include "absl/strings/str_cat.h"
62
62
  #include "absl/strings/str_format.h"
63
+ #include "absl/strings/string_view.h"
64
+ #include "absl/strings/substitute.h"
63
65
  #include "src/core/config/config_vars.h"
64
66
  #include "src/core/lib/address_utils/parse_address.h"
65
67
  #include "src/core/lib/address_utils/sockaddr_utils.h"
@@ -67,7 +69,6 @@
67
69
  #include "src/core/lib/event_engine/grpc_polled_fd.h"
68
70
  #include "src/core/lib/event_engine/time_util.h"
69
71
  #include "src/core/lib/iomgr/resolved_address.h"
70
- #include "src/core/lib/iomgr/sockaddr.h"
71
72
  #include "src/core/util/debug_location.h"
72
73
  #include "src/core/util/host_port.h"
73
74
  #include "src/core/util/orphanable.h"
@@ -107,9 +108,9 @@ absl::Status AresStatusToAbslStatus(int status, absl::string_view error_msg) {
107
108
  constexpr EventEngine::Duration kAresBackupPollAlarmDuration =
108
109
  std::chrono::seconds(1);
109
110
 
110
- bool IsIpv6LoopbackAvailable() {
111
+ bool AresIsIpv6LoopbackAvailable() {
111
112
  #ifdef GRPC_POSIX_SOCKET_ARES_EV_DRIVER
112
- return PosixSocketWrapper::IsIpv6LoopbackAvailable();
113
+ return IsIpv6LoopbackAvailable();
113
114
  #elif defined(GRPC_WINDOWS_SOCKET_ARES_EV_DRIVER)
114
115
  // TODO(yijiem): implement this for Windows
115
116
  return true;
@@ -189,73 +190,118 @@ struct HostnameQueryArg : public QueryArg {
189
190
  std::vector<EventEngine::ResolvedAddress> result;
190
191
  };
191
192
 
192
- } // namespace
193
-
194
- absl::StatusOr<grpc_core::OrphanablePtr<AresResolver>>
195
- AresResolver::CreateAresResolver(
196
- absl::string_view dns_server,
197
- std::unique_ptr<GrpcPolledFdFactory> polled_fd_factory,
198
- std::shared_ptr<EventEngine> event_engine) {
193
+ absl::Status InitAresChannel(absl::string_view dns_server,
194
+ GrpcPolledFdFactory& polled_fd_factory,
195
+ ares_channel* channel) {
199
196
  ares_options opts = {};
200
197
  opts.flags |= ARES_FLAG_STAYOPEN;
201
198
  if (g_event_engine_grpc_ares_test_only_force_tcp) {
202
199
  opts.flags |= ARES_FLAG_USEVC;
203
200
  }
204
- ares_channel channel;
205
- int status = ares_init_options(&channel, &opts, ARES_OPT_FLAGS);
201
+ int status = ares_init_options(channel, &opts, ARES_OPT_FLAGS);
206
202
  if (status != ARES_SUCCESS) {
207
203
  LOG(ERROR) << "ares_init_options failed, status: " << status;
208
204
  return AresStatusToAbslStatus(
209
205
  status,
210
206
  absl::StrCat("Failed to init c-ares channel: ", ares_strerror(status)));
211
207
  }
212
- event_engine_grpc_ares_test_only_inject_config(&channel);
213
- polled_fd_factory->ConfigureAresChannelLocked(channel);
208
+ event_engine_grpc_ares_test_only_inject_config(channel);
209
+ polled_fd_factory.ConfigureAresChannelLocked(*channel);
214
210
  if (!dns_server.empty()) {
215
- absl::Status status = SetRequestDNSServer(dns_server, &channel);
211
+ absl::Status status = SetRequestDNSServer(dns_server, channel);
216
212
  if (!status.ok()) {
217
213
  return status;
218
214
  }
219
215
  }
220
- return grpc_core::MakeOrphanable<AresResolver>(
221
- std::move(polled_fd_factory), std::move(event_engine), channel);
216
+ return absl::OkStatus();
217
+ }
218
+
219
+ } // namespace
220
+
221
+ // AresResolver::ReinitHandle
222
+ #ifdef GRPC_ENABLE_FORK_SUPPORT
223
+
224
+ AresResolver::ReinitHandle::ReinitHandle(AresResolver* resolver)
225
+ : resolver_(resolver) {}
226
+
227
+ void AresResolver::ReinitHandle::OnResolverGone() {
228
+ grpc_core::MutexLock lock(&mutex_);
229
+ resolver_ = nullptr;
230
+ }
231
+
232
+ void AresResolver::ReinitHandle::Reset(const absl::Status& status) {
233
+ grpc_core::MutexLock lock(&mutex_);
234
+ if (resolver_ != nullptr) {
235
+ resolver_->Reset(status);
236
+ }
237
+ }
238
+
239
+ void AresResolver::ReinitHandle::Restart() {
240
+ grpc_core::MutexLock lock(&mutex_);
241
+ if (resolver_ != nullptr) {
242
+ resolver_->Restart();
243
+ }
244
+ }
245
+
246
+ #endif // GRPC_ENABLE_FORK_SUPPORT
247
+
248
+ // AresResolver
249
+
250
+ absl::StatusOr<grpc_core::OrphanablePtr<AresResolver>>
251
+ AresResolver::CreateAresResolver(
252
+ absl::string_view dns_server,
253
+ std::unique_ptr<GrpcPolledFdFactory> polled_fd_factory,
254
+ std::shared_ptr<EventEngine> event_engine) {
255
+ ares_channel channel;
256
+ absl::Status status =
257
+ InitAresChannel(dns_server, *polled_fd_factory, &channel);
258
+ if (!status.ok()) {
259
+ return status;
260
+ }
261
+ return grpc_core::MakeOrphanable<AresResolver>(std::move(polled_fd_factory),
262
+ std::move(event_engine),
263
+ channel, dns_server);
222
264
  }
223
265
 
224
266
  AresResolver::AresResolver(
225
267
  std::unique_ptr<GrpcPolledFdFactory> polled_fd_factory,
226
- std::shared_ptr<EventEngine> event_engine, ares_channel channel)
268
+ std::shared_ptr<EventEngine> event_engine, ares_channel channel,
269
+ absl::string_view dns_server)
227
270
  : RefCountedDNSResolverInterface(
228
271
  GRPC_TRACE_FLAG_ENABLED(cares_resolver) ? "AresResolver" : nullptr),
229
272
  channel_(channel),
230
273
  polled_fd_factory_(std::move(polled_fd_factory)),
274
+ #ifdef GRPC_ENABLE_FORK_SUPPORT
275
+ dns_server_(dns_server),
276
+ #endif // GRPC_ENABLE_FORK_SUPPORT
231
277
  event_engine_(std::move(event_engine)) {
278
+ (void)dns_server; // Used whether or not compiled with fork support
232
279
  polled_fd_factory_->Initialize(&mutex_, event_engine_.get());
233
280
  }
234
281
 
235
282
  AresResolver::~AresResolver() {
236
283
  CHECK(fd_node_list_.empty());
237
284
  CHECK(callback_map_.empty());
285
+ CHECK_NE(channel_, nullptr);
238
286
  ares_destroy(channel_);
239
287
  }
240
288
 
241
289
  void AresResolver::Orphan() {
290
+ #ifdef GRPC_ENABLE_FORK_SUPPORT
291
+ // Do this before locking &mutex_ - ensures there will be no deadlock if
292
+ // resolver is being orphaned during fork.
293
+ {
294
+ grpc_core::MutexLock handle_lock(&reinit_handle_mu_);
295
+ if (reinit_handle_ != nullptr) {
296
+ reinit_handle_->OnResolverGone();
297
+ }
298
+ }
299
+ #endif
242
300
  {
243
301
  grpc_core::MutexLock lock(&mutex_);
244
302
  shutting_down_ = true;
245
- if (ares_backup_poll_alarm_handle_.has_value()) {
246
- event_engine_->Cancel(*ares_backup_poll_alarm_handle_);
247
- ares_backup_poll_alarm_handle_.reset();
248
- }
249
- for (const auto& fd_node : fd_node_list_) {
250
- if (!fd_node->already_shutdown) {
251
- GRPC_TRACE_LOG(cares_resolver, INFO)
252
- << "(EventEngine c-ares resolver) resolver: " << this
253
- << " shutdown fd: " << fd_node->polled_fd->GetName();
254
- CHECK(fd_node->polled_fd->ShutdownLocked(
255
- absl::CancelledError("AresResolver::Orphan")));
256
- fd_node->already_shutdown = true;
257
- }
258
- }
303
+ ShutdownLocked(absl::CancelledError("AresResolver::Orphan"),
304
+ "resolver orphaned");
259
305
  }
260
306
  Unref(DEBUG_LOCATION, "Orphan");
261
307
  }
@@ -321,7 +367,8 @@ void AresResolver::LookupHostname(
321
367
  grpc_core::MutexLock lock(&mutex_);
322
368
  callback_map_.emplace(++id_, std::move(callback));
323
369
  auto* resolver_arg = new HostnameQueryArg(this, id_, name, port);
324
- if (IsIpv6LoopbackAvailable()) {
370
+ CHECK_NE(channel_, nullptr);
371
+ if (AresIsIpv6LoopbackAvailable()) {
325
372
  // Note that using AF_UNSPEC for both IPv6 and IPv4 queries does not work in
326
373
  // all cases, e.g. for localhost:<> it only gets back the IPv6 result (i.e.
327
374
  // ::1).
@@ -368,6 +415,7 @@ void AresResolver::LookupSRV(
368
415
  grpc_core::MutexLock lock(&mutex_);
369
416
  callback_map_.emplace(++id_, std::move(callback));
370
417
  auto* resolver_arg = new QueryArg(this, id_, host);
418
+ CHECK_NE(channel_, nullptr);
371
419
  ares_query(channel_, std::string(host).c_str(), ns_c_in, ns_t_srv,
372
420
  &AresResolver::OnSRVQueryDoneLocked, resolver_arg);
373
421
  CheckSocketsLocked();
@@ -403,6 +451,7 @@ void AresResolver::LookupTXT(
403
451
  grpc_core::MutexLock lock(&mutex_);
404
452
  callback_map_.emplace(++id_, std::move(callback));
405
453
  auto* resolver_arg = new QueryArg(this, id_, host);
454
+ CHECK_NE(channel_, nullptr);
406
455
  ares_search(channel_, std::string(host).c_str(), ns_c_in, ns_t_txt,
407
456
  &AresResolver::OnTXTDoneLocked, resolver_arg);
408
457
  CheckSocketsLocked();
@@ -411,15 +460,17 @@ void AresResolver::LookupTXT(
411
460
 
412
461
  void AresResolver::CheckSocketsLocked() {
413
462
  FdNodeList new_list;
414
- if (!shutting_down_) {
463
+ if (!shutting_down_ && channel_ != nullptr) {
415
464
  ares_socket_t socks[ARES_GETSOCK_MAXNUM] = {};
416
465
  int socks_bitmask = ares_getsock(channel_, socks, ARES_GETSOCK_MAXNUM);
417
466
  for (size_t i = 0; i < ARES_GETSOCK_MAXNUM; i++) {
418
467
  if (ARES_GETSOCK_READABLE(socks_bitmask, i) ||
419
468
  ARES_GETSOCK_WRITABLE(socks_bitmask, i)) {
420
- auto iter = std::find_if(
421
- fd_node_list_.begin(), fd_node_list_.end(),
422
- [sock = socks[i]](const auto& node) { return node->as == sock; });
469
+ auto iter = std::find_if(fd_node_list_.begin(), fd_node_list_.end(),
470
+ [sock = socks[i]](const auto& node) {
471
+ return node->as == sock &&
472
+ node->polled_fd->IsCurrent();
473
+ });
423
474
  if (iter == fd_node_list_.end()) {
424
475
  GRPC_TRACE_LOG(cares_resolver, INFO)
425
476
  << "(EventEngine c-ares resolver) resolver:" << this
@@ -530,14 +581,16 @@ void AresResolver::OnReadable(FdNode* fd_node, absl::Status status) {
530
581
  GRPC_TRACE_LOG(cares_resolver, INFO)
531
582
  << "(EventEngine c-ares resolver) OnReadable: fd: " << fd_node->as
532
583
  << "; request: " << this << "; status: " << status;
533
- if (status.ok() && !shutting_down_) {
584
+ if (status.ok() && !shutting_down_ && channel_ != nullptr) {
534
585
  ares_process_fd(channel_, fd_node->as, ARES_SOCKET_BAD);
535
- } else {
586
+ } else if (fd_node->polled_fd->IsCurrent() && channel_ != nullptr) {
536
587
  // If error is not absl::OkStatus() or the resolution was cancelled, it
537
588
  // means the fd has been shutdown or timed out. The pending lookups made
538
589
  // on this request will be cancelled by the following ares_cancel(). The
539
590
  // remaining file descriptors in this request will be cleaned up in the
540
591
  // following Work() method.
592
+ //
593
+ // Nothing is done if the handle is not current.
541
594
  ares_cancel(channel_);
542
595
  }
543
596
  CheckSocketsLocked();
@@ -550,9 +603,9 @@ void AresResolver::OnWritable(FdNode* fd_node, absl::Status status) {
550
603
  GRPC_TRACE_LOG(cares_resolver, INFO)
551
604
  << "(EventEngine c-ares resolver) OnWritable: fd: " << fd_node->as
552
605
  << "; request:" << this << "; status: " << status;
553
- if (status.ok() && !shutting_down_) {
606
+ if (status.ok() && !shutting_down_ && channel_ != nullptr) {
554
607
  ares_process_fd(channel_, ARES_SOCKET_BAD, fd_node->as);
555
- } else {
608
+ } else if (fd_node->polled_fd->IsCurrent() && channel_ != nullptr) {
556
609
  // If error is not absl::OkStatus() or the resolution was cancelled, it
557
610
  // means the fd has been shutdown or timed out. The pending lookups made
558
611
  // on this request will be cancelled by the following ares_cancel(). The
@@ -577,7 +630,7 @@ void AresResolver::OnAresBackupPollAlarm() {
577
630
  GRPC_TRACE_LOG(cares_resolver, INFO)
578
631
  << "(EventEngine c-ares resolver) request:" << this
579
632
  << " OnAresBackupPollAlarm shutting_down=" << shutting_down_;
580
- if (!shutting_down_) {
633
+ if (!shutting_down_ && channel_ != nullptr) {
581
634
  for (const auto& fd_node : fd_node_list_) {
582
635
  if (!fd_node->already_shutdown) {
583
636
  GRPC_TRACE_LOG(cares_resolver, INFO)
@@ -665,7 +718,10 @@ void AresResolver::OnHostbynameDoneLocked(void* arg, int status,
665
718
  if (hostname_qa->pending_requests == 0) {
666
719
  auto nh =
667
720
  ares_resolver->callback_map_.extract(hostname_qa->callback_map_id);
668
- CHECK(!nh.empty());
721
+ if (nh.empty()) {
722
+ delete hostname_qa;
723
+ return;
724
+ }
669
725
  CHECK(std::holds_alternative<
670
726
  EventEngine::DNSResolver::LookupHostnameCallback>(nh.mapped()));
671
727
  auto callback = std::get<EventEngine::DNSResolver::LookupHostnameCallback>(
@@ -692,7 +748,9 @@ void AresResolver::OnSRVQueryDoneLocked(void* arg, int status, int /*timeouts*/,
692
748
  std::unique_ptr<QueryArg> qa(static_cast<QueryArg*>(arg));
693
749
  auto* ares_resolver = qa->ares_resolver;
694
750
  auto nh = ares_resolver->callback_map_.extract(qa->callback_map_id);
695
- CHECK(!nh.empty());
751
+ if (nh.empty()) {
752
+ return;
753
+ }
696
754
  CHECK(std::holds_alternative<EventEngine::DNSResolver::LookupSRVCallback>(
697
755
  nh.mapped()));
698
756
  auto callback = std::get<EventEngine::DNSResolver::LookupSRVCallback>(
@@ -753,7 +811,9 @@ void AresResolver::OnTXTDoneLocked(void* arg, int status, int /*timeouts*/,
753
811
  std::unique_ptr<QueryArg> qa(static_cast<QueryArg*>(arg));
754
812
  auto* ares_resolver = qa->ares_resolver;
755
813
  auto nh = ares_resolver->callback_map_.extract(qa->callback_map_id);
756
- CHECK(!nh.empty());
814
+ if (nh.empty()) {
815
+ return;
816
+ }
757
817
  CHECK(std::holds_alternative<EventEngine::DNSResolver::LookupTXTCallback>(
758
818
  nh.mapped()));
759
819
  auto callback = std::get<EventEngine::DNSResolver::LookupTXTCallback>(
@@ -809,6 +869,65 @@ void AresResolver::OnTXTDoneLocked(void* arg, int status, int /*timeouts*/,
809
869
  });
810
870
  }
811
871
 
872
+ #ifdef GRPC_ENABLE_FORK_SUPPORT
873
+
874
+ std::weak_ptr<AresResolver::ReinitHandle> AresResolver::GetReinitHandle() {
875
+ grpc_core::MutexLock lock(&reinit_handle_mu_);
876
+ if (reinit_handle_ == nullptr) {
877
+ reinit_handle_ = ReinitHandle::New(this);
878
+ }
879
+ return reinit_handle_;
880
+ }
881
+
882
+ void AresResolver::Reset(const absl::Status& reason) {
883
+ auto self = RefIfNonZero();
884
+ if (self == nullptr) {
885
+ return;
886
+ }
887
+ grpc_core::MutexLock lock(&mutex_);
888
+ for (auto& [_, callback] : callback_map_) {
889
+ event_engine_->Run(
890
+ [callback = std::move(callback), reason = reason]() mutable {
891
+ std::visit([&](auto& cb) { cb(reason); }, callback);
892
+ });
893
+ }
894
+ callback_map_.clear();
895
+ ShutdownLocked(reason, "resolver reset");
896
+ CheckSocketsLocked();
897
+ CHECK_NE(channel_, nullptr);
898
+ ares_destroy(channel_);
899
+ channel_ = nullptr;
900
+ }
901
+
902
+ void AresResolver::Restart() {
903
+ grpc_core::MutexLock lock(&mutex_);
904
+ polled_fd_factory_ = polled_fd_factory_->NewEmptyInstance();
905
+ polled_fd_factory_->Initialize(&mutex_, event_engine_.get());
906
+ CHECK_EQ(channel_, nullptr);
907
+ absl::Status status =
908
+ InitAresChannel(dns_server_, *polled_fd_factory_, &channel_);
909
+ CHECK_OK(status);
910
+ }
911
+
912
+ #endif // GRPC_ENABLE_FORK_SUPPORT
913
+
914
+ void AresResolver::ShutdownLocked(const absl::Status& shutdown_status,
915
+ absl::string_view reason) {
916
+ if (ares_backup_poll_alarm_handle_.has_value()) {
917
+ event_engine_->Cancel(*ares_backup_poll_alarm_handle_);
918
+ ares_backup_poll_alarm_handle_.reset();
919
+ }
920
+ for (const auto& fd_node : fd_node_list_) {
921
+ if (!fd_node->already_shutdown) {
922
+ GRPC_TRACE_LOG(cares_resolver, INFO) << absl::Substitute(
923
+ "(EventEngine c-ares resolver) resolver: $0 shutdown fd: $1 ($2)",
924
+ this, fd_node->polled_fd->GetName(), reason);
925
+ CHECK(fd_node->polled_fd->ShutdownLocked(shutdown_status));
926
+ fd_node->already_shutdown = true;
927
+ }
928
+ }
929
+ }
930
+
812
931
  } // namespace grpc_event_engine::experimental
813
932
 
814
933
  void noop_inject_channel_config(ares_channel* /*channel*/) {}
@@ -19,7 +19,6 @@
19
19
  #include <utility>
20
20
 
21
21
  #include "absl/status/status.h"
22
- #include "src/core/lib/debug/trace.h"
23
22
 
24
23
  #if GRPC_ARES == 1
25
24
 
@@ -42,6 +41,32 @@ namespace grpc_event_engine::experimental {
42
41
 
43
42
  class AresResolver : public RefCountedDNSResolverInterface {
44
43
  public:
44
+ #ifdef GRPC_ENABLE_FORK_SUPPORT
45
+ // Handle to trigger reinitialization of this AresResolver instance after a
46
+ // fork(). Avoids global resolver management and POSIX-specific dependencies
47
+ // within AresResolver.
48
+ class ReinitHandle {
49
+ public:
50
+ static std::shared_ptr<ReinitHandle> New(AresResolver* resolver) {
51
+ return std::shared_ptr<ReinitHandle>(new ReinitHandle(resolver));
52
+ }
53
+
54
+ ReinitHandle(ReinitHandle&& other) = delete;
55
+ ReinitHandle(const ReinitHandle& other) = delete;
56
+ void OnResolverGone();
57
+ // Clears resources (such as CARES handles) held by the associated resolver.
58
+ void Reset(const absl::Status& status);
59
+ // Reinitializes the associated resolver after Reset.
60
+ void Restart();
61
+
62
+ private:
63
+ explicit ReinitHandle(AresResolver* resolver);
64
+
65
+ grpc_core::Mutex mutex_;
66
+ AresResolver* resolver_ ABSL_GUARDED_BY(&mutex_);
67
+ };
68
+ #endif // GRPC_ENABLE_FORK_SUPPORT
69
+
45
70
  static absl::StatusOr<grpc_core::OrphanablePtr<AresResolver>>
46
71
  CreateAresResolver(absl::string_view dns_server,
47
72
  std::unique_ptr<GrpcPolledFdFactory> polled_fd_factory,
@@ -49,7 +74,8 @@ class AresResolver : public RefCountedDNSResolverInterface {
49
74
 
50
75
  // Do not instantiate directly -- use CreateAresResolver() instead.
51
76
  AresResolver(std::unique_ptr<GrpcPolledFdFactory> polled_fd_factory,
52
- std::shared_ptr<EventEngine> event_engine, ares_channel channel);
77
+ std::shared_ptr<EventEngine> event_engine, ares_channel channel,
78
+ absl::string_view dns_server);
53
79
  ~AresResolver() override;
54
80
  void Orphan() override ABSL_LOCKS_EXCLUDED(mutex_);
55
81
 
@@ -60,6 +86,9 @@ class AresResolver : public RefCountedDNSResolverInterface {
60
86
  absl::string_view name) ABSL_LOCKS_EXCLUDED(mutex_) override;
61
87
  void LookupTXT(EventEngine::DNSResolver::LookupTXTCallback callback,
62
88
  absl::string_view name) ABSL_LOCKS_EXCLUDED(mutex_) override;
89
+ #ifdef GRPC_ENABLE_FORK_SUPPORT
90
+ std::weak_ptr<ReinitHandle> GetReinitHandle();
91
+ #endif // GRPC_ENABLE_FORK_SUPPORT
63
92
 
64
93
  private:
65
94
  // A FdNode saves (not owns) a live socket/fd which c-ares creates, and owns a
@@ -109,6 +138,17 @@ class AresResolver : public RefCountedDNSResolverInterface {
109
138
  static void OnTXTDoneLocked(void* arg, int status, int /*timeouts*/,
110
139
  unsigned char* buf,
111
140
  int len) ABSL_NO_THREAD_SAFETY_ANALYSIS;
141
+ #ifdef GRPC_ENABLE_FORK_SUPPORT
142
+ // Is executed on fork before the poller is restarted. Cleans up the resources
143
+ // from the previous generation.
144
+ void Reset(const absl::Status& reason);
145
+ // Is executed on fork after the poller is restarted. Makes the resolver
146
+ // usable once more.
147
+ void Restart();
148
+ #endif // GRPC_ENABLE_FORK_SUPPORT
149
+ void ShutdownLocked(const absl::Status& shutdown_status,
150
+ absl::string_view reason)
151
+ ABSL_EXCLUSIVE_LOCKS_REQUIRED(mutex_);
112
152
 
113
153
  grpc_core::Mutex mutex_;
114
154
  bool shutting_down_ ABSL_GUARDED_BY(mutex_) = false;
@@ -119,6 +159,12 @@ class AresResolver : public RefCountedDNSResolverInterface {
119
159
  std::optional<EventEngine::TaskHandle> ares_backup_poll_alarm_handle_
120
160
  ABSL_GUARDED_BY(mutex_);
121
161
  std::unique_ptr<GrpcPolledFdFactory> polled_fd_factory_;
162
+ #ifdef GRPC_ENABLE_FORK_SUPPORT
163
+ std::string dns_server_;
164
+ grpc_core::Mutex reinit_handle_mu_;
165
+ std::shared_ptr<ReinitHandle> reinit_handle_
166
+ ABSL_GUARDED_BY(reinit_handle_mu_);
167
+ #endif // GRPC_ENABLE_FORK_SUPPORT
122
168
  std::shared_ptr<EventEngine> event_engine_;
123
169
  };
124
170
 
@@ -31,6 +31,7 @@
31
31
  #include "src/core/lib/event_engine/thread_pool/thread_pool.h"
32
32
  #include "src/core/lib/event_engine/utils.h"
33
33
  #include "src/core/util/crash.h"
34
+ #include "src/core/util/useful.h"
34
35
 
35
36
  #ifndef GRPC_CFSTREAM_MAX_THREADPOOL_SIZE
36
37
  #define GRPC_CFSTREAM_MAX_THREADPOOL_SIZE 16u
@@ -58,7 +59,8 @@ struct CFEventEngine::Closure final : public EventEngine::Closure {
58
59
 
59
60
  CFEventEngine::CFEventEngine()
60
61
  : thread_pool_(MakeThreadPool(grpc_core::Clamp(
61
- gpr_cpu_num_cores(), 2u, GRPC_CFSTREAM_MAX_THREADPOOL_SIZE))),
62
+ gpr_cpu_num_cores(), 2u,
63
+ static_cast<unsigned int>(GRPC_CFSTREAM_MAX_THREADPOOL_SIZE)))),
62
64
  timer_manager_(thread_pool_) {}
63
65
 
64
66
  CFEventEngine::~CFEventEngine() {
@@ -26,14 +26,11 @@
26
26
  #include "src/core/lib/event_engine/posix_engine/lockfree_event.h"
27
27
  #include "src/core/lib/event_engine/posix_engine/posix_engine_closure.h"
28
28
  #include "src/core/lib/event_engine/posix_engine/timer_manager.h"
29
- #include "src/core/lib/surface/init_internally.h"
30
29
  #include "src/core/util/sync.h"
31
30
 
32
31
  namespace grpc_event_engine::experimental {
33
32
 
34
- class CFEventEngine : public EventEngine,
35
- public Scheduler,
36
- public grpc_core::KeepsGrpcInitialized {
33
+ class CFEventEngine : public EventEngine, public Scheduler {
37
34
  public:
38
35
  CFEventEngine();
39
36
  ~CFEventEngine() override;
@@ -124,12 +124,8 @@ class CFStreamEndpoint : public EventEngine::Endpoint {
124
124
  return impl_->GetLocalAddress();
125
125
  }
126
126
 
127
- std::vector<size_t> AllWriteMetrics() override { return {}; }
128
- std::optional<absl::string_view> GetMetricName(size_t) override {
129
- return std::nullopt;
130
- }
131
- std::optional<size_t> GetMetricKey(absl::string_view) override {
132
- return std::nullopt;
127
+ std::shared_ptr<TelemetryInfo> GetTelemetryInfo() const override {
128
+ return nullptr;
133
129
  }
134
130
 
135
131
  public:
@@ -0,0 +1,40 @@
1
+ // Copyright 2025 The 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/event_engine/endpoint_channel_arg_wrapper.h"
16
+
17
+ #include "src/core/util/useful.h"
18
+ namespace grpc_event_engine {
19
+ namespace experimental {
20
+
21
+ EndpointChannelArgWrapper::EndpointChannelArgWrapper(
22
+ std::unique_ptr<EventEngine::Endpoint> endpoint)
23
+ : endpoint_(std::move(endpoint)) {}
24
+
25
+ std::unique_ptr<EventEngine::Endpoint>
26
+ EndpointChannelArgWrapper::TakeEndpoint() {
27
+ return std::move(endpoint_);
28
+ }
29
+
30
+ absl::string_view EndpointChannelArgWrapper::ChannelArgName() {
31
+ return "grpc.internal.subchannel_endpoint";
32
+ }
33
+
34
+ int EndpointChannelArgWrapper::ChannelArgsCompare(
35
+ const EndpointChannelArgWrapper* a, const EndpointChannelArgWrapper* b) {
36
+ return QsortCompare(a, b);
37
+ }
38
+
39
+ } // namespace experimental
40
+ } // namespace grpc_event_engine
@@ -0,0 +1,60 @@
1
+ // Copyright 2025 The 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_EVENT_ENGINE_ENDPOINT_CHANNEL_ARG_WRAPPER_H
16
+ #define GRPC_SRC_CORE_LIB_EVENT_ENGINE_ENDPOINT_CHANNEL_ARG_WRAPPER_H
17
+
18
+ #include <grpc/event_engine/event_engine.h>
19
+
20
+ #include <memory>
21
+
22
+ #include "src/core/util/ref_counted.h"
23
+
24
+ namespace grpc_event_engine {
25
+
26
+ namespace experimental {
27
+
28
+ /// Wrapper for EventEngine::Endpoint to enable storing it in channel args.
29
+ ///
30
+ /// This class encapsulates a `std::unique_ptr<EventEngine::Endpoint>` so that
31
+ /// an already-connected endpoint can be passed through channel arguments.
32
+ /// This is useful when creating a channel with a pre-established connection,
33
+ /// such as when using `CreateChannelFromEndpoint()` or `CreateChannelFromFd()`.
34
+ ///
35
+ /// The wrapper provides:
36
+ /// - Ownership management via unique_ptr
37
+ /// - A static `ChannelArgName()` method to identify the channel arg
38
+ /// - A comparison function for use in channel args internals
39
+ ///
40
+ /// Note: This is intended for internal use only.
41
+ class EndpointChannelArgWrapper
42
+ : public grpc_core::RefCounted<EndpointChannelArgWrapper> {
43
+ public:
44
+ explicit EndpointChannelArgWrapper(
45
+ std::unique_ptr<EventEngine::Endpoint> endpoint);
46
+
47
+ std::unique_ptr<EventEngine::Endpoint> TakeEndpoint();
48
+
49
+ static absl::string_view ChannelArgName();
50
+ static int ChannelArgsCompare(const EndpointChannelArgWrapper* a,
51
+ const EndpointChannelArgWrapper* b);
52
+
53
+ private:
54
+ std::unique_ptr<EventEngine::Endpoint> endpoint_;
55
+ };
56
+
57
+ } // namespace experimental
58
+ } // namespace grpc_event_engine
59
+
60
+ #endif // GRPC_SRC_CORE_LIB_EVENT_ENGINE_ENDPOINT_CHANNEL_ARG_WRAPPER_H
@@ -15,9 +15,16 @@
15
15
  #include <grpc/support/port_platform.h>
16
16
 
17
17
  #include "absl/strings/str_cat.h"
18
+ #include "src/core/telemetry/context_list_entry.h"
18
19
 
19
20
  namespace grpc_event_engine::experimental {
20
21
 
22
+ EventEngine::Endpoint::WriteArgs::~WriteArgs() {
23
+ if (google_specific_ != nullptr) {
24
+ delete reinterpret_cast<grpc_core::ContextList*>(google_specific_);
25
+ }
26
+ }
27
+
21
28
  const EventEngine::TaskHandle EventEngine::TaskHandle::kInvalid = {-1, -1};
22
29
  const EventEngine::ConnectionHandle EventEngine::ConnectionHandle::kInvalid = {
23
30
  -1, -1};
@@ -34,19 +34,23 @@ class ChannelzExtension {
34
34
 
35
35
  void SetSocketNode(
36
36
  grpc_core::RefCountedPtr<grpc_core::channelz::SocketNode> socket_node) {
37
- data_source_ =
38
- std::make_unique<EndpointDataSource>(std::move(socket_node), this);
37
+ data_source_.emplace(std::move(socket_node), this);
39
38
  }
40
39
 
40
+ protected:
41
+ void ShutdownChannelzExtension() { data_source_.reset(); }
42
+
41
43
  private:
42
44
  class EndpointDataSource final : public grpc_core::channelz::DataSource {
43
45
  public:
44
46
  EndpointDataSource(
45
47
  grpc_core::RefCountedPtr<grpc_core::channelz::SocketNode> socket_node,
46
48
  ChannelzExtension* ep)
47
- : grpc_core::channelz::DataSource(std::move(socket_node)), ep_(ep) {}
48
- ~EndpointDataSource() { ResetDataSource(); }
49
- void AddData(grpc_core::channelz::DataSink& sink) override {
49
+ : grpc_core::channelz::DataSource(std::move(socket_node)), ep_(ep) {
50
+ SourceConstructed();
51
+ }
52
+ ~EndpointDataSource() { SourceDestructing(); }
53
+ void AddData(grpc_core::channelz::DataSink sink) override {
50
54
  ep_->AddJson(sink);
51
55
  }
52
56
 
@@ -54,7 +58,7 @@ class ChannelzExtension {
54
58
  ChannelzExtension* ep_;
55
59
  };
56
60
 
57
- std::unique_ptr<EndpointDataSource> data_source_;
61
+ std::optional<EndpointDataSource> data_source_;
58
62
  };
59
63
 
60
64
  } // namespace grpc_event_engine::experimental