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
@@ -62,6 +62,9 @@ class GrpcPolledFd {
62
62
  virtual ares_socket_t GetWrappedAresSocketLocked() = 0;
63
63
  // A unique name, for logging
64
64
  virtual const char* GetName() const = 0;
65
+ // Return if the FD is "current" - particularly, if it is of the same fork
66
+ // generation in case of Posix
67
+ virtual bool IsCurrent() const = 0;
65
68
  };
66
69
 
67
70
  // A GrpcPolledFdFactory is 1-to-1 with and owned by a GrpcAresRequest. It knows
@@ -80,6 +83,8 @@ class GrpcPolledFdFactory {
80
83
  ares_socket_t as) = 0;
81
84
  // Optionally configures the ares channel after creation
82
85
  virtual void ConfigureAresChannelLocked(ares_channel channel) = 0;
86
+ // Creates a new instance of the same class. This is used during the fork.
87
+ virtual std::unique_ptr<GrpcPolledFdFactory> NewEmptyInstance() const = 0;
83
88
  };
84
89
 
85
90
  } // namespace grpc_event_engine::experimental
@@ -28,6 +28,7 @@
28
28
  #include "absl/status/statusor.h"
29
29
  #include "absl/strings/str_format.h"
30
30
  #include "src/core/lib/event_engine/poller.h"
31
+ #include "src/core/lib/event_engine/posix_engine/posix_interface.h"
31
32
  #include "src/core/lib/event_engine/time_util.h"
32
33
  #include "src/core/lib/iomgr/port.h"
33
34
  #include "src/core/util/crash.h"
@@ -46,7 +47,6 @@
46
47
  #include "src/core/lib/event_engine/posix_engine/posix_engine_closure.h"
47
48
  #include "src/core/lib/event_engine/posix_engine/wakeup_fd_posix.h"
48
49
  #include "src/core/lib/event_engine/posix_engine/wakeup_fd_posix_default.h"
49
- #include "src/core/util/fork.h"
50
50
  #include "src/core/util/status_helper.h"
51
51
  #include "src/core/util/strerror.h"
52
52
  #include "src/core/util/sync.h"
