grpc 1.75.0.pre1 → 1.76.0.pre1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (387) hide show
  1. checksums.yaml +4 -4
  2. data/Makefile +18 -5
  3. data/include/grpc/credentials.h +21 -5
  4. data/src/core/call/call_filters.cc +4 -4
  5. data/src/core/call/call_filters.h +36 -36
  6. data/src/core/call/call_spine.h +27 -27
  7. data/src/core/call/client_call.cc +6 -5
  8. data/src/core/call/filter_fusion.h +5 -5
  9. data/src/core/call/metadata_batch.h +3 -3
  10. data/src/core/call/security_context.cc +1 -1
  11. data/src/core/call/server_call.cc +4 -4
  12. data/src/core/call/server_call.h +1 -1
  13. data/src/core/channelz/channelz.cc +12 -18
  14. data/src/core/channelz/channelz.h +32 -16
  15. data/src/core/channelz/channelz_registry.h +11 -0
  16. data/src/core/channelz/property_list.cc +18 -0
  17. data/src/core/channelz/property_list.h +10 -1
  18. data/src/core/channelz/text_encode.cc +66 -0
  19. data/src/core/channelz/text_encode.h +29 -0
  20. data/src/core/channelz/v2tov1/convert.cc +11 -0
  21. data/src/core/channelz/v2tov1/legacy_api.cc +15 -8
  22. data/src/core/channelz/ztrace_collector.h +247 -86
  23. data/src/core/client_channel/backup_poller.cc +5 -6
  24. data/src/core/client_channel/client_channel.cc +20 -13
  25. data/src/core/client_channel/client_channel_filter.cc +53 -45
  26. data/src/core/client_channel/client_channel_filter.h +2 -2
  27. data/src/core/client_channel/client_channel_internal.h +3 -4
  28. data/src/core/client_channel/config_selector.h +3 -3
  29. data/src/core/client_channel/dynamic_filters.cc +3 -3
  30. data/src/core/client_channel/global_subchannel_pool.cc +0 -37
  31. data/src/core/client_channel/global_subchannel_pool.h +0 -27
  32. data/src/core/client_channel/load_balanced_call_destination.cc +7 -7
  33. data/src/core/client_channel/local_subchannel_pool.cc +4 -4
  34. data/src/core/client_channel/retry_filter.h +3 -3
  35. data/src/core/client_channel/retry_filter_legacy_call_data.cc +5 -5
  36. data/src/core/client_channel/subchannel.cc +8 -8
  37. data/src/core/client_channel/subchannel_stream_client.cc +4 -4
  38. data/src/core/config/config_vars.cc +30 -1
  39. data/src/core/config/config_vars.h +21 -0
  40. data/src/core/config/core_configuration.cc +5 -5
  41. data/src/core/config/core_configuration.h +7 -7
  42. data/src/core/config/load_config.cc +12 -0
  43. data/src/core/config/load_config.h +2 -0
  44. data/src/core/credentials/call/call_credentials.h +2 -2
  45. data/src/core/credentials/call/call_creds_util.cc +4 -3
  46. data/src/core/credentials/call/composite/composite_call_credentials.cc +4 -4
  47. data/src/core/credentials/call/external/aws_external_account_credentials.cc +3 -3
  48. data/src/core/credentials/call/external/external_account_credentials.cc +1 -1
  49. data/src/core/credentials/call/external/url_external_account_credentials.cc +1 -1
  50. data/src/core/credentials/call/iam/iam_credentials.cc +4 -4
  51. data/src/core/credentials/call/jwt/json_token.cc +3 -3
  52. data/src/core/credentials/call/jwt/jwt_credentials.cc +2 -2
  53. data/src/core/credentials/call/jwt/jwt_verifier.cc +14 -13
  54. data/src/core/credentials/call/oauth2/oauth2_credentials.cc +20 -12
  55. data/src/core/credentials/call/plugin/plugin_credentials.cc +2 -2
  56. data/src/core/credentials/transport/alts/alts_credentials.cc +4 -4
  57. data/src/core/credentials/transport/alts/alts_security_connector.cc +14 -12
  58. data/src/core/credentials/transport/alts/grpc_alts_credentials_client_options.cc +22 -2
  59. data/src/core/credentials/transport/alts/grpc_alts_credentials_options.cc +10 -1
  60. data/src/core/credentials/transport/alts/grpc_alts_credentials_options.h +31 -0
  61. data/src/core/credentials/transport/alts/grpc_alts_credentials_server_options.cc +8 -3
  62. data/src/core/credentials/transport/composite/composite_channel_credentials.cc +5 -5
  63. data/src/core/credentials/transport/fake/fake_security_connector.cc +2 -2
  64. data/src/core/credentials/transport/google_default/google_default_credentials.cc +78 -28
  65. data/src/core/credentials/transport/insecure/insecure_security_connector.cc +3 -3
  66. data/src/core/credentials/transport/local/local_security_connector.cc +8 -8
  67. data/src/core/credentials/transport/security_connector.cc +5 -5
  68. data/src/core/credentials/transport/ssl/ssl_credentials.cc +12 -12
  69. data/src/core/credentials/transport/ssl/ssl_credentials.h +2 -2
  70. data/src/core/credentials/transport/ssl/ssl_security_connector.cc +3 -3
  71. data/src/core/credentials/transport/tls/certificate_provider_registry.cc +2 -2
  72. data/src/core/credentials/transport/tls/grpc_tls_certificate_distributor.cc +24 -24
  73. data/src/core/credentials/transport/tls/grpc_tls_certificate_provider.cc +5 -5
  74. data/src/core/credentials/transport/tls/grpc_tls_certificate_provider.h +2 -2
  75. data/src/core/credentials/transport/tls/grpc_tls_certificate_verifier.cc +2 -2
  76. data/src/core/credentials/transport/tls/grpc_tls_certificate_verifier.h +2 -2
  77. data/src/core/credentials/transport/tls/grpc_tls_credentials_options.cc +17 -17
  78. data/src/core/credentials/transport/tls/ssl_utils.cc +14 -9
  79. data/src/core/credentials/transport/tls/tls_credentials.cc +2 -2
  80. data/src/core/credentials/transport/tls/tls_security_connector.cc +11 -11
  81. data/src/core/credentials/transport/transport_credentials.cc +2 -2
  82. data/src/core/credentials/transport/transport_credentials.h +2 -2
  83. data/src/core/credentials/transport/xds/xds_credentials.cc +5 -5
  84. data/src/core/ext/filters/channel_idle/legacy_channel_idle_filter.cc +2 -0
  85. data/src/core/ext/filters/gcp_authentication/gcp_authentication_filter.cc +1 -1
  86. data/src/core/ext/filters/http/message_compress/compression_filter.cc +8 -8
  87. data/src/core/ext/filters/http/message_compress/compression_filter.h +3 -3
  88. data/src/core/ext/filters/stateful_session/stateful_session_filter.cc +7 -7
  89. data/src/core/ext/transport/chttp2/alpn/alpn.cc +2 -2
  90. data/src/core/ext/transport/chttp2/client/chttp2_connector.cc +10 -9
  91. data/src/core/ext/transport/chttp2/server/chttp2_server.cc +10 -7
  92. data/src/core/ext/transport/chttp2/transport/bin_decoder.cc +5 -5
  93. data/src/core/ext/transport/chttp2/transport/bin_encoder.cc +6 -6
  94. data/src/core/ext/transport/chttp2/transport/chttp2_transport.cc +96 -88
  95. data/src/core/ext/transport/chttp2/transport/flow_control.cc +3 -3
  96. data/src/core/ext/transport/chttp2/transport/flow_control.h +12 -7
  97. data/src/core/ext/transport/chttp2/transport/flow_control_manager.h +60 -0
  98. data/src/core/ext/transport/chttp2/transport/frame.cc +32 -10
  99. data/src/core/ext/transport/chttp2/transport/frame.h +16 -2
  100. data/src/core/ext/transport/chttp2/transport/frame_data.cc +2 -2
  101. data/src/core/ext/transport/chttp2/transport/frame_goaway.cc +4 -4
  102. data/src/core/ext/transport/chttp2/transport/frame_ping.cc +2 -2
  103. data/src/core/ext/transport/chttp2/transport/frame_rst_stream.cc +2 -2
  104. data/src/core/ext/transport/chttp2/transport/frame_window_update.cc +3 -3
  105. data/src/core/ext/transport/chttp2/transport/header_assembler.h +28 -12
  106. data/src/core/ext/transport/chttp2/transport/hpack_encoder.cc +2 -2
  107. data/src/core/ext/transport/chttp2/transport/hpack_encoder.h +4 -2
  108. data/src/core/ext/transport/chttp2/transport/hpack_encoder_table.cc +8 -8
  109. data/src/core/ext/transport/chttp2/transport/hpack_parse_result.cc +2 -2
  110. data/src/core/ext/transport/chttp2/transport/hpack_parse_result.h +2 -2
  111. data/src/core/ext/transport/chttp2/transport/hpack_parser.cc +27 -27
  112. data/src/core/ext/transport/chttp2/transport/hpack_parser.h +2 -3
  113. data/src/core/ext/transport/chttp2/transport/hpack_parser_table.cc +4 -4
  114. data/src/core/ext/transport/chttp2/transport/http2_client_transport.cc +543 -366
  115. data/src/core/ext/transport/chttp2/transport/http2_client_transport.h +198 -277
  116. data/src/core/ext/transport/chttp2/transport/http2_settings_manager.cc +3 -0
  117. data/src/core/ext/transport/chttp2/transport/http2_settings_manager.h +11 -0
  118. data/src/core/ext/transport/chttp2/transport/http2_settings_promises.h +179 -0
  119. data/src/core/ext/transport/chttp2/transport/http2_transport.cc +51 -23
  120. data/src/core/ext/transport/chttp2/transport/http2_transport.h +13 -6
  121. data/src/core/ext/transport/chttp2/transport/http2_ztrace_collector.h +115 -71
  122. data/src/core/ext/transport/chttp2/transport/internal.h +6 -14
  123. data/src/core/ext/transport/chttp2/transport/message_assembler.h +7 -7
  124. data/src/core/ext/transport/chttp2/transport/parsing.cc +17 -15
  125. data/src/core/ext/transport/chttp2/transport/ping_callbacks.cc +2 -2
  126. data/src/core/ext/transport/chttp2/transport/ping_promise.cc +62 -26
  127. data/src/core/ext/transport/chttp2/transport/ping_promise.h +58 -22
  128. data/src/core/ext/transport/chttp2/transport/stream.h +207 -0
  129. data/src/core/ext/transport/chttp2/transport/stream_data_queue.h +328 -187
  130. data/src/core/ext/transport/chttp2/transport/stream_lists.cc +7 -7
  131. data/src/core/ext/transport/chttp2/transport/transport_common.cc +17 -1
  132. data/src/core/ext/transport/chttp2/transport/transport_common.h +52 -0
  133. data/src/core/ext/transport/chttp2/transport/varint.h +2 -2
  134. data/src/core/ext/transport/chttp2/transport/writable_streams.h +181 -79
  135. data/src/core/ext/transport/chttp2/transport/write_size_policy.cc +2 -2
  136. data/src/core/ext/transport/chttp2/transport/writing.cc +3 -3
  137. data/src/core/ext/transport/inproc/inproc_transport.cc +1 -1
  138. data/src/core/ext/transport/inproc/legacy_inproc_transport.cc +3 -3
  139. data/src/core/ext/upb-gen/src/proto/grpc/channelz/v2/service.upb.h +740 -0
  140. data/src/core/ext/upb-gen/src/proto/grpc/channelz/v2/service.upb_minitable.c +218 -0
  141. data/src/core/ext/upb-gen/src/proto/grpc/channelz/v2/service.upb_minitable.h +46 -0
  142. data/src/core/ext/upb-gen/src/proto/grpc/gcp/handshaker.upb.h +87 -55
  143. data/src/core/ext/upb-gen/src/proto/grpc/gcp/handshaker.upb_minitable.c +23 -21
  144. data/src/core/ext/upbdefs-gen/src/proto/grpc/channelz/v2/channelz.upbdefs.c +80 -0
  145. data/src/core/ext/upbdefs-gen/src/proto/grpc/channelz/v2/channelz.upbdefs.h +47 -0
  146. data/src/core/ext/upbdefs-gen/src/proto/grpc/channelz/v2/service.upbdefs.c +129 -0
  147. data/src/core/ext/upbdefs-gen/src/proto/grpc/channelz/v2/service.upbdefs.h +72 -0
  148. data/src/core/filter/auth/server_auth_filter.cc +2 -2
  149. data/src/core/handshaker/handshaker.cc +3 -3
  150. data/src/core/handshaker/http_connect/http_proxy_mapper.cc +2 -2
  151. data/src/core/handshaker/security/legacy_secure_endpoint.cc +2 -2
  152. data/src/core/handshaker/security/pipelined_secure_endpoint.cc +31 -8
  153. data/src/core/handshaker/security/secure_endpoint.cc +16 -6
  154. data/src/core/handshaker/security/security_handshaker.cc +3 -3
  155. data/src/core/handshaker/tcp_connect/tcp_connect_handshaker.cc +2 -2
  156. data/src/core/lib/channel/channel_stack.cc +8 -5
  157. data/src/core/lib/channel/channel_stack.h +3 -0
  158. data/src/core/lib/channel/channel_stack_builder_impl.cc +1 -0
  159. data/src/core/lib/channel/connected_channel.cc +2 -2
  160. data/src/core/lib/channel/promise_based_filter.cc +69 -64
  161. data/src/core/lib/channel/promise_based_filter.h +16 -15
  162. data/src/core/lib/compression/compression_internal.cc +2 -2
  163. data/src/core/lib/compression/message_compress.cc +7 -7
  164. data/src/core/lib/event_engine/ares_resolver.cc +22 -20
  165. data/src/core/lib/event_engine/cf_engine/cf_engine.cc +2 -2
  166. data/src/core/lib/event_engine/cf_engine/dns_service_resolver.cc +2 -2
  167. data/src/core/lib/event_engine/cf_engine/dns_service_resolver.h +2 -2
  168. data/src/core/lib/event_engine/extensions/channelz.h +2 -2
  169. data/src/core/lib/event_engine/extensions/supports_fd.h +5 -5
  170. data/src/core/lib/event_engine/posix_engine/ev_epoll1_linux.cc +8 -8
  171. data/src/core/lib/event_engine/posix_engine/ev_poll_posix.cc +10 -10
  172. data/src/core/lib/event_engine/posix_engine/lockfree_event.cc +2 -2
  173. data/src/core/lib/event_engine/posix_engine/posix_endpoint.cc +23 -22
  174. data/src/core/lib/event_engine/posix_engine/posix_endpoint.h +11 -11
  175. data/src/core/lib/event_engine/posix_engine/posix_engine.cc +168 -170
  176. data/src/core/lib/event_engine/posix_engine/posix_engine.h +33 -54
  177. data/src/core/lib/event_engine/posix_engine/posix_engine_listener.cc +4 -3
  178. data/src/core/lib/event_engine/posix_engine/posix_engine_listener_utils.cc +5 -5
  179. data/src/core/lib/event_engine/posix_engine/posix_interface.h +1 -1
  180. data/src/core/lib/event_engine/posix_engine/tcp_socket_utils.cc +1 -1
  181. data/src/core/lib/event_engine/posix_engine/timer_manager.cc +3 -3
  182. data/src/core/lib/event_engine/resolved_address.cc +3 -3
  183. data/src/core/lib/event_engine/shim.cc +8 -11
  184. data/src/core/lib/event_engine/shim.h +2 -1
  185. data/src/core/lib/event_engine/slice.cc +2 -2
  186. data/src/core/lib/event_engine/tcp_socket_utils.cc +11 -11
  187. data/src/core/lib/event_engine/thread_pool/work_stealing_thread_pool.cc +7 -7
  188. data/src/core/lib/event_engine/windows/grpc_polled_fd_windows.cc +31 -31
  189. data/src/core/lib/event_engine/windows/iocp.cc +10 -10
  190. data/src/core/lib/event_engine/windows/win_socket.cc +6 -6
  191. data/src/core/lib/event_engine/windows/windows_endpoint.cc +11 -11
  192. data/src/core/lib/event_engine/windows/windows_engine.cc +16 -14
  193. data/src/core/lib/event_engine/windows/windows_listener.cc +7 -7
  194. data/src/core/lib/experiments/experiments.cc +105 -18
  195. data/src/core/lib/experiments/experiments.h +43 -11
  196. data/src/core/lib/iomgr/call_combiner.cc +3 -3
  197. data/src/core/lib/iomgr/endpoint_cfstream.cc +6 -6
  198. data/src/core/lib/iomgr/endpoint_pair_posix.cc +5 -5
  199. data/src/core/lib/iomgr/endpoint_pair_windows.cc +15 -14
  200. data/src/core/lib/iomgr/ev_epoll1_linux.cc +15 -15
  201. data/src/core/lib/iomgr/ev_poll_posix.cc +11 -11
  202. data/src/core/lib/iomgr/event_engine_shims/endpoint.cc +5 -4
  203. data/src/core/lib/iomgr/event_engine_shims/endpoint.h +1 -1
  204. data/src/core/lib/iomgr/iocp_windows.cc +8 -8
  205. data/src/core/lib/iomgr/iomgr_windows.cc +3 -3
  206. data/src/core/lib/iomgr/lockfree_event.cc +2 -2
  207. data/src/core/lib/iomgr/polling_entity.cc +3 -3
  208. data/src/core/lib/iomgr/socket_utils_common_posix.cc +2 -2
  209. data/src/core/lib/iomgr/socket_windows.cc +4 -4
  210. data/src/core/lib/iomgr/tcp_client_posix.cc +4 -4
  211. data/src/core/lib/iomgr/tcp_client_windows.cc +4 -4
  212. data/src/core/lib/iomgr/tcp_posix.cc +42 -42
  213. data/src/core/lib/iomgr/tcp_server.cc +5 -0
  214. data/src/core/lib/iomgr/tcp_server.h +7 -0
  215. data/src/core/lib/iomgr/tcp_server_posix.cc +47 -27
  216. data/src/core/lib/iomgr/tcp_server_utils_posix.h +3 -0
  217. data/src/core/lib/iomgr/tcp_server_utils_posix_common.cc +5 -5
  218. data/src/core/lib/iomgr/tcp_server_utils_posix_ifaddrs.cc +2 -2
  219. data/src/core/lib/iomgr/tcp_server_windows.cc +68 -29
  220. data/src/core/lib/iomgr/tcp_windows.cc +7 -7
  221. data/src/core/lib/iomgr/timer_generic.cc +2 -2
  222. data/src/core/lib/iomgr/timer_manager.cc +2 -2
  223. data/src/core/lib/iomgr/unix_sockets_posix.cc +2 -2
  224. data/src/core/lib/iomgr/unix_sockets_posix_noop.cc +2 -2
  225. data/src/core/lib/promise/activity.cc +2 -2
  226. data/src/core/lib/promise/activity.h +6 -6
  227. data/src/core/lib/promise/context.h +2 -2
  228. data/src/core/lib/promise/detail/join_state.h +9 -9
  229. data/src/core/lib/promise/detail/seq_state.h +13 -13
  230. data/src/core/lib/promise/detail/status.h +2 -2
  231. data/src/core/lib/promise/for_each.h +5 -5
  232. data/src/core/lib/promise/interceptor_list.h +2 -2
  233. data/src/core/lib/promise/latch.h +7 -7
  234. data/src/core/lib/promise/mpsc.cc +26 -26
  235. data/src/core/lib/promise/mpsc.h +2 -2
  236. data/src/core/lib/promise/observable.h +4 -4
  237. data/src/core/lib/promise/party.cc +32 -25
  238. data/src/core/lib/promise/party.h +16 -19
  239. data/src/core/lib/promise/pipe.h +15 -15
  240. data/src/core/lib/promise/poll.h +5 -4
  241. data/src/core/lib/promise/promise.h +0 -2
  242. data/src/core/lib/promise/sleep.cc +3 -1
  243. data/src/core/lib/promise/status_flag.h +7 -7
  244. data/src/core/lib/promise/try_join.h +2 -2
  245. data/src/core/lib/promise/try_seq.h +2 -2
  246. data/src/core/lib/resource_quota/arena.h +15 -2
  247. data/src/core/lib/resource_quota/connection_quota.cc +9 -7
  248. data/src/core/lib/resource_quota/memory_quota.cc +45 -24
  249. data/src/core/lib/resource_quota/memory_quota.h +48 -16
  250. data/src/core/lib/resource_quota/telemetry.h +54 -0
  251. data/src/core/lib/resource_quota/thread_quota.cc +2 -2
  252. data/src/core/lib/resource_tracker/resource_tracker.cc +33 -0
  253. data/src/core/lib/resource_tracker/resource_tracker.h +46 -0
  254. data/src/core/lib/security/authorization/audit_logging.cc +5 -5
  255. data/src/core/lib/security/authorization/grpc_authorization_engine.cc +2 -2
  256. data/src/core/lib/security/authorization/stdout_logger.cc +3 -3
  257. data/src/core/lib/surface/byte_buffer_reader.cc +2 -2
  258. data/src/core/lib/surface/call.cc +16 -14
  259. data/src/core/lib/surface/call.h +1 -1
  260. data/src/core/lib/surface/call_utils.cc +2 -2
  261. data/src/core/lib/surface/call_utils.h +2 -2
  262. data/src/core/lib/surface/channel.cc +4 -4
  263. data/src/core/lib/surface/channel_create.cc +10 -6
  264. data/src/core/lib/surface/channel_init.cc +80 -23
  265. data/src/core/lib/surface/channel_init.h +26 -11
  266. data/src/core/lib/surface/completion_queue.cc +17 -16
  267. data/src/core/lib/surface/completion_queue_factory.cc +7 -7
  268. data/src/core/lib/surface/connection_context.h +45 -2
  269. data/src/core/lib/surface/filter_stack_call.cc +12 -23
  270. data/src/core/lib/surface/filter_stack_call.h +3 -4
  271. data/src/core/lib/surface/legacy_channel.cc +7 -7
  272. data/src/core/lib/surface/validate_metadata.h +2 -2
  273. data/src/core/lib/surface/version.cc +2 -2
  274. data/src/core/lib/transport/bdp_estimator.cc +2 -2
  275. data/src/core/lib/transport/bdp_estimator.h +3 -3
  276. data/src/core/lib/transport/promise_endpoint.cc +3 -3
  277. data/src/core/lib/transport/promise_endpoint.h +8 -8
  278. data/src/core/lib/transport/timeout_encoding.cc +4 -4
  279. data/src/core/load_balancing/child_policy_handler.cc +4 -4
  280. data/src/core/load_balancing/endpoint_list.cc +2 -2
  281. data/src/core/load_balancing/grpclb/grpclb.cc +24 -24
  282. data/src/core/load_balancing/health_check_client.cc +4 -4
  283. data/src/core/load_balancing/health_check_client_internal.h +2 -2
  284. data/src/core/load_balancing/lb_policy_registry.cc +2 -2
  285. data/src/core/load_balancing/oob_backend_metric.cc +4 -4
  286. data/src/core/load_balancing/oob_backend_metric_internal.h +2 -2
  287. data/src/core/load_balancing/outlier_detection/outlier_detection.cc +2 -2
  288. data/src/core/load_balancing/pick_first/pick_first.cc +14 -14
  289. data/src/core/load_balancing/priority/priority.cc +23 -24
  290. data/src/core/load_balancing/ring_hash/ring_hash.cc +3 -3
  291. data/src/core/load_balancing/rls/rls.cc +13 -13
  292. data/src/core/load_balancing/round_robin/round_robin.cc +9 -9
  293. data/src/core/load_balancing/weighted_round_robin/static_stride_scheduler.cc +3 -3
  294. data/src/core/load_balancing/weighted_round_robin/weighted_round_robin.cc +33 -26
  295. data/src/core/load_balancing/weighted_target/weighted_target.cc +5 -5
  296. data/src/core/load_balancing/xds/cds.cc +76 -32
  297. data/src/core/load_balancing/xds/xds_cluster_impl.cc +3 -3
  298. data/src/core/load_balancing/xds/xds_override_host.cc +4 -4
  299. data/src/core/resolver/dns/c_ares/grpc_ares_ev_driver_posix.cc +2 -2
  300. data/src/core/resolver/dns/c_ares/grpc_ares_ev_driver_windows.cc +33 -33
  301. data/src/core/resolver/dns/c_ares/grpc_ares_wrapper.cc +10 -10
  302. data/src/core/resolver/dns/dns_resolver_plugin.cc +6 -3
  303. data/src/core/resolver/dns/event_engine/event_engine_client_channel_resolver.cc +2 -2
  304. data/src/core/resolver/endpoint_addresses.cc +3 -3
  305. data/src/core/resolver/endpoint_addresses.h +3 -0
  306. data/src/core/resolver/fake/fake_resolver.cc +2 -2
  307. data/src/core/resolver/google_c2p/google_c2p_resolver.cc +41 -54
  308. data/src/core/resolver/polling_resolver.cc +3 -3
  309. data/src/core/resolver/resolver_registry.cc +5 -4
  310. data/src/core/resolver/xds/xds_dependency_manager.cc +5 -5
  311. data/src/core/resolver/xds/xds_resolver.cc +9 -9
  312. data/src/core/server/server.cc +38 -38
  313. data/src/core/server/server_call_tracer_filter.h +4 -4
  314. data/src/core/server/server_config_selector_filter.cc +2 -2
  315. data/src/core/server/xds_server_config_fetcher.cc +9 -8
  316. data/src/core/service_config/service_config_impl.h +2 -2
  317. data/src/core/telemetry/call_tracer.cc +39 -49
  318. data/src/core/telemetry/call_tracer.h +199 -22
  319. data/src/core/telemetry/histogram.h +205 -0
  320. data/src/core/telemetry/instrument.cc +719 -0
  321. data/src/core/telemetry/instrument.h +932 -0
  322. data/src/core/telemetry/metrics.cc +13 -5
  323. data/src/core/telemetry/metrics.h +3 -1
  324. data/src/core/telemetry/stats_data.cc +0 -19
  325. data/src/core/telemetry/stats_data.h +0 -19
  326. data/src/core/transport/auth_context.cc +2 -2
  327. data/src/core/tsi/alts/handshaker/alts_handshaker_client.cc +78 -45
  328. data/src/core/tsi/alts/handshaker/alts_handshaker_client.h +1 -0
  329. data/src/core/tsi/alts/handshaker/alts_shared_resource.cc +3 -3
  330. data/src/core/tsi/alts/handshaker/alts_tsi_handshaker.cc +39 -31
  331. data/src/core/tsi/alts/handshaker/alts_tsi_utils.cc +3 -3
  332. data/src/core/tsi/alts/zero_copy_frame_protector/alts_grpc_integrity_only_record_protocol.cc +3 -3
  333. data/src/core/tsi/alts/zero_copy_frame_protector/alts_grpc_record_protocol_common.cc +7 -7
  334. data/src/core/tsi/alts/zero_copy_frame_protector/alts_zero_copy_grpc_protector.cc +3 -3
  335. data/src/core/tsi/fake_transport_security.cc +4 -4
  336. data/src/core/tsi/ssl/key_logging/ssl_key_logging.cc +4 -4
  337. data/src/core/tsi/ssl/session_cache/ssl_session_cache.cc +9 -9
  338. data/src/core/tsi/ssl/session_cache/ssl_session_openssl.cc +3 -3
  339. data/src/core/tsi/ssl_transport_security.cc +26 -25
  340. data/src/core/tsi/ssl_transport_security_utils.cc +9 -9
  341. data/src/core/util/chunked_vector.h +4 -4
  342. data/src/core/util/event_log.cc +2 -2
  343. data/src/core/util/gcp_metadata_query.cc +2 -2
  344. data/src/core/util/grpc_check.cc +22 -0
  345. data/src/core/util/grpc_check.h +103 -0
  346. data/src/core/util/http_client/httpcli.cc +3 -3
  347. data/src/core/util/http_client/parser.cc +4 -4
  348. data/src/core/util/latent_see.h +7 -4
  349. data/src/core/util/lru_cache.h +4 -4
  350. data/src/core/util/memory_usage.h +16 -0
  351. data/src/core/util/posix/directory_reader.cc +3 -2
  352. data/src/core/util/posix/sync.cc +24 -24
  353. data/src/core/util/postmortem_emit.cc +52 -0
  354. data/src/core/util/postmortem_emit.h +30 -0
  355. data/src/core/util/ref_counted_ptr.h +5 -0
  356. data/src/core/util/trie_lookup.h +170 -0
  357. data/src/core/util/unique_ptr_with_bitset.h +5 -5
  358. data/src/core/xds/grpc/xds_bootstrap_grpc.h +6 -1
  359. data/src/core/xds/grpc/xds_certificate_provider.cc +3 -3
  360. data/src/core/xds/grpc/xds_client_grpc.cc +34 -15
  361. data/src/core/xds/grpc/xds_client_grpc.h +4 -1
  362. data/src/core/xds/grpc/xds_cluster_parser.cc +2 -2
  363. data/src/core/xds/grpc/xds_cluster_specifier_plugin.cc +2 -2
  364. data/src/core/xds/grpc/xds_endpoint_parser.cc +2 -2
  365. data/src/core/xds/grpc/xds_http_filter_registry.cc +4 -3
  366. data/src/core/xds/grpc/xds_listener_parser.cc +3 -3
  367. data/src/core/xds/grpc/xds_matcher.cc +277 -0
  368. data/src/core/xds/grpc/xds_matcher.h +432 -0
  369. data/src/core/xds/grpc/xds_matcher_action.cc +47 -0
  370. data/src/core/xds/grpc/xds_matcher_action.h +48 -0
  371. data/src/core/xds/grpc/xds_matcher_context.cc +29 -0
  372. data/src/core/xds/grpc/xds_matcher_context.h +46 -0
  373. data/src/core/xds/grpc/xds_matcher_input.cc +79 -0
  374. data/src/core/xds/grpc/xds_matcher_input.h +105 -0
  375. data/src/core/xds/grpc/xds_matcher_parse.cc +356 -0
  376. data/src/core/xds/grpc/xds_matcher_parse.h +39 -0
  377. data/src/core/xds/grpc/xds_metadata.cc +4 -3
  378. data/src/core/xds/grpc/xds_route_config_parser.cc +6 -6
  379. data/src/core/xds/grpc/xds_routing.cc +3 -3
  380. data/src/core/xds/grpc/xds_transport_grpc.cc +10 -10
  381. data/src/core/xds/xds_client/lrs_client.cc +6 -6
  382. data/src/core/xds/xds_client/xds_client.cc +9 -9
  383. data/src/ruby/ext/grpc/rb_grpc_imports.generated.h +2 -2
  384. data/src/ruby/lib/grpc/version.rb +1 -1
  385. data/third_party/abseil-cpp/absl/container/internal/node_slot_policy.h +95 -0
  386. data/third_party/abseil-cpp/absl/container/node_hash_map.h +687 -0
  387. metadata +37 -2