@@ -57,26 +57,24 @@ namespace grpc_event_engine::experimental {
57
57
 
58
58
  class Epoll1EventHandle : public EventHandle {
59
59
  public:
60
- Epoll1EventHandle(int fd, Epoll1Poller* poller)
60
+ Epoll1EventHandle(const FileDescriptor& fd, Epoll1Poller* poller)
61
61
  : fd_(fd),
62
- list_(this),
63
62
  poller_(poller),
64
- read_closure_(std::make_unique<LockfreeEvent>(poller->GetScheduler())),
65
- write_closure_(std::make_unique<LockfreeEvent>(poller->GetScheduler())),
66
- error_closure_(
67
- std::make_unique<LockfreeEvent>(poller->GetScheduler())) {
68
- read_closure_->InitEvent();
69
- write_closure_->InitEvent();
70
- error_closure_->InitEvent();
63
+ read_closure_(poller->GetScheduler()),
64
+ write_closure_(poller->GetScheduler()),
65
+ error_closure_(poller->GetScheduler()) {
66
+ read_closure_.InitEvent();
67
+ write_closure_.InitEvent();
68
+ error_closure_.InitEvent();
71
69
  pending_read_.store(false, std::memory_order_relaxed);
72
70
  pending_write_.store(false, std::memory_order_relaxed);
73
71
  pending_error_.store(false, std::memory_order_relaxed);
74
72
  }
75
- void ReInit(int fd) {
73
+ void ReInit(FileDescriptor fd) {
76
74
  fd_ = fd;
77
- read_closure_->InitEvent();
78
- write_closure_->InitEvent();
79
- error_closure_->InitEvent();
75
+ read_closure_.InitEvent();
76
+ write_closure_.InitEvent();
77
+ error_closure_.InitEvent();
80
78
  pending_read_.store(false, std::memory_order_relaxed);
81
79
  pending_write_.store(false, std::memory_order_relaxed);
82
80
  pending_error_.store(false, std::memory_order_relaxed);
@@ -106,8 +104,8 @@ class Epoll1EventHandle : public EventHandle {
106
104
 
107
105
  return pending_read || pending_write || pending_error;
108
106
  }
109
- int WrappedFd() override { return fd_; }
110
- void OrphanHandle(PosixEngineClosure* on_done, int* release_fd,
107
+ FileDescriptor WrappedFd() override { return fd_; }
108
+ void OrphanHandle(PosixEngineClosure* on_done, FileDescriptor* release_fd,
111
109
  absl::string_view reason) override;
112
110
  void ShutdownHandle(absl::Status why) override;
113
111
  void NotifyOnRead(PosixEngineClosure* on_read) override;
@@ -121,20 +119,19 @@ class Epoll1EventHandle : public EventHandle {
121
119
  // These may execute in Parallel with ShutdownHandle. Thats not an issue
122
120
  // because the lockfree event implementation should be able to handle it.
123
121
  if (pending_read_.exchange(false, std::memory_order_acq_rel)) {
124
- read_closure_->SetReady();
122
+ read_closure_.SetReady();
125
123
  }
126
124
  if (pending_write_.exchange(false, std::memory_order_acq_rel)) {
127
- write_closure_->SetReady();
125
+ write_closure_.SetReady();
128
126
  }
129
127
  if (pending_error_.exchange(false, std::memory_order_acq_rel)) {
130
- error_closure_->SetReady();
128
+ error_closure_.SetReady();
131
129
  }
132
130
  }
133
131
  grpc_core::Mutex* mu() { return &mu_; }
134
- LockfreeEvent* ReadClosure() { return read_closure_.get(); }
135
- LockfreeEvent* WriteClosure() { return write_closure_.get(); }
136
- LockfreeEvent* ErrorClosure() { return error_closure_.get(); }
137
- Epoll1Poller::HandlesList& ForkFdListPos() { return list_; }
132
+ LockfreeEvent* ReadClosure() { return &read_closure_; }
133
+ LockfreeEvent* WriteClosure() { return &write_closure_; }
134
+ LockfreeEvent* ErrorClosure() { return &error_closure_; }
138
135
  ~Epoll1EventHandle() override = default;
139
136
 
140
137
  private:
@@ -142,141 +139,80 @@ class Epoll1EventHandle : public EventHandle {
142
139
  // See Epoll1Poller::ShutdownHandle for explanation on why a mutex is
143
140
  // required.
144
141
  grpc_core::Mutex mu_;
145
- int fd_;
142
+ FileDescriptor fd_;
146
143
  // See Epoll1Poller::SetPendingActions for explanation on why pending_<***>_
147
144
  // need to be atomic.
148
145
  std::atomic<bool> pending_read_{false};
149
146
  std::atomic<bool> pending_write_{false};
150
147
  std::atomic<bool> pending_error_{false};
151
- Epoll1Poller::HandlesList list_;
152
148
  Epoll1Poller* poller_;
153
- std::unique_ptr<LockfreeEvent> read_closure_;
154
- std::unique_ptr<LockfreeEvent> write_closure_;
155
- std::unique_ptr<LockfreeEvent> error_closure_;
149
+ LockfreeEvent read_closure_;
150
+ LockfreeEvent write_closure_;
151
+ LockfreeEvent error_closure_;
156
152
  };
157
153
 
158
154
  namespace {
159
155
 
160
- int EpollCreateAndCloexec() {
161
- #ifdef GRPC_LINUX_EPOLL_CREATE1
162
- int fd = epoll_create1(EPOLL_CLOEXEC);
163
- if (fd < 0) {
164
- LOG(ERROR) << "epoll_create1 unavailable";
165
- }
166
- #else
167
- int fd = epoll_create(MAX_EPOLL_EVENTS);
168
- if (fd < 0) {
169
- LOG(ERROR) << "epoll_create unavailable";
170
- } else if (fcntl(fd, F_SETFD, FD_CLOEXEC) != 0) {
171
- LOG(ERROR) << "fcntl following epoll_create failed";
172
- return -1;
173
- }
174
- #endif
175
- return fd;
176
- }
177
-
178
- // Only used when GRPC_ENABLE_FORK_SUPPORT=1
179
- std::list<Epoll1Poller*> fork_poller_list;
180
-
181
- gpr_mu fork_fd_list_mu;
182
-
183
- void ForkPollerListAddPoller(Epoll1Poller* poller) {
184
- if (grpc_core::Fork::Enabled()) {
185
- gpr_mu_lock(&fork_fd_list_mu);
186
- fork_poller_list.push_back(poller);
187
- gpr_mu_unlock(&fork_fd_list_mu);
188
- }
189
- }
190
-
191
- void ForkPollerListRemovePoller(Epoll1Poller* poller) {
192
- if (grpc_core::Fork::Enabled()) {
193
- gpr_mu_lock(&fork_fd_list_mu);
194
- fork_poller_list.remove(poller);
195
- gpr_mu_unlock(&fork_fd_list_mu);
196
- }
197
- }
198
-
199
- bool InitEpoll1PollerLinux();
200
-
201
- // Called by the child process's post-fork handler to close open fds,
202
- // including the global epoll fd of each poller. This allows gRPC to shutdown in
203
- // the child process without interfering with connections or RPCs ongoing in the
204
- // parent.
205
- void ResetEventManagerOnFork() {
206
- gpr_mu_lock(&fork_fd_list_mu);
207
- // Delete all registered pollers. This also closes all open epoll_sets
208
- while (!fork_poller_list.empty()) {
209
- Epoll1Poller* poller = fork_poller_list.front();
210
- fork_poller_list.pop_front();
211
- poller->Close();
212
- }
213
- gpr_mu_unlock(&fork_fd_list_mu);
214
- InitEpoll1PollerLinux();
215
- }
216
-
217
156
  // It is possible that GLIBC has epoll but the underlying kernel doesn't.
218
157
  // Create epoll_fd to make sure epoll support is available
219
158
  bool InitEpoll1PollerLinux() {
220
159
  if (!grpc_event_engine::experimental::SupportsWakeupFd()) {
221
160
  return false;
222
161
  }
223
- int fd = EpollCreateAndCloexec();
224
- if (fd <= 0) {
162
+ EventEnginePosixInterface posix_interface;
163
+ auto fd = posix_interface.EpollCreateAndCloexec();
164
+ if (!fd.ok()) {
225
165
  return false;
226
166
  }
227
- if (grpc_core::Fork::Enabled()) {
228
- if (grpc_core::Fork::RegisterResetChildPollingEngineFunc(
229
- ResetEventManagerOnFork)) {
230
- gpr_mu_init(&fork_fd_list_mu);
231
- }
232
- }
233
- close(fd);
167
+ posix_interface.Close(fd.value());
234
168
  return true;
235
169
  }
236
170
 
237
171
  } // namespace
238
172
 
239
173
  void Epoll1EventHandle::OrphanHandle(PosixEngineClosure* on_done,
240
- int* release_fd,
174
+ FileDescriptor* release_fd,
241
175
  absl::string_view reason) {
242
176
  bool is_release_fd = (release_fd != nullptr);
243
177
  bool was_shutdown = false;
244
- if (!read_closure_->IsShutdown()) {
178
+ if (!read_closure_.IsShutdown()) {
245
179
  was_shutdown = true;
246
180
  HandleShutdownInternal(absl::Status(absl::StatusCode::kUnknown, reason),
247
181
  is_release_fd);
248
182
  }
249
-
183
+ auto& posix_interface = poller_->posix_interface();
250
184
  // If release_fd is not NULL, we should be relinquishing control of the file
251
185
  // descriptor fd->fd (but we still own the grpc_fd structure).
252
186
  if (is_release_fd) {
253
187
  if (!was_shutdown) {
254
- epoll_event phony_event;
255
- if (epoll_ctl(poller_->g_epoll_set_.epfd, EPOLL_CTL_DEL, fd_,
256
- &phony_event) != 0) {
257
- LOG(ERROR) << "OrphanHandle: epoll_ctl failed: "
258
- << grpc_core::StrError(errno);
188
+ auto result =
189
+ posix_interface.EpollCtlDel(poller_->g_epoll_set_.epfd, fd_);
190
+ if (!result.ok()) {
191
+ LOG(ERROR) << "OrphanHandle: epoll_ctl failed: " << result.StrError();
259
192
  }
260
193
  }
261
194
  *release_fd = fd_;
262
195
  } else {
263
- shutdown(fd_, SHUT_RDWR);
264
- close(fd_);
196
+ posix_interface.Shutdown(fd_, SHUT_RDWR);
197
+ posix_interface.Close(fd_);
265
198
  }
266
199
 
267
200
  {
268
201
  // See Epoll1Poller::ShutdownHandle for explanation on why a mutex is
269
202
  // required here.
270
203
  grpc_core::MutexLock lock(&mu_);
271
- read_closure_->DestroyEvent();
272
- write_closure_->DestroyEvent();
273
- error_closure_->DestroyEvent();
204
+ read_closure_.DestroyEvent();
205
+ write_closure_.DestroyEvent();
206
+ error_closure_.DestroyEvent();
274
207
  }
275
208
  pending_read_.store(false, std::memory_order_release);
276
209
  pending_write_.store(false, std::memory_order_release);
277
210
  pending_error_.store(false, std::memory_order_release);
278
211
  {
279
212
  grpc_core::MutexLock lock(&poller_->mu_);
213
+ #ifdef GRPC_ENABLE_FORK_SUPPORT
214
+ poller_->fork_handles_set_.erase(this);
215
+ #endif // GRPC_ENABLE_FORK_SUPPORT
280
216
  poller_->free_epoll1_handles_list_.push_back(this);
281
217
  }
282
218
  if (on_done != nullptr) {
@@ -290,49 +226,45 @@ void Epoll1EventHandle::OrphanHandle(PosixEngineClosure* on_done,
290
226
  // shutdown() syscall on that fd)
291
227
  void Epoll1EventHandle::HandleShutdownInternal(absl::Status why,
292
228
  bool releasing_fd) {
293
- grpc_core::StatusSetInt(&why, grpc_core::StatusIntProperty::kRpcStatus,
294
- GRPC_STATUS_UNAVAILABLE);
295
- if (read_closure_->SetShutdown(why)) {
229
+ grpc_core::StatusSetInt(
230
+ &why, grpc_core::StatusIntProperty::kRpcStatus,
231
+ absl::IsCancelled(why) ? GRPC_STATUS_CANCELLED : GRPC_STATUS_UNAVAILABLE);
232
+ if (read_closure_.SetShutdown(why)) {
296
233
  if (releasing_fd) {
297
- epoll_event phony_event;
298
- if (epoll_ctl(poller_->g_epoll_set_.epfd, EPOLL_CTL_DEL, fd_,
299
- &phony_event) != 0) {
234
+ auto result = poller_->posix_interface().EpollCtlDel(
235
+ poller_->g_epoll_set_.epfd, fd_);
236
+ if (!result.ok()) {
300
237
  LOG(ERROR) << "HandleShutdownInternal: epoll_ctl failed: "
301
- << grpc_core::StrError(errno);
238
+ << result.StrError();
302
239
  }
303
240
  }
304
- write_closure_->SetShutdown(why);
305
- error_closure_->SetShutdown(why);
241
+ write_closure_.SetShutdown(why);
242
+ error_closure_.SetShutdown(why);
306
243
  }
307
244
  }
308
245
 
309
246
  Epoll1Poller::Epoll1Poller(Scheduler* scheduler)
310
247
  : scheduler_(scheduler), was_kicked_(false), closed_(false) {
311
- g_epoll_set_.epfd = EpollCreateAndCloexec();
312
- wakeup_fd_ = *CreateWakeupFd();
248
+ g_epoll_set_.epfd = posix_interface().EpollCreateAndCloexec().value();
249
+ wakeup_fd_ = CreateWakeupFd(&posix_interface()).value();
313
250
  CHECK(wakeup_fd_ != nullptr);
314
- CHECK_GE(g_epoll_set_.epfd, 0);
251
+ CHECK(g_epoll_set_.epfd.ready());
315
252
  GRPC_TRACE_LOG(event_engine_poller, INFO)
316
253
  << "grpc epoll fd: " << g_epoll_set_.epfd;
317
- struct epoll_event ev{};
318
- ev.events = static_cast<uint32_t>(EPOLLIN | EPOLLET);
319
- ev.data.ptr = wakeup_fd_.get();
320
- CHECK(epoll_ctl(g_epoll_set_.epfd, EPOLL_CTL_ADD, wakeup_fd_->ReadFd(),
321
- &ev) == 0);
254
+ auto result = posix_interface().EpollCtlAdd(
255
+ g_epoll_set_.epfd, false, wakeup_fd_->ReadFd(), wakeup_fd_.get());
256
+ CHECK(result.ok()) << result.StrError();
322
257
  g_epoll_set_.num_events = 0;
323
258
  g_epoll_set_.cursor = 0;
324
- ForkPollerListAddPoller(this);
325
259
  }
326
260
 
327
- void Epoll1Poller::Shutdown() { ForkPollerListRemovePoller(this); }
328
-
329
261
  void Epoll1Poller::Close() {
330
262
  grpc_core::MutexLock lock(&mu_);
331
263
  if (closed_) return;
332
264
 
333
- if (g_epoll_set_.epfd >= 0) {
334
- close(g_epoll_set_.epfd);
335
- g_epoll_set_.epfd = -1;
265
+ if (g_epoll_set_.epfd.ready()) {
266
+ posix_interface().Close(g_epoll_set_.epfd);
267
+ g_epoll_set_.epfd = FileDescriptor::Invalid();
336
268
  }
337
269
 
338
270
  while (!free_epoll1_handles_list_.empty()) {
@@ -346,7 +278,8 @@ void Epoll1Poller::Close() {
346
278
 
347
279
  Epoll1Poller::~Epoll1Poller() { Close(); }
348
280
 
349
- EventHandle* Epoll1Poller::CreateHandle(int fd, absl::string_view /*name*/,
281
+ EventHandle* Epoll1Poller::CreateHandle(FileDescriptor fd,
282
+ absl::string_view /*name*/,
350
283
  bool track_err) {
351
284
  Epoll1EventHandle* new_handle = nullptr;
352
285
  {
@@ -359,18 +292,21 @@ EventHandle* Epoll1Poller::CreateHandle(int fd, absl::string_view /*name*/,
359
292
  free_epoll1_handles_list_.pop_front();
360
293
  new_handle->ReInit(fd);
361
294
  }
295
+ #ifdef GRPC_ENABLE_FORK_SUPPORT
296
+ fork_handles_set_.emplace(new_handle);
297
+ #endif // GRPC_ENABLE_FORK_SUPPORT
362
298
  }
363
- struct epoll_event ev;
364
- ev.events = static_cast<uint32_t>(EPOLLIN | EPOLLOUT | EPOLLET);
365
299
  // Use the least significant bit of ev.data.ptr to store track_err. We expect
366
300
  // the addresses to be word aligned. We need to store track_err to avoid
367
301
  // synchronization issues when accessing it after receiving an event.
368
302
  // Accessing fd would be a data race there because the fd might have been
369
303
  // returned to the free list at that point.
370
- ev.data.ptr = reinterpret_cast<void*>(reinterpret_cast<intptr_t>(new_handle) |
371
- (track_err ? 1 : 0));
372
- if (epoll_ctl(g_epoll_set_.epfd, EPOLL_CTL_ADD, fd, &ev) != 0) {
373
- LOG(ERROR) << "epoll_ctl failed: " << grpc_core::StrError(errno);
304
+ auto result = posix_interface().EpollCtlAdd(
305
+ g_epoll_set_.epfd, true, fd,
306
+ reinterpret_cast<void*>(reinterpret_cast<intptr_t>(new_handle) |
307
+ (track_err ? 1 : 0)));
308
+ if (!result.ok()) {
309
+ LOG(ERROR) << "epoll_ctl failed: " << result.StrError();
374
310
  }
375
311
 
376
312
  return new_handle;
@@ -421,9 +357,13 @@ bool Epoll1Poller::ProcessEpollEvents(int max_epoll_events_to_handle,
421
357
  // See ProcessEpollEvents() function for more details. It returns the number
422
358
  // of events generated by epoll_wait.
423
359
  int Epoll1Poller::DoEpollWait(EventEngine::Duration timeout) {
360
+ auto fd = posix_interface().GetFd(g_epoll_set_.epfd);
361
+ if (fd.IsWrongGenerationError()) {
362
+ grpc_core::Crash("File descriptor from the wrong generation");
363
+ }
424
364
  int r;
425
365
  do {
426
- r = epoll_wait(g_epoll_set_.epfd, g_epoll_set_.events, MAX_EPOLL_EVENTS,
366
+ r = epoll_wait(*fd, g_epoll_set_.events, MAX_EPOLL_EVENTS,
427
367
  static_cast<int>(
428
368
  grpc_event_engine::experimental::Milliseconds(timeout)));
429
369
  } while (r < 0 && errno == EINTR);
@@ -450,26 +390,26 @@ void Epoll1EventHandle::ShutdownHandle(absl::Status why) {
450
390
  }
451
391
 
452
392
  bool Epoll1EventHandle::IsHandleShutdown() {
453
- return read_closure_->IsShutdown();
393
+ return read_closure_.IsShutdown();
454
394
  }
455
395
 
456
396
  void Epoll1EventHandle::NotifyOnRead(PosixEngineClosure* on_read) {
457
- read_closure_->NotifyOn(on_read);
397
+ read_closure_.NotifyOn(on_read);
458
398
  }
459
399
 
460
400
  void Epoll1EventHandle::NotifyOnWrite(PosixEngineClosure* on_write) {
461
- write_closure_->NotifyOn(on_write);
401
+ write_closure_.NotifyOn(on_write);
462
402
  }
463
403
 
464
404
  void Epoll1EventHandle::NotifyOnError(PosixEngineClosure* on_error) {
465
- error_closure_->NotifyOn(on_error);
405
+ error_closure_.NotifyOn(on_error);
466
406
  }
467
407
 
468
- void Epoll1EventHandle::SetReadable() { read_closure_->SetReady(); }
408
+ void Epoll1EventHandle::SetReadable() { read_closure_.SetReady(); }
469
409
 
470
- void Epoll1EventHandle::SetWritable() { write_closure_->SetReady(); }
410
+ void Epoll1EventHandle::SetWritable() { write_closure_.SetReady(); }
471
411
 
472
- void Epoll1EventHandle::SetHasError() { error_closure_->SetReady(); }
412
+ void Epoll1EventHandle::SetHasError() { error_closure_.SetReady(); }
473
413
 
474
414
  // Polls the registered Fds for events until timeout is reached or there is a
475
415
  // Kick(). If there is a Kick(), it collects and processes any previously
@@ -516,6 +456,43 @@ void Epoll1Poller::Kick() {
516
456
  CHECK(wakeup_fd_->Wakeup().ok());
517
457
  }
518
458
 
459
+ #ifdef GRPC_ENABLE_FORK_SUPPORT
460
+
461
+ void Epoll1Poller::HandleForkInChild() {
462
+ // Experiment guards closing fds/incrementing the generation. epoll fd
463
+ // needs to be reset outside the experiment to support iomgr
464
+ if (grpc_core::IsEventEngineForkEnabled()) {
465
+ posix_interface().AdvanceGeneration();
466
+ }
467
+ {
468
+ grpc_core::MutexLock lock(&mu_);
469
+ for (EventHandle* handle : fork_handles_set_) {
470
+ handle->ShutdownHandle(absl::CancelledError("Closed on fork"));
471
+ }
472
+ }
473
+ g_epoll_set_ = {};
474
+ g_epoll_set_.epfd = posix_interface().EpollCreateAndCloexec().value();
475
+ CHECK(g_epoll_set_.epfd.ready());
476
+ GRPC_TRACE_LOG(event_engine_poller, INFO)
477
+ << "Post-fork grpc epoll fd: " << g_epoll_set_.epfd;
478
+ g_epoll_set_.num_events = 0;
479
+ g_epoll_set_.cursor = 0;
480
+ }
481
+
482
+ #endif // GRPC_ENABLE_FORK_SUPPORT
483
+
484
+ void Epoll1Poller::ResetKickState() {
485
+ // Wakeup fd is always recreated to ensure FD state is reset
486
+ // Ok to fail in the fork child
487
+ posix_interface().EpollCtlDel(g_epoll_set_.epfd, wakeup_fd_->ReadFd());
488
+ wakeup_fd_ = *CreateWakeupFd(&posix_interface());
489
+ auto status = posix_interface().EpollCtlAdd(
490
+ g_epoll_set_.epfd, false, wakeup_fd_->ReadFd(), wakeup_fd_.get());
491
+ CHECK(status.ok()) << status.StrError();
492
+ grpc_core::MutexLock lock(&mu_);
493
+ was_kicked_ = false;
494
+ }
495
+
519
496
  std::shared_ptr<Epoll1Poller> MakeEpoll1Poller(Scheduler* scheduler) {
520
497
  static bool kEpoll1PollerSupported = InitEpoll1PollerLinux();
521
498
  if (kEpoll1PollerSupported) {
@@ -524,14 +501,6 @@ std::shared_ptr<Epoll1Poller> MakeEpoll1Poller(Scheduler* scheduler) {
524
501
  return nullptr;
525
502
  }
526
503
 
527
- void Epoll1Poller::PrepareFork() { Kick(); }
528
-
529
- // TODO(vigneshbabu): implement
530
- void Epoll1Poller::PostforkParent() {}
531
-
532
- // TODO(vigneshbabu): implement
533
- void Epoll1Poller::PostforkChild() {}
534
-
535
504
  } // namespace grpc_event_engine::experimental
536
505
 
537
506
  #else // defined(GRPC_LINUX_EPOLL)
@@ -546,11 +515,10 @@ Epoll1Poller::Epoll1Poller(Scheduler* /* engine */) {
546
515
  grpc_core::Crash("unimplemented");
547
516
  }
548
517
 
549
- void Epoll1Poller::Shutdown() { grpc_core::Crash("unimplemented"); }
550
-
551
518
  Epoll1Poller::~Epoll1Poller() { grpc_core::Crash("unimplemented"); }
552
519
 
553
- EventHandle* Epoll1Poller::CreateHandle(int /*fd*/, absl::string_view /*name*/,
520
+ EventHandle* Epoll1Poller::CreateHandle(FileDescriptor /*fd*/,
521
+ absl::string_view /*name*/,
554
522
  bool /*track_err*/) {
555
523
  grpc_core::Crash("unimplemented");
556
524
  }
@@ -572,18 +540,18 @@ Poller::WorkResult Epoll1Poller::Work(
572
540
 
573
541
  void Epoll1Poller::Kick() { grpc_core::Crash("unimplemented"); }
574
542
 
543
+ #if GRPC_ENABLE_FORK_SUPPORT
544
+ void Epoll1Poller::HandleForkInChild() { grpc_core::Crash("unimplemented"); }
545
+ #endif // GRPC_ENABLE_FORK_SUPPORT
546
+
547
+ void Epoll1Poller::ResetKickState() { grpc_core::Crash("unimplemented"); }
548
+
575
549
  // If GRPC_LINUX_EPOLL is not defined, it means epoll is not available. Return
576
550
  // nullptr.
577
551
  std::shared_ptr<Epoll1Poller> MakeEpoll1Poller(Scheduler* /*scheduler*/) {
578
552
  return nullptr;
579
553
  }
580
554
 
581
- void Epoll1Poller::PrepareFork() {}
582
-
583
- void Epoll1Poller::PostforkParent() {}
584
-
585
- void Epoll1Poller::PostforkChild() {}
586
-
587
555
  } // namespace grpc_event_engine::experimental
588
556
 
589
557
  #endif // defined(GRPC_POSIX_SOCKET_EV_EPOLL1)
@@ -22,6 +22,7 @@
22
22
  #include <string>
23
23
 
24
24
  #include "absl/base/thread_annotations.h"
25
+ #include "absl/container/flat_hash_set.h"
25
26
  #include "absl/container/inlined_vector.h"
26
27
  #include "absl/functional/function_ref.h"
27
28
  #include "absl/strings/string_view.h"
@@ -46,7 +47,7 @@ class Epoll1EventHandle;
46
47
  class Epoll1Poller : public PosixEventPoller {
47
48
  public:
48
49
  explicit Epoll1Poller(Scheduler* scheduler);
49
- EventHandle* CreateHandle(int fd, absl::string_view name,
50
+ EventHandle* CreateHandle(FileDescriptor fd, absl::string_view name,
50
51
  bool track_err) override;
51
52
  Poller::WorkResult Work(
52
53
  grpc_event_engine::experimental::EventEngine::Duration timeout,
@@ -54,7 +55,6 @@ class Epoll1Poller : public PosixEventPoller {
54
55
  std::string Name() override { return "epoll1"; }
55
56
  void Kick() override;
56
57
  Scheduler* GetScheduler() { return scheduler_; }
57
- void Shutdown() override;
58
58
  bool CanTrackErrors() const override {
59
59
  #ifdef GRPC_POSIX_SOCKET_TCP
60
60
  return KernelSupportsErrqueue();
@@ -64,13 +64,13 @@ class Epoll1Poller : public PosixEventPoller {
64
64
  }
65
65
  ~Epoll1Poller() override;
66
66
 
67
- // Forkable
68
- void PrepareFork() override;
69
- void PostforkParent() override;
70
- void PostforkChild() override;
71
-
72
67
  void Close();
73
68
 
69
+ #ifdef GRPC_ENABLE_FORK_SUPPORT
70
+ void HandleForkInChild() override;
71
+ #endif // GRPC_ENABLE_FORK_SUPPORT
72
+ void ResetKickState() override;
73
+
74
74
  private:
75
75
  // This initial vector size may need to be tuned
76
76
  using Events = absl::InlinedVector<Epoll1EventHandle*, 5>;
@@ -90,17 +90,10 @@ class Epoll1Poller : public PosixEventPoller {
90
90
  // of events generated by epoll_wait.
91
91
  int DoEpollWait(
92
92
  grpc_event_engine::experimental::EventEngine::Duration timeout);
93
- class HandlesList {
94
- public:
95
- explicit HandlesList(Epoll1EventHandle* handle) : handle(handle) {}
96
- Epoll1EventHandle* handle;
97
- Epoll1EventHandle* next = nullptr;
98
- Epoll1EventHandle* prev = nullptr;
99
- };
100
93
  friend class Epoll1EventHandle;
101
94
  #ifdef GRPC_LINUX_EPOLL
102
95
  struct EpollSet {
103
- int epfd = -1;
96
+ FileDescriptor epfd;
104
97
 
105
98
  // The epoll_events after the last call to epoll_wait()
106
99
  struct epoll_event events[MAX_EPOLL_EVENTS]{};
@@ -121,6 +114,9 @@ class Epoll1Poller : public PosixEventPoller {
121
114
  EpollSet g_epoll_set_;
122
115
  bool was_kicked_ ABSL_GUARDED_BY(mu_);
123
116
  std::list<EventHandle*> free_epoll1_handles_list_ ABSL_GUARDED_BY(mu_);
117
+ #if GRPC_ENABLE_FORK_SUPPORT
118
+ absl::flat_hash_set<EventHandle*> fork_handles_set_ ABSL_GUARDED_BY(mu_);
119
+ #endif // GRPC_ENABLE_FORK_SUPPORT
124
120
  std::unique_ptr<WakeupFd> wakeup_fd_;
125
121
  bool closed_;
126
122
  };