@@ -32,7 +32,6 @@
32
32
  #include "absl/base/thread_annotations.h"
33
33
  #include "absl/container/flat_hash_map.h"
34
34
  #include "absl/functional/any_invocable.h"
35
- #include "absl/log/check.h"
36
35
  #include "absl/log/log.h"
37
36
  #include "absl/status/status.h"
38
37
  #include "absl/status/statusor.h"
@@ -44,6 +43,7 @@
44
43
  #include "src/core/lib/iomgr/port.h"
45
44
  #include "src/core/lib/resource_quota/memory_quota.h"
46
45
  #include "src/core/util/crash.h"
46
+ #include "src/core/util/grpc_check.h"
47
47
  #include "src/core/util/ref_counted.h"
48
48
  #include "src/core/util/sync.h"
49
49
 
@@ -126,7 +126,7 @@ class TcpZerocopySendRecord {
126
126
  // sendmsg() failed or when tcp_write() is done.
127
127
  bool Unref() {
128
128
  const intptr_t prior = ref_.fetch_sub(1, std::memory_order_acq_rel);
129
- DCHECK_GT(prior, 0);
129
+ GRPC_DCHECK_GT(prior, 0);
130
130
  if (prior == 1) {
131
131
  AllSendsComplete();
132
132
  return true;
@@ -141,9 +141,9 @@ class TcpZerocopySendRecord {
141
141
  };
142
142
 
143
143
  void DebugAssertEmpty() {
144
- DCHECK_EQ(buf_.Count(), 0u);
145
- DCHECK_EQ(buf_.Length(), 0u);
146
- DCHECK_EQ(ref_.load(std::memory_order_relaxed), 0);
144
+ GRPC_DCHECK_EQ(buf_.Count(), 0u);
145
+ GRPC_DCHECK_EQ(buf_.Length(), 0u);
146
+ GRPC_DCHECK_EQ(ref_.load(std::memory_order_relaxed), 0);
147
147
  }
148
148
 
149
149
  // When all sendmsg() calls associated with this tcp_write() have been
@@ -151,7 +151,7 @@ class TcpZerocopySendRecord {
151
151
  // for each sendmsg()) and all reference counts have been dropped, drop our
152
152
  // reference to the underlying data since we no longer need it.
153
153
  void AllSendsComplete() {
154
- DCHECK_EQ(ref_.load(std::memory_order_relaxed), 0);
154
+ GRPC_DCHECK_EQ(ref_.load(std::memory_order_relaxed), 0);
155
155
  buf_.Clear();
156
156
  }
157
157
 
@@ -232,7 +232,7 @@ class TcpZerocopySendCtx {
232
232
  --last_send_;
233
233
  if (ReleaseSendRecord(last_send_)->Unref()) {
234
234
  // We should still be holding the ref taken by tcp_write().
235
- DCHECK(0);
235
+ GRPC_DCHECK(0);
236
236
  }
237
237
  }
238
238
 
@@ -270,7 +270,7 @@ class TcpZerocopySendCtx {
270
270
  // same time.
271
271
  void PutSendRecord(TcpZerocopySendRecord* record) {
272
272
  grpc_core::MutexLock lock(&mu_);
273
- DCHECK(record >= send_records_ && record < send_records_ + max_sends_);
273
+ GRPC_DCHECK(record >= send_records_ && record < send_records_ + max_sends_);
274
274
  PutSendRecordLocked(record);
275
275
  }
276
276
 
@@ -327,7 +327,7 @@ class TcpZerocopySendCtx {
327
327
  zcopy_enobuf_state_ = OptMemState::kCheck;
328
328
  return false;
329
329
  }
330
- DCHECK(zcopy_enobuf_state_ != OptMemState::kCheck);
330
+ GRPC_DCHECK(zcopy_enobuf_state_ != OptMemState::kCheck);
331
331
  if (zcopy_enobuf_state_ == OptMemState::kFull) {
332
332
  // A previous sendmsg attempt was blocked by ENOBUFS. Return true to
333
333
  // mark the fd as writable so the next write attempt could be made.
@@ -418,7 +418,7 @@ class TcpZerocopySendCtx {
418
418
  TcpZerocopySendRecord* ReleaseSendRecordLocked(uint32_t seq)
419
419
  ABSL_EXCLUSIVE_LOCKS_REQUIRED(mu_) {
420
420
  auto iter = ctx_lookup_.find(seq);
421
- DCHECK(iter != ctx_lookup_.end());
421
+ GRPC_DCHECK(iter != ctx_lookup_.end());
422
422
  TcpZerocopySendRecord* record = iter->second;
423
423
  ctx_lookup_.erase(iter);
424
424
  return record;
@@ -438,7 +438,7 @@ class TcpZerocopySendCtx {
438
438
 
439
439
  void PutSendRecordLocked(TcpZerocopySendRecord* record)
440
440
  ABSL_EXCLUSIVE_LOCKS_REQUIRED(mu_) {
441
- DCHECK(free_send_records_size_ < max_sends_);
441
+ GRPC_DCHECK(free_send_records_size_ < max_sends_);
442
442
  free_send_records_[free_send_records_size_] = record;
443
443
  free_send_records_size_++;
444
444
  }
@@ -33,7 +33,6 @@
33
33
  #include "absl/cleanup/cleanup.h"
34
34
  #include "absl/container/inlined_vector.h"
35
35
  #include "absl/functional/any_invocable.h"
36
- #include "absl/log/check.h"
37
36
  #include "absl/log/log.h"
38
37
  #include "absl/status/status.h"
39
38
  #include "absl/strings/str_cat.h"
@@ -49,9 +48,9 @@
49
48
  #include "src/core/lib/event_engine/posix_engine/timer_manager.h"
50
49
  #include "src/core/lib/event_engine/tcp_socket_utils.h"
51
50
  #include "src/core/lib/event_engine/utils.h"
52
- #include "src/core/lib/experiments/experiments.h"
53
51
  #include "src/core/util/crash.h"
54
52
  #include "src/core/util/fork.h"
53
+ #include "src/core/util/grpc_check.h"
55
54
  #include "src/core/util/sync.h"
56
55
  #include "src/core/util/useful.h"
57
56
 
@@ -76,6 +75,14 @@ namespace grpc_event_engine::experimental {
76
75
 
77
76
  namespace {
78
77
 
78
+ bool ShouldUsePosixPoller() {
79
+ #if defined(GRPC_PYTHON_BUILD)
80
+ return grpc_core::IsEventEnginePollerForPythonEnabled();
81
+ #else
82
+ return true;
83
+ #endif
84
+ }
85
+
79
86
  #if GRPC_ENABLE_FORK_SUPPORT && GRPC_POSIX_FORK_ALLOW_PTHREAD_ATFORK
80
87
 
81
88
  // Thread pool can outlive EE but we need to ensure the ordering if both
@@ -165,7 +172,7 @@ void RegisterEventEngineForFork(
165
172
  const std::shared_ptr<PosixEventEngine>& posix_engine,
166
173
  const std::shared_ptr<ThreadPool>& executor,
167
174
  const std::shared_ptr<TimerManager>& timer_manager) {
168
- if (!grpc_core::Fork::Enabled()) {
175
+ if (!(grpc_core::Fork::Enabled())) {
169
176
  return;
170
177
  }
171
178
  grpc_core::MutexLock lock(fork_mu.get());
@@ -174,7 +181,8 @@ void RegisterEventEngineForFork(
174
181
  std::remove_if(fork_handlers->begin(), fork_handlers->end(),
175
182
  [](const auto& ptr) {
176
183
  return ptr.event_engine.expired() &&
177
- ptr.executor.expired();
184
+ ptr.executor.expired() &&
185
+ ptr.timer_manager.expired();
178
186
  }),
179
187
  fork_handlers->end());
180
188
  fork_handlers->emplace_back(posix_engine, executor, timer_manager);
@@ -198,15 +206,13 @@ void RegisterEventEngineForFork(
198
206
 
199
207
  #ifdef GRPC_POSIX_SOCKET_TCP
200
208
 
201
- #if GRPC_PLATFORM_SUPPORTS_POSIX_POLLING
202
-
203
209
  PosixEventEngine::PollingCycle::PollingCycle(
204
210
  std::shared_ptr<ThreadPool> executor,
205
211
  std::shared_ptr<PosixEventPoller> poller)
206
212
  : executor_(std::move(executor)),
207
213
  poller_(std::move(poller)),
208
214
  is_scheduled_(1) {
209
- CHECK_NE(poller_, nullptr);
215
+ GRPC_CHECK_NE(poller_, nullptr);
210
216
  executor_->Run([this]() { PollerWorkInternal(); });
211
217
  }
212
218
 
@@ -222,7 +228,7 @@ PosixEventEngine::PollingCycle::~PollingCycle() {
222
228
  void PosixEventEngine::PollingCycle::PollerWorkInternal() {
223
229
  grpc_core::MutexLock lock(&mu_);
224
230
  --is_scheduled_;
225
- CHECK_EQ(is_scheduled_, 0);
231
+ GRPC_CHECK_EQ(is_scheduled_, 0);
226
232
  bool again = false;
227
233
  // TODO(vigneshbabu): The timeout specified here is arbitrary. For
228
234
  // instance, this can be improved by setting the timeout to the next
@@ -240,8 +246,6 @@ void PosixEventEngine::PollingCycle::PollerWorkInternal() {
240
246
  cond_.SignalAll();
241
247
  }
242
248
 
243
- #endif // GRPC_PLATFORM_SUPPORTS_POSIX_POLLING
244
-
245
249
  void AsyncConnect::Start(EventEngine::Duration timeout) {
246
250
  on_writable_ = PosixEngineClosure::ToPermanentClosure(
247
251
  [this](absl::Status status) { OnWritable(std::move(status)); });
@@ -276,7 +280,7 @@ void AsyncConnect::OnWritable(absl::Status status)
276
280
  absl::StatusOr<std::unique_ptr<EventEngine::Endpoint>> ep;
277
281
 
278
282
  mu_.Lock();
279
- CHECK_NE(fd_, nullptr);
283
+ GRPC_CHECK_NE(fd_, nullptr);
280
284
  fd = std::exchange(fd_, nullptr);
281
285
  bool connect_cancelled = connect_cancelled_;
282
286
  if (fd->IsHandleShutdown() && status.ok()) {
@@ -390,84 +394,6 @@ void AsyncConnect::OnWritable(absl::Status status)
390
394
  }
391
395
  }
392
396
 
393
- EventEngine::ConnectionHandle
394
- PosixEventEngine::CreateEndpointFromUnconnectedFdInternal(
395
- const FileDescriptor& fd, EventEngine::OnConnectCallback on_connect,
396
- const EventEngine::ResolvedAddress& addr,
397
- const PosixTcpOptions& tcp_options, MemoryAllocator memory_allocator,
398
- EventEngine::Duration timeout) {
399
- #if GRPC_PLATFORM_SUPPORTS_POSIX_POLLING
400
- PosixError err;
401
- int connect_errno;
402
- PosixEventPoller* poller = poller_.get();
403
- do {
404
- err = poller->posix_interface().Connect(fd, addr.address(), addr.size());
405
- } while (err.IsPosixError(EINTR));
406
- if (err.IsWrongGenerationError()) {
407
- Run([on_connect = std::move(on_connect),
408
- ep = absl::FailedPreconditionError(
409
- "connect failed: file descriptor was created before "
410
- "fork")]() mutable { on_connect(std::move(ep)); });
411
- return EventEngine::ConnectionHandle::kInvalid;
412
- }
413
-
414
- connect_errno = err.errno_value().value_or(0);
415
-
416
- auto addr_uri = ResolvedAddressToURI(addr);
417
- if (!addr_uri.ok()) {
418
- Run([on_connect = std::move(on_connect),
419
- ep = absl::FailedPreconditionError(absl::StrCat(
420
- "connect failed: ", "invalid addr: ",
421
- addr_uri.value()))]() mutable { on_connect(std::move(ep)); });
422
- return EventEngine::ConnectionHandle::kInvalid;
423
- }
424
-
425
- std::string name = absl::StrCat("tcp-client:", addr_uri.value());
426
- EventHandle* handle =
427
- poller->CreateHandle(fd, name, poller->CanTrackErrors());
428
-
429
- if (connect_errno == 0) {
430
- // Connection already succeeded. Return 0 to discourage any cancellation
431
- // attempts.
432
- Run([on_connect = std::move(on_connect),
433
- ep = CreatePosixEndpoint(
434
- handle, nullptr, shared_from_this(), std::move(memory_allocator),
435
- tcp_options)]() mutable { on_connect(std::move(ep)); });
436
- return EventEngine::ConnectionHandle::kInvalid;
437
- }
438
- if (connect_errno != EWOULDBLOCK && connect_errno != EINPROGRESS) {
439
- // Connection already failed. Return 0 to discourage any cancellation
440
- // attempts.
441
- handle->OrphanHandle(nullptr, nullptr, "tcp_client_connect_error");
442
- Run([on_connect = std::move(on_connect),
443
- ep = absl::FailedPreconditionError(absl::StrCat(
444
- "connect failed: ", "addr: ", addr_uri.value(),
445
- " error: ", std::strerror(connect_errno)))]() mutable {
446
- on_connect(std::move(ep));
447
- });
448
- return EventEngine::ConnectionHandle::kInvalid;
449
- }
450
- // Connection is still in progress.
451
- int64_t connection_id =
452
- last_connection_id_.fetch_add(1, std::memory_order_acq_rel);
453
- AsyncConnect* ac =
454
- new AsyncConnect(std::move(on_connect), shared_from_this(),
455
- executor_.get(), handle, std::move(memory_allocator),
456
- tcp_options, addr_uri.value(), connection_id);
457
- int shard_number = connection_id % connection_shards_.size();
458
- struct ConnectionShard* shard = &connection_shards_[shard_number];
459
- {
460
- grpc_core::MutexLock lock(&shard->mu);
461
- shard->pending_connections.insert_or_assign(connection_id, ac);
462
- }
463
- // Start asynchronous connect and return the connection id.
464
- ac->Start(timeout);
465
- return {static_cast<intptr_t>(connection_id), 0};
466
- #else // GRPC_PLATFORM_SUPPORTS_POSIX_POLLING
467
- grpc_core::Crash("Polling is not available on this platform");
468
- #endif // GRPC_PLATFORM_SUPPORTS_POSIX_POLLING
469
- }
470
-
471
397
  void PosixEventEngine::OnConnectFinishInternal(int connection_handle) {
472
398
  int shard_number = connection_handle % connection_shards_.size();
473
399
  struct ConnectionShard* shard = &connection_shards_[shard_number];
@@ -484,12 +410,11 @@ std::shared_ptr<PosixEventEngine> PosixEventEngine::MakePosixEventEngine() {
484
410
  return engine;
485
411
  }
486
412
 
487
- #if GRPC_PLATFORM_SUPPORTS_POSIX_POLLING
488
-
489
413
  std::shared_ptr<PosixEventEngine>
490
414
  PosixEventEngine::MakeTestOnlyPosixEventEngine(
491
415
  std::shared_ptr<grpc_event_engine::experimental::PosixEventPoller>
492
416
  test_only_poller) {
417
+ // Calling a private PosixEventEngine constructor - can't do make_shared
493
418
  std::shared_ptr<PosixEventEngine> engine(
494
419
  new PosixEventEngine(std::move(test_only_poller)));
495
420
  RegisterEventEngineForFork(engine, engine->executor_, engine->timer_manager_);
@@ -498,36 +423,20 @@ PosixEventEngine::MakeTestOnlyPosixEventEngine(
498
423
 
499
424
  PosixEventEngine::PosixEventEngine(std::shared_ptr<PosixEventPoller> poller)
500
425
  : connection_shards_(std::max(2 * gpr_cpu_num_cores(), 1u)),
501
- executor_(MakeThreadPool(grpc_core::Clamp(gpr_cpu_num_cores(), 4u, 16u))),
502
426
  poller_(std::move(poller)),
427
+ executor_(MakeThreadPool(grpc_core::Clamp(gpr_cpu_num_cores(), 4u, 16u))),
503
428
  timer_manager_(std::make_shared<TimerManager>(executor_)) {}
504
429
 
505
430
  PosixEventEngine::PosixEventEngine()
506
431
  : connection_shards_(std::max(2 * gpr_cpu_num_cores(), 1u)),
507
432
  executor_(MakeThreadPool(grpc_core::Clamp(gpr_cpu_num_cores(), 4u, 16u))),
508
433
  timer_manager_(std::make_shared<TimerManager>(executor_)) {
509
- poller_ = grpc_event_engine::experimental::MakeDefaultPoller(executor_);
510
- SchedulePoller();
511
- }
512
-
513
- #else // GRPC_PLATFORM_SUPPORTS_POSIX_POLLING
514
-
515
- std::shared_ptr<PosixEventEngine>
516
- PosixEventEngine::MakeTestOnlyPosixEventEngine(
517
- std::shared_ptr<grpc_event_engine::experimental::PosixEventPoller>
518
- test_only_poller) {
519
- grpc_core::Crash(
520
- "PosixEventEngine::MakeTestOnlyPosixEventEngine not available on this "
521
- "platform");
434
+ if (ShouldUsePosixPoller()) {
435
+ poller_ = grpc_event_engine::experimental::MakeDefaultPoller(executor_);
436
+ SchedulePoller();
437
+ }
522
438
  }
523
439
 
524
- PosixEventEngine::PosixEventEngine()
525
- : connection_shards_(std::max(2 * gpr_cpu_num_cores(), 1u)),
526
- executor_(MakeThreadPool(grpc_core::Clamp(gpr_cpu_num_cores(), 4u, 16u))),
527
- timer_manager_(std::make_shared<TimerManager>(executor_)) {}
528
-
529
- #endif // GRPC_PLATFORM_SUPPORTS_POSIX_POLLING
530
-
531
440
  #endif // GRPC_POSIX_SOCKET_TCP
532
441
 
533
442
  struct PosixEventEngine::ClosureData final : public EventEngine::Closure {
@@ -558,11 +467,11 @@ PosixEventEngine::~PosixEventEngine() {
558
467
  << HandleToString(handle);
559
468
  }
560
469
  }
561
- CHECK(GPR_LIKELY(known_handles_.empty()));
470
+ GRPC_CHECK(GPR_LIKELY(known_handles_.empty()));
562
471
  }
563
- #if GRPC_PLATFORM_SUPPORTS_POSIX_POLLING
472
+ #if defined(GRPC_POSIX_SOCKET_TCP)
564
473
  polling_cycle_.reset();
565
- #endif // GRPC_PLATFORM_SUPPORTS_POSIX_POLLING
474
+ #endif // defined(GRPC_POSIX_SOCKET_TCP)
566
475
  timer_manager_->Shutdown();
567
476
  executor_->Quiesce();
568
477
  }
@@ -665,7 +574,7 @@ PosixEventEngine::GetDNSResolver(
665
574
  << "PosixEventEngine::" << this << " creating NativePosixDNSResolver";
666
575
  return std::make_unique<NativePosixDNSResolver>(shared_from_this());
667
576
  }
668
- #if GRPC_PLATFORM_SUPPORTS_POSIX_POLLING
577
+ #if defined(GRPC_POSIX_SOCKET_TCP)
669
578
  GRPC_TRACE_LOG(event_engine_dns, INFO)
670
579
  << "PosixEventEngine::" << this << " creating AresResolver";
671
580
  auto ares_resolver = AresResolver::CreateAresResolver(
@@ -678,9 +587,9 @@ PosixEventEngine::GetDNSResolver(
678
587
  RegisterAresResolverForFork(ares_resolver->get());
679
588
  return std::make_unique<PosixEventEngine::PosixDNSResolver>(
680
589
  std::move(*ares_resolver));
681
- #else // GRPC_PLATFORM_SUPPORTS_POSIX_POLLING
590
+ #else // defined(GRPC_POSIX_SOCKET_TCP)
682
591
  grpc_core::Crash("Can not create CAres resolver with disabled poller");
683
- #endif // GRPC_PLATFORM_SUPPORTS_POSIX_POLLING
592
+ #endif // defined(GRPC_POSIX_SOCKET_TCP)
684
593
  }
685
594
 
686
595
  #else // GRPC_ARES == 1 && defined(GRPC_POSIX_SOCKET_ARES_EV_DRIVER)
@@ -706,8 +615,8 @@ PosixEventEngine::GetDNSResolver(
706
615
 
707
616
  bool PosixEventEngine::IsWorkerThread() { grpc_core::Crash("unimplemented"); }
708
617
 
709
- std::unique_ptr<EventEngine::Endpoint> PosixEventEngine::CreateEndpointFromFd(
710
- int fd, const EndpointConfig& config) {
618
+ absl::StatusOr<std::unique_ptr<EventEngine::Endpoint>>
619
+ PosixEventEngine::CreateEndpointFromFd(int fd, const EndpointConfig& config) {
711
620
  auto options = TcpOptionsFromEndpointConfig(config);
712
621
  MemoryAllocator allocator;
713
622
  if (options.memory_allocator_factory != nullptr) {
@@ -722,7 +631,7 @@ std::unique_ptr<EventEngine::Endpoint> PosixEventEngine::CreateEndpointFromFd(
722
631
  absl::StrCat("allocator:", fd)));
723
632
  }
724
633
 
725
- #if GRPC_PLATFORM_SUPPORTS_POSIX_POLLING
634
+ #if defined(GRPC_POSIX_SOCKET_TCP)
726
635
 
727
636
  bool PosixEventEngine::CancelConnect(EventEngine::ConnectionHandle handle) {
728
637
  int connection_handle = handle.keys[0];
@@ -737,7 +646,7 @@ bool PosixEventEngine::CancelConnect(EventEngine::ConnectionHandle handle) {
737
646
  auto it = shard->pending_connections.find(connection_handle);
738
647
  if (it != shard->pending_connections.end()) {
739
648
  ac = it->second;
740
- CHECK_NE(ac, nullptr);
649
+ GRPC_CHECK_NE(ac, nullptr);
741
650
  // Trying to acquire ac->mu here would could cause a deadlock because
742
651
  // the OnWritable method tries to acquire the two mutexes used
743
652
  // here in the reverse order. But we dont need to acquire ac->mu before
@@ -780,9 +689,13 @@ EventEngine::ConnectionHandle PosixEventEngine::Connect(
780
689
  const EndpointConfig& args, MemoryAllocator memory_allocator,
781
690
  Duration timeout) {
782
691
  PosixTcpOptions options = TcpOptionsFromEndpointConfig(args);
783
- absl::StatusOr<EventEnginePosixInterface::PosixSocketCreateResult> socket =
784
- GetPollerChecked()->posix_interface().CreateAndPrepareTcpClientSocket(
785
- options, addr);
692
+ absl::StatusOr<EventEnginePosixInterface::PosixSocketCreateResult> socket;
693
+ if (poller_ != nullptr) {
694
+ socket = poller_->posix_interface().CreateAndPrepareTcpClientSocket(options,
695
+ addr);
696
+ } else {
697
+ socket = absl::InternalError("Polling is not enabled");
698
+ }
786
699
  if (!socket.ok()) {
787
700
  Run([on_connect = std::move(on_connect),
788
701
  status = socket.status()]() mutable { on_connect(status); });
@@ -797,21 +710,112 @@ EventEngine::ConnectionHandle PosixEventEngine::CreateEndpointFromUnconnectedFd(
797
710
  int fd, EventEngine::OnConnectCallback on_connect,
798
711
  const EventEngine::ResolvedAddress& addr, const EndpointConfig& config,
799
712
  MemoryAllocator memory_allocator, EventEngine::Duration timeout) {
713
+ if (poller_ == nullptr) {
714
+ Run([on_connect = std::move(on_connect),
715
+ ep = absl::FailedPreconditionError(
716
+ "connect failed: polling is not enabled")]() mutable {
717
+ on_connect(std::move(ep));
718
+ });
719
+ return EventEngine::ConnectionHandle::kInvalid;
720
+ }
800
721
  return CreateEndpointFromUnconnectedFdInternal(
801
- GetPollerChecked()->posix_interface().Adopt(fd), std::move(on_connect),
802
- addr, TcpOptionsFromEndpointConfig(config), std::move(memory_allocator),
722
+ poller_->posix_interface().Adopt(fd), std::move(on_connect), addr,
723
+ TcpOptionsFromEndpointConfig(config), std::move(memory_allocator),
803
724
  timeout);
804
725
  }
805
726
 
806
- std::unique_ptr<EventEngine::Endpoint>
727
+ EventEngine::ConnectionHandle
728
+ PosixEventEngine::CreateEndpointFromUnconnectedFdInternal(
729
+ const FileDescriptor& fd, EventEngine::OnConnectCallback on_connect,
730
+ const EventEngine::ResolvedAddress& addr,
731
+ const PosixTcpOptions& tcp_options, MemoryAllocator memory_allocator,
732
+ EventEngine::Duration timeout) {
733
+ PosixError err;
734
+ int connect_errno;
735
+ if (poller_ == nullptr) {
736
+ Run([on_connect = std::move(on_connect),
737
+ ep = absl::FailedPreconditionError(
738
+ "connect failed: polling is disabled")]() mutable {
739
+ on_connect(std::move(ep));
740
+ });
741
+ return EventEngine::ConnectionHandle::kInvalid;
742
+ }
743
+ do {
744
+ err = poller_->posix_interface().Connect(fd, addr.address(), addr.size());
745
+ } while (err.IsPosixError(EINTR));
746
+ if (err.IsWrongGenerationError()) {
747
+ Run([on_connect = std::move(on_connect),
748
+ ep = absl::FailedPreconditionError(
749
+ "connect failed: file descriptor was created before "
750
+ "fork")]() mutable { on_connect(std::move(ep)); });
751
+ return EventEngine::ConnectionHandle::kInvalid;
752
+ }
753
+
754
+ connect_errno = err.errno_value().value_or(0);
755
+
756
+ auto addr_uri = ResolvedAddressToURI(addr);
757
+ if (!addr_uri.ok()) {
758
+ Run([on_connect = std::move(on_connect),
759
+ ep = absl::FailedPreconditionError(absl::StrCat(
760
+ "connect failed: ", "invalid addr: ",
761
+ addr_uri.value()))]() mutable { on_connect(std::move(ep)); });
762
+ return EventEngine::ConnectionHandle::kInvalid;
763
+ }
764
+
765
+ std::string name = absl::StrCat("tcp-client:", addr_uri.value());
766
+ EventHandle* handle =
767
+ poller_->CreateHandle(fd, name, poller_->CanTrackErrors());
768
+
769
+ if (connect_errno == 0) {
770
+ // Connection already succeeded. Return 0 to discourage any cancellation
771
+ // attempts.
772
+ Run([on_connect = std::move(on_connect),
773
+ ep = CreatePosixEndpoint(
774
+ handle, nullptr, shared_from_this(), std::move(memory_allocator),
775
+ tcp_options)]() mutable { on_connect(std::move(ep)); });
776
+ return EventEngine::ConnectionHandle::kInvalid;
777
+ }
778
+ if (connect_errno != EWOULDBLOCK && connect_errno != EINPROGRESS) {
779
+ // Connection already failed. Return 0 to discourage any cancellation
780
+ // attempts.
781
+ handle->OrphanHandle(nullptr, nullptr, "tcp_client_connect_error");
782
+ Run([on_connect = std::move(on_connect),
783
+ ep = absl::FailedPreconditionError(absl::StrCat(
784
+ "connect failed: ", "addr: ", addr_uri.value(),
785
+ " error: ", std::strerror(connect_errno)))]() mutable {
786
+ on_connect(std::move(ep));
787
+ });
788
+ return EventEngine::ConnectionHandle::kInvalid;
789
+ }
790
+ // Connection is still in progress.
791
+ int64_t connection_id =
792
+ last_connection_id_.fetch_add(1, std::memory_order_acq_rel);
793
+ AsyncConnect* ac =
794
+ new AsyncConnect(std::move(on_connect), shared_from_this(),
795
+ executor_.get(), handle, std::move(memory_allocator),
796
+ tcp_options, addr_uri.value(), connection_id);
797
+ int shard_number = connection_id % connection_shards_.size();
798
+ struct ConnectionShard* shard = &connection_shards_[shard_number];
799
+ {
800
+ grpc_core::MutexLock lock(&shard->mu);
801
+ shard->pending_connections.insert_or_assign(connection_id, ac);
802
+ }
803
+ // Start asynchronous connect and return the connection id.
804
+ ac->Start(timeout);
805
+ return {static_cast<intptr_t>(connection_id), 0};
806
+ }
807
+
808
+ absl::StatusOr<std::unique_ptr<EventEngine::Endpoint>>
807
809
  PosixEventEngine::CreatePosixEndpointFromFd(int fd,
808
810
  const EndpointConfig& config,
809
811
  MemoryAllocator memory_allocator) {
810
- DCHECK_GT(fd, 0);
811
- PosixEventPoller* poller = GetPollerChecked();
812
+ GRPC_DCHECK_GT(fd, 0);
813
+ if (poller_ == nullptr) {
814
+ return absl::FailedPreconditionError("polling is not enabled");
815
+ }
812
816
  EventHandle* handle =
813
- poller->CreateHandle(poller->posix_interface().Adopt(fd), "tcp-client",
814
- poller->CanTrackErrors());
817
+ poller_->CreateHandle(poller_->posix_interface().Adopt(fd), "tcp-client",
818
+ poller_->CanTrackErrors());
815
819
  return CreatePosixEndpoint(handle, nullptr, shared_from_this(),
816
820
  std::move(memory_allocator),
817
821
  TcpOptionsFromEndpointConfig(config));
@@ -847,11 +851,12 @@ PosixEventEngine::CreatePosixListener(
847
851
  }
848
852
 
849
853
  void PosixEventEngine::SchedulePoller() {
850
- if (poller_ != nullptr) {
851
- grpc_core::MutexLock lock(&mu_);
852
- CHECK(!polling_cycle_.has_value());
853
- polling_cycle_.emplace(executor_, poller_);
854
+ if (poller_ == nullptr) {
855
+ return;
854
856
  }
857
+ grpc_core::MutexLock lock(&mu_);
858
+ GRPC_CHECK(!polling_cycle_.has_value());
859
+ polling_cycle_.emplace(executor_, poller_);
855
860
  }
856
861
 
857
862
  void PosixEventEngine::ResetPollCycle() {
@@ -859,7 +864,7 @@ void PosixEventEngine::ResetPollCycle() {
859
864
  polling_cycle_.reset();
860
865
  }
861
866
 
862
- #else // GRPC_PLATFORM_SUPPORTS_POSIX_POLLING
867
+ #else // defined(GRPC_POSIX_SOCKET_TCP)
863
868
 
864
869
  bool PosixEventEngine::CancelConnect(EventEngine::ConnectionHandle handle) {
865
870
  grpc_core::Crash(
@@ -882,7 +887,7 @@ EventEngine::ConnectionHandle PosixEventEngine::CreateEndpointFromUnconnectedFd(
882
887
  "platform");
883
888
  }
884
889
 
885
- std::unique_ptr<EventEngine::Endpoint>
890
+ absl::StatusOr<std::unique_ptr<EventEngine::Endpoint>>
886
891
  PosixEventEngine::CreatePosixEndpointFromFd(int fd,
887
892
  const EndpointConfig& config,
888
893
  MemoryAllocator memory_allocator) {
@@ -911,54 +916,47 @@ PosixEventEngine::CreatePosixListener(
911
916
  "EventEngine::CreateListener is not supported on this platform");
912
917
  }
913
918
 
914
- #endif // GRPC_PLATFORM_SUPPORTS_POSIX_POLLING
919
+ #endif // defined(GRPC_POSIX_SOCKET_TCP)
915
920
 
916
921
  #if GRPC_POSIX_SOCKET_TCP && GRPC_ENABLE_FORK_SUPPORT && \
917
922
  GRPC_POSIX_FORK_ALLOW_PTHREAD_ATFORK
918
923
 
919
924
  void PosixEventEngine::AfterFork(OnForkRole on_fork_role) {
920
- #if GRPC_PLATFORM_SUPPORTS_POSIX_POLLING
921
- PosixEventPoller* poller = GetPollerChecked();
922
- #endif // GRPC_PLATFORM_SUPPORTS_POSIX_POLLING
923
925
  if (on_fork_role == OnForkRole::kChild) {
924
926
  if (grpc_core::IsEventEngineForkEnabled()) {
925
927
  AfterForkInChild();
926
- } else {
927
- #if GRPC_PLATFORM_SUPPORTS_POSIX_POLLING
928
- poller->HandleForkInChild();
929
- #endif // GRPC_PLATFORM_SUPPORTS_POSIX_POLLING
928
+ if (poller_ != nullptr) {
929
+ poller_->HandleForkInChild();
930
+ }
930
931
  }
931
932
  }
932
- #if GRPC_PLATFORM_SUPPORTS_POSIX_POLLING
933
- poller->ResetKickState();
934
- SchedulePoller();
935
- #endif // GRPC_PLATFORM_SUPPORTS_POSIX_POLLING
933
+ if (poller_ != nullptr) {
934
+ poller_->ResetKickState();
935
+ SchedulePoller();
936
+ }
936
937
  }
937
938
 
938
- void PosixEventEngine::BeforeFork() {
939
- #if GRPC_PLATFORM_SUPPORTS_POSIX_POLLING
940
- ResetPollCycle();
941
- #endif // GRPC_PLATFORM_SUPPORTS_POSIX_POLLING
942
- }
939
+ void PosixEventEngine::BeforeFork() { ResetPollCycle(); }
943
940
 
944
941
  void PosixEventEngine::AfterForkInChild() {
945
942
  #if GRPC_ARES == 1 && defined(GRPC_POSIX_SOCKET_ARES_EV_DRIVER)
946
- grpc_core::MutexLock lock(&resolver_handles_mu_);
947
- for (const auto& cb : resolver_handles_) {
948
- auto locked = cb.lock();
949
- if (locked != nullptr) {
950
- locked->Reset(absl::CancelledError("Reset resolver on fork"));
943
+ // Resolver restart happens in two stages - first stage before the poller
944
+ // is reinitialized and second stage is afterwards
945
+ absl::InlinedVector<std::shared_ptr<AresResolver::ReinitHandle>, 10>
946
+ ares_resolvers;
947
+ absl::Cleanup cleanup = [&]() {
948
+ for (const auto& resolver : ares_resolvers) {
949
+ resolver->Restart();
951
950
  }
952
- }
953
- #endif
954
- #if GRPC_PLATFORM_SUPPORTS_POSIX_POLLING
955
- GetPollerChecked()->HandleForkInChild();
956
- #endif // GRPC_PLATFORM_SUPPORTS_POSIX_POLLING
957
- #if GRPC_ARES == 1 && defined(GRPC_POSIX_SOCKET_ARES_EV_DRIVER)
958
- for (const auto& cb : resolver_handles_) {
959
- auto locked = cb.lock();
960
- if (locked != nullptr) {
961
- locked->Restart();
951
+ };
952
+ {
953
+ grpc_core::MutexLock lock(&resolver_handles_mu_);
954
+ for (const auto& cb : resolver_handles_) {
955
+ auto locked = cb.lock();
956
+ if (locked != nullptr) {
957
+ locked->Reset(absl::CancelledError("Reset resolver on fork"));
958
+ ares_resolvers.emplace_back(std::move(locked));
959
+ }
962
960
  }
963
961
  }
964
962
  #endif