grpc 1.60.2 → 1.61.0.pre2

Sign up to get free protection for your applications and to get access to all the features.
Files changed (279) hide show
  1. checksums.yaml +4 -4
  2. data/Makefile +208 -165
  3. data/include/grpc/event_engine/event_engine.h +59 -12
  4. data/include/grpc/event_engine/internal/memory_allocator_impl.h +6 -0
  5. data/include/grpc/event_engine/internal/slice_cast.h +12 -0
  6. data/include/grpc/event_engine/memory_allocator.h +3 -1
  7. data/include/grpc/event_engine/slice.h +5 -0
  8. data/include/grpc/grpc_security.h +22 -1
  9. data/include/grpc/impl/call.h +29 -0
  10. data/include/grpc/impl/channel_arg_names.h +12 -1
  11. data/include/grpc/impl/slice_type.h +1 -1
  12. data/include/grpc/module.modulemap +1 -0
  13. data/src/core/ext/filters/backend_metrics/backend_metric_filter.cc +54 -7
  14. data/src/core/ext/filters/backend_metrics/backend_metric_filter.h +20 -6
  15. data/src/core/ext/filters/channel_idle/channel_idle_filter.cc +10 -13
  16. data/src/core/ext/filters/channel_idle/channel_idle_filter.h +18 -10
  17. data/src/core/ext/filters/channel_idle/legacy_channel_idle_filter.cc +326 -0
  18. data/src/core/ext/filters/channel_idle/legacy_channel_idle_filter.h +143 -0
  19. data/src/core/ext/filters/client_channel/backend_metric.cc +2 -2
  20. data/src/core/ext/filters/client_channel/client_channel.cc +32 -6
  21. data/src/core/ext/filters/client_channel/client_channel_internal.h +2 -0
  22. data/src/core/ext/filters/client_channel/global_subchannel_pool.cc +1 -1
  23. data/src/core/ext/filters/client_channel/lb_policy/address_filtering.cc +54 -21
  24. data/src/core/ext/filters/client_channel/lb_policy/address_filtering.h +3 -2
  25. data/src/core/ext/filters/client_channel/lb_policy/child_policy_handler.cc +2 -1
  26. data/src/core/ext/filters/client_channel/lb_policy/endpoint_list.cc +12 -15
  27. data/src/core/ext/filters/client_channel/lb_policy/endpoint_list.h +8 -5
  28. data/src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb.cc +139 -92
  29. data/src/core/ext/filters/client_channel/lb_policy/health_check_client.cc +9 -4
  30. data/src/core/ext/filters/client_channel/lb_policy/oob_backend_metric.cc +9 -4
  31. data/src/core/ext/filters/client_channel/lb_policy/outlier_detection/outlier_detection.cc +10 -11
  32. data/src/core/ext/filters/client_channel/lb_policy/pick_first/pick_first.cc +94 -93
  33. data/src/core/ext/filters/client_channel/lb_policy/priority/priority.cc +5 -3
  34. data/src/core/ext/filters/client_channel/lb_policy/ring_hash/ring_hash.cc +12 -15
  35. data/src/core/ext/filters/client_channel/lb_policy/rls/rls.cc +38 -16
  36. data/src/core/ext/filters/client_channel/lb_policy/round_robin/round_robin.cc +25 -28
  37. data/src/core/ext/filters/client_channel/lb_policy/subchannel_list.h +10 -10
  38. data/src/core/ext/filters/client_channel/lb_policy/weighted_round_robin/weighted_round_robin.cc +37 -35
  39. data/src/core/ext/filters/client_channel/lb_policy/weighted_target/weighted_target.cc +11 -9
  40. data/src/core/ext/filters/client_channel/lb_policy/xds/cds.cc +504 -461
  41. data/src/core/ext/filters/client_channel/lb_policy/xds/xds_cluster_impl.cc +232 -122
  42. data/src/core/ext/filters/client_channel/lb_policy/xds/xds_cluster_manager.cc +8 -6
  43. data/src/core/ext/filters/client_channel/lb_policy/xds/xds_override_host.cc +642 -251
  44. data/src/core/ext/filters/client_channel/lb_policy/xds/xds_override_host.h +2 -6
  45. data/src/core/ext/filters/client_channel/lb_policy/xds/xds_wrr_locality.cc +7 -8
  46. data/src/core/ext/filters/client_channel/resolver/dns/c_ares/dns_resolver_ares.cc +2 -1
  47. data/src/core/ext/filters/client_channel/resolver/dns/event_engine/event_engine_client_channel_resolver.cc +3 -1
  48. data/src/core/ext/filters/client_channel/resolver/fake/fake_resolver.cc +2 -2
  49. data/src/core/ext/filters/client_channel/resolver/google_c2p/google_c2p_resolver.cc +2 -2
  50. data/src/core/ext/filters/client_channel/resolver/polling_resolver.cc +6 -8
  51. data/src/core/ext/filters/client_channel/resolver/xds/xds_dependency_manager.cc +1031 -0
  52. data/src/core/ext/filters/client_channel/resolver/xds/xds_dependency_manager.h +277 -0
  53. data/src/core/ext/filters/client_channel/resolver/xds/xds_resolver.cc +128 -270
  54. data/src/core/ext/filters/client_channel/resolver/xds/{xds_resolver.h → xds_resolver_attributes.h} +5 -4
  55. data/src/core/ext/filters/client_channel/resolver/xds/xds_resolver_trace.cc +25 -0
  56. data/src/core/ext/filters/client_channel/resolver/xds/xds_resolver_trace.h +30 -0
  57. data/src/core/ext/filters/client_channel/retry_filter.cc +1 -0
  58. data/src/core/ext/filters/client_channel/service_config_channel_arg_filter.cc +35 -17
  59. data/src/core/ext/filters/deadline/deadline_filter.cc +12 -0
  60. data/src/core/ext/filters/fault_injection/fault_injection_filter.cc +17 -13
  61. data/src/core/ext/filters/fault_injection/fault_injection_filter.h +13 -4
  62. data/src/core/ext/filters/http/client/http_client_filter.cc +23 -32
  63. data/src/core/ext/filters/http/client/http_client_filter.h +10 -5
  64. data/src/core/ext/filters/http/client_authority_filter.cc +14 -14
  65. data/src/core/ext/filters/http/client_authority_filter.h +12 -4
  66. data/src/core/ext/filters/http/http_filters_plugin.cc +42 -20
  67. data/src/core/ext/filters/http/message_compress/compression_filter.cc +55 -80
  68. data/src/core/ext/filters/http/message_compress/compression_filter.h +54 -12
  69. data/src/core/ext/filters/http/message_compress/legacy_compression_filter.cc +325 -0
  70. data/src/core/ext/filters/http/message_compress/legacy_compression_filter.h +139 -0
  71. data/src/core/ext/filters/http/server/http_server_filter.cc +41 -41
  72. data/src/core/ext/filters/http/server/http_server_filter.h +11 -4
  73. data/src/core/ext/filters/message_size/message_size_filter.cc +56 -76
  74. data/src/core/ext/filters/message_size/message_size_filter.h +35 -23
  75. data/src/core/ext/filters/rbac/rbac_filter.cc +15 -11
  76. data/src/core/ext/filters/rbac/rbac_filter.h +11 -4
  77. data/src/core/ext/filters/server_config_selector/server_config_selector_filter.cc +25 -13
  78. data/src/core/ext/filters/stateful_session/stateful_session_filter.cc +47 -50
  79. data/src/core/ext/filters/stateful_session/stateful_session_filter.h +21 -4
  80. data/src/core/ext/transport/chttp2/alpn/alpn.cc +1 -1
  81. data/src/core/ext/transport/chttp2/client/chttp2_connector.cc +2 -2
  82. data/src/core/ext/transport/chttp2/server/chttp2_server.cc +11 -2
  83. data/src/core/ext/transport/chttp2/transport/chttp2_transport.cc +68 -145
  84. data/src/core/ext/transport/chttp2/transport/chttp2_transport.h +3 -3
  85. data/src/core/ext/transport/chttp2/transport/flow_control.cc +21 -82
  86. data/src/core/ext/transport/chttp2/transport/flow_control.h +1 -8
  87. data/src/core/ext/transport/chttp2/transport/frame.cc +506 -0
  88. data/src/core/ext/transport/chttp2/transport/frame.h +214 -0
  89. data/src/core/ext/transport/chttp2/transport/frame_rst_stream.cc +1 -1
  90. data/src/core/ext/transport/chttp2/transport/frame_settings.cc +33 -79
  91. data/src/core/ext/transport/chttp2/transport/frame_settings.h +4 -7
  92. data/src/core/ext/transport/chttp2/transport/hpack_parser.cc +27 -36
  93. data/src/core/ext/transport/chttp2/transport/hpack_parser.h +0 -2
  94. data/src/core/ext/transport/chttp2/transport/http2_settings.cc +122 -32
  95. data/src/core/ext/transport/chttp2/transport/http2_settings.h +142 -37
  96. data/src/core/ext/transport/chttp2/transport/internal.h +1 -22
  97. data/src/core/ext/transport/chttp2/transport/parsing.cc +23 -37
  98. data/src/core/ext/transport/chttp2/transport/writing.cc +26 -58
  99. data/src/core/ext/transport/inproc/inproc_transport.cc +172 -13
  100. data/src/core/ext/upb-gen/envoy/extensions/upstreams/http/v3/http_protocol_options.upb.h +712 -0
  101. data/src/core/ext/upb-gen/envoy/extensions/upstreams/http/v3/http_protocol_options.upb_minitable.c +151 -0
  102. data/src/core/ext/upb-gen/envoy/extensions/upstreams/http/v3/http_protocol_options.upb_minitable.h +33 -0
  103. data/src/core/ext/upbdefs-gen/envoy/extensions/upstreams/http/v3/http_protocol_options.upbdefs.c +133 -0
  104. data/src/core/ext/upbdefs-gen/envoy/extensions/upstreams/http/v3/http_protocol_options.upbdefs.h +50 -0
  105. data/src/core/ext/xds/certificate_provider_store.cc +2 -1
  106. data/src/core/ext/xds/certificate_provider_store.h +0 -5
  107. data/src/core/ext/xds/xds_api.cc +31 -18
  108. data/src/core/ext/xds/xds_api.h +2 -2
  109. data/src/core/ext/xds/xds_bootstrap.h +3 -0
  110. data/src/core/ext/xds/xds_certificate_provider.cc +88 -287
  111. data/src/core/ext/xds/xds_certificate_provider.h +44 -111
  112. data/src/core/ext/xds/xds_client.cc +420 -414
  113. data/src/core/ext/xds/xds_client.h +31 -22
  114. data/src/core/ext/xds/xds_client_grpc.cc +3 -1
  115. data/src/core/ext/xds/xds_cluster.cc +104 -11
  116. data/src/core/ext/xds/xds_cluster.h +9 -1
  117. data/src/core/ext/xds/xds_cluster_specifier_plugin.cc +9 -5
  118. data/src/core/ext/xds/xds_common_types.cc +14 -10
  119. data/src/core/ext/xds/xds_endpoint.cc +9 -4
  120. data/src/core/ext/xds/xds_endpoint.h +5 -1
  121. data/src/core/ext/xds/xds_health_status.cc +12 -2
  122. data/src/core/ext/xds/xds_health_status.h +4 -2
  123. data/src/core/ext/xds/xds_http_rbac_filter.cc +5 -3
  124. data/src/core/ext/xds/xds_listener.cc +14 -8
  125. data/src/core/ext/xds/xds_resource_type_impl.h +6 -4
  126. data/src/core/ext/xds/xds_route_config.cc +34 -22
  127. data/src/core/ext/xds/xds_route_config.h +1 -0
  128. data/src/core/ext/xds/xds_server_config_fetcher.cc +61 -57
  129. data/src/core/ext/xds/xds_transport.h +3 -0
  130. data/src/core/ext/xds/xds_transport_grpc.cc +47 -50
  131. data/src/core/ext/xds/xds_transport_grpc.h +4 -0
  132. data/src/core/lib/channel/call_tracer.cc +12 -0
  133. data/src/core/lib/channel/call_tracer.h +17 -3
  134. data/src/core/lib/channel/channel_args.cc +24 -14
  135. data/src/core/lib/channel/channel_args.h +74 -13
  136. data/src/core/lib/channel/channel_stack.cc +27 -0
  137. data/src/core/lib/channel/channel_stack.h +10 -10
  138. data/src/core/lib/channel/connected_channel.cc +64 -18
  139. data/src/core/lib/channel/promise_based_filter.h +1041 -1
  140. data/src/core/lib/channel/server_call_tracer_filter.cc +43 -35
  141. data/src/core/lib/compression/compression_internal.cc +0 -3
  142. data/src/core/lib/event_engine/ares_resolver.cc +35 -14
  143. data/src/core/lib/event_engine/ares_resolver.h +9 -10
  144. data/src/core/lib/event_engine/cf_engine/dns_service_resolver.cc +8 -1
  145. data/src/core/lib/event_engine/posix_engine/native_posix_dns_resolver.cc +132 -0
  146. data/src/core/lib/event_engine/posix_engine/native_posix_dns_resolver.h +61 -0
  147. data/src/core/lib/event_engine/posix_engine/posix_engine.cc +52 -36
  148. data/src/core/lib/event_engine/posix_engine/posix_engine.h +4 -9
  149. data/src/core/lib/event_engine/posix_engine/posix_engine_listener_utils.cc +11 -3
  150. data/src/core/lib/event_engine/posix_engine/tcp_socket_utils.cc +9 -2
  151. data/src/core/lib/event_engine/posix_engine/tcp_socket_utils.h +7 -0
  152. data/src/core/lib/event_engine/posix_engine/timer_manager.cc +17 -27
  153. data/src/core/lib/event_engine/posix_engine/timer_manager.h +0 -3
  154. data/src/core/lib/event_engine/ref_counted_dns_resolver_interface.h +55 -0
  155. data/src/core/lib/event_engine/windows/native_windows_dns_resolver.cc +114 -0
  156. data/src/core/lib/event_engine/windows/native_windows_dns_resolver.h +51 -0
  157. data/src/core/lib/event_engine/windows/windows_engine.cc +7 -7
  158. data/src/core/lib/experiments/config.cc +13 -0
  159. data/src/core/lib/experiments/config.h +3 -0
  160. data/src/core/lib/experiments/experiments.cc +245 -366
  161. data/src/core/lib/experiments/experiments.h +50 -156
  162. data/src/core/lib/gprpp/debug_location.h +13 -0
  163. data/src/core/lib/gprpp/dual_ref_counted.h +36 -7
  164. data/src/core/lib/gprpp/orphanable.h +27 -0
  165. data/src/core/lib/gprpp/ref_counted.h +63 -22
  166. data/src/core/lib/gprpp/ref_counted_ptr.h +70 -27
  167. data/src/core/lib/gprpp/ref_counted_string.h +13 -0
  168. data/src/core/lib/gprpp/status_helper.cc +1 -2
  169. data/src/core/lib/iomgr/combiner.cc +15 -51
  170. data/src/core/lib/iomgr/event_engine_shims/endpoint.cc +31 -0
  171. data/src/core/lib/iomgr/event_engine_shims/endpoint.h +16 -0
  172. data/src/core/lib/iomgr/tcp_client_posix.cc +4 -3
  173. data/src/core/lib/load_balancing/lb_policy.h +1 -1
  174. data/src/core/lib/promise/activity.cc +17 -2
  175. data/src/core/lib/promise/activity.h +5 -4
  176. data/src/core/lib/promise/all_ok.h +80 -0
  177. data/src/core/lib/promise/detail/join_state.h +2077 -0
  178. data/src/core/lib/promise/detail/promise_factory.h +1 -0
  179. data/src/core/lib/promise/detail/promise_like.h +8 -1
  180. data/src/core/lib/promise/detail/seq_state.h +3458 -150
  181. data/src/core/lib/promise/detail/status.h +42 -5
  182. data/src/core/lib/promise/for_each.h +13 -1
  183. data/src/core/lib/promise/if.h +4 -0
  184. data/src/core/lib/promise/latch.h +6 -3
  185. data/src/core/lib/promise/party.cc +33 -31
  186. data/src/core/lib/promise/party.h +142 -6
  187. data/src/core/lib/promise/poll.h +39 -13
  188. data/src/core/lib/promise/promise.h +4 -0
  189. data/src/core/lib/promise/seq.h +107 -7
  190. data/src/core/lib/promise/status_flag.h +196 -0
  191. data/src/core/lib/promise/try_join.h +132 -0
  192. data/src/core/lib/promise/try_seq.h +132 -10
  193. data/src/core/lib/resolver/endpoint_addresses.cc +0 -1
  194. data/src/core/lib/resolver/endpoint_addresses.h +48 -0
  195. data/src/core/lib/resource_quota/arena.h +2 -2
  196. data/src/core/lib/resource_quota/memory_quota.cc +57 -8
  197. data/src/core/lib/resource_quota/memory_quota.h +6 -0
  198. data/src/core/lib/security/authorization/grpc_server_authz_filter.cc +14 -11
  199. data/src/core/lib/security/authorization/grpc_server_authz_filter.h +14 -5
  200. data/src/core/lib/security/credentials/external/aws_external_account_credentials.cc +4 -0
  201. data/src/core/lib/security/credentials/external/aws_external_account_credentials.h +4 -0
  202. data/src/core/lib/security/credentials/external/external_account_credentials.cc +28 -20
  203. data/src/core/lib/security/credentials/external/external_account_credentials.h +4 -0
  204. data/src/core/lib/security/credentials/external/file_external_account_credentials.cc +4 -0
  205. data/src/core/lib/security/credentials/external/file_external_account_credentials.h +4 -0
  206. data/src/core/lib/security/credentials/external/url_external_account_credentials.cc +4 -0
  207. data/src/core/lib/security/credentials/external/url_external_account_credentials.h +4 -0
  208. data/src/core/lib/security/credentials/plugin/plugin_credentials.cc +2 -1
  209. data/src/core/lib/security/credentials/tls/grpc_tls_certificate_provider.h +0 -3
  210. data/src/core/lib/security/credentials/tls/grpc_tls_credentials_options.cc +12 -0
  211. data/src/core/lib/security/credentials/tls/grpc_tls_crl_provider.cc +22 -5
  212. data/src/core/lib/security/credentials/tls/grpc_tls_crl_provider.h +1 -5
  213. data/src/core/lib/security/credentials/tls/tls_credentials.cc +16 -0
  214. data/src/core/lib/security/credentials/xds/xds_credentials.cc +21 -28
  215. data/src/core/lib/security/credentials/xds/xds_credentials.h +2 -4
  216. data/src/core/lib/security/security_connector/tls/tls_security_connector.cc +4 -3
  217. data/src/core/lib/security/transport/auth_filters.h +71 -4
  218. data/src/core/lib/security/transport/client_auth_filter.cc +2 -4
  219. data/src/core/lib/security/transport/legacy_server_auth_filter.cc +244 -0
  220. data/src/core/lib/security/transport/server_auth_filter.cc +70 -90
  221. data/src/core/lib/slice/slice_buffer.h +3 -0
  222. data/src/core/lib/surface/builtins.cc +1 -1
  223. data/src/core/lib/surface/call.cc +683 -196
  224. data/src/core/lib/surface/call.h +26 -13
  225. data/src/core/lib/surface/call_trace.cc +42 -1
  226. data/src/core/lib/surface/channel.cc +0 -1
  227. data/src/core/lib/surface/channel.h +0 -6
  228. data/src/core/lib/surface/channel_init.h +26 -0
  229. data/src/core/lib/surface/init.cc +14 -8
  230. data/src/core/lib/surface/server.cc +256 -237
  231. data/src/core/lib/surface/server.h +26 -54
  232. data/src/core/lib/surface/version.cc +2 -2
  233. data/src/core/lib/surface/wait_for_cq_end_op.h +94 -0
  234. data/src/core/lib/transport/call_final_info.cc +38 -0
  235. data/src/core/lib/transport/call_final_info.h +54 -0
  236. data/src/core/lib/transport/connectivity_state.cc +3 -2
  237. data/src/core/lib/transport/connectivity_state.h +4 -0
  238. data/src/core/lib/transport/metadata_batch.h +4 -4
  239. data/src/core/lib/transport/transport.cc +70 -19
  240. data/src/core/lib/transport/transport.h +395 -25
  241. data/src/core/plugin_registry/grpc_plugin_registry.cc +3 -0
  242. data/src/core/plugin_registry/grpc_plugin_registry_extra.cc +0 -3
  243. data/src/core/tsi/alts/handshaker/alts_handshaker_client.cc +1 -1
  244. data/src/core/tsi/alts/handshaker/alts_tsi_handshaker.cc +1 -1
  245. data/src/core/tsi/alts/handshaker/transport_security_common_api.cc +1 -1
  246. data/src/core/tsi/ssl_transport_security.cc +65 -43
  247. data/src/ruby/ext/grpc/rb_channel_args.c +3 -1
  248. data/src/ruby/ext/grpc/rb_grpc.c +0 -1
  249. data/src/ruby/ext/grpc/rb_grpc.h +0 -2
  250. data/src/ruby/ext/grpc/rb_grpc_imports.generated.c +4 -0
  251. data/src/ruby/ext/grpc/rb_grpc_imports.generated.h +6 -0
  252. data/src/ruby/lib/grpc/version.rb +1 -1
  253. data/third_party/upb/upb/reflection/def_pool.h +2 -2
  254. data/third_party/zlib/adler32.c +5 -27
  255. data/third_party/zlib/compress.c +5 -16
  256. data/third_party/zlib/crc32.c +86 -162
  257. data/third_party/zlib/deflate.c +233 -336
  258. data/third_party/zlib/deflate.h +8 -8
  259. data/third_party/zlib/gzguts.h +11 -12
  260. data/third_party/zlib/infback.c +7 -23
  261. data/third_party/zlib/inffast.c +1 -4
  262. data/third_party/zlib/inffast.h +1 -1
  263. data/third_party/zlib/inflate.c +30 -99
  264. data/third_party/zlib/inftrees.c +6 -11
  265. data/third_party/zlib/inftrees.h +3 -3
  266. data/third_party/zlib/trees.c +224 -302
  267. data/third_party/zlib/uncompr.c +4 -12
  268. data/third_party/zlib/zconf.h +6 -2
  269. data/third_party/zlib/zlib.h +191 -188
  270. data/third_party/zlib/zutil.c +16 -44
  271. data/third_party/zlib/zutil.h +10 -10
  272. metadata +35 -13
  273. data/src/core/ext/filters/client_channel/lb_policy/xds/xds_cluster_resolver.cc +0 -1173
  274. data/src/core/lib/event_engine/memory_allocator.cc +0 -74
  275. data/src/core/lib/transport/pid_controller.cc +0 -51
  276. data/src/core/lib/transport/pid_controller.h +0 -116
  277. data/third_party/upb/upb/collections/array.h +0 -17
  278. data/third_party/upb/upb/collections/map.h +0 -17
  279. data/third_party/upb/upb/upb.hpp +0 -18
@@ -42,19 +42,55 @@ namespace grpc_core {
42
42
 
43
43
  namespace {
44
44
 
45
- // TODO(yashykt): This filter is not really needed. We should be able to move
46
- // this to the connected filter.
47
- class ServerCallTracerFilter : public ChannelFilter {
45
+ class ServerCallTracerFilter
46
+ : public ImplementChannelFilter<ServerCallTracerFilter> {
48
47
  public:
49
48
  static const grpc_channel_filter kFilter;
50
49
 
51
50
  static absl::StatusOr<ServerCallTracerFilter> Create(
52
51
  const ChannelArgs& /*args*/, ChannelFilter::Args /*filter_args*/);
53
52
 
54
- ArenaPromise<ServerMetadataHandle> MakeCallPromise(
55
- CallArgs call_args, NextPromiseFactory next_promise_factory) override;
53
+ class Call {
54
+ public:
55
+ void OnClientInitialMetadata(ClientMetadata& client_initial_metadata) {
56
+ auto* call_tracer = CallTracer();
57
+ if (call_tracer == nullptr) return;
58
+ call_tracer->RecordReceivedInitialMetadata(&client_initial_metadata);
59
+ }
60
+
61
+ void OnServerInitialMetadata(ServerMetadata& server_initial_metadata) {
62
+ auto* call_tracer = CallTracer();
63
+ if (call_tracer == nullptr) return;
64
+ call_tracer->RecordSendInitialMetadata(&server_initial_metadata);
65
+ }
66
+
67
+ void OnFinalize(const grpc_call_final_info* final_info) {
68
+ auto* call_tracer = CallTracer();
69
+ if (call_tracer == nullptr) return;
70
+ call_tracer->RecordEnd(final_info);
71
+ }
72
+
73
+ void OnServerTrailingMetadata(ServerMetadata& server_trailing_metadata) {
74
+ auto* call_tracer = CallTracer();
75
+ if (call_tracer == nullptr) return;
76
+ call_tracer->RecordSendTrailingMetadata(&server_trailing_metadata);
77
+ }
78
+
79
+ static const NoInterceptor OnClientToServerMessage;
80
+ static const NoInterceptor OnServerToClientMessage;
81
+
82
+ private:
83
+ static ServerCallTracer* CallTracer() {
84
+ auto* call_context = GetContext<grpc_call_context_element>();
85
+ return static_cast<ServerCallTracer*>(
86
+ call_context[GRPC_CONTEXT_CALL_TRACER].value);
87
+ }
88
+ };
56
89
  };
57
90
 
91
+ const NoInterceptor ServerCallTracerFilter::Call::OnClientToServerMessage;
92
+ const NoInterceptor ServerCallTracerFilter::Call::OnServerToClientMessage;
93
+
58
94
  const grpc_channel_filter ServerCallTracerFilter::kFilter =
59
95
  MakePromiseBasedFilter<ServerCallTracerFilter, FilterEndpoint::kServer,
60
96
  kFilterExaminesServerInitialMetadata>(
@@ -65,39 +101,11 @@ absl::StatusOr<ServerCallTracerFilter> ServerCallTracerFilter::Create(
65
101
  return ServerCallTracerFilter();
66
102
  }
67
103
 
68
- ArenaPromise<ServerMetadataHandle> ServerCallTracerFilter::MakeCallPromise(
69
- CallArgs call_args, NextPromiseFactory next_promise_factory) {
70
- auto* call_context = GetContext<grpc_call_context_element>();
71
- auto* call_tracer = static_cast<ServerCallTracer*>(
72
- call_context[GRPC_CONTEXT_CALL_TRACER].value);
73
- if (call_tracer == nullptr) {
74
- return next_promise_factory(std::move(call_args));
75
- }
76
- call_tracer->RecordReceivedInitialMetadata(
77
- call_args.client_initial_metadata.get());
78
- call_args.server_initial_metadata->InterceptAndMap(
79
- [call_tracer](ServerMetadataHandle metadata) {
80
- call_tracer->RecordSendInitialMetadata(metadata.get());
81
- return metadata;
82
- });
83
- GetContext<CallFinalization>()->Add(
84
- [call_tracer](const grpc_call_final_info* final_info) {
85
- call_tracer->RecordEnd(final_info);
86
- });
87
- return OnCancel(
88
- Map(next_promise_factory(std::move(call_args)),
89
- [call_tracer](ServerMetadataHandle md) {
90
- call_tracer->RecordSendTrailingMetadata(md.get());
91
- return md;
92
- }),
93
- [call_tracer]() { call_tracer->RecordCancel(absl::CancelledError()); });
94
- }
95
-
96
104
  } // namespace
97
105
 
98
106
  void RegisterServerCallTracerFilter(CoreConfiguration::Builder* builder) {
99
- builder->channel_init()->RegisterFilter(GRPC_SERVER_CHANNEL,
100
- &ServerCallTracerFilter::kFilter);
107
+ builder->channel_init()->RegisterFilter<ServerCallTracerFilter>(
108
+ GRPC_SERVER_CHANNEL);
101
109
  }
102
110
 
103
111
  } // namespace grpc_core
@@ -36,7 +36,6 @@
36
36
  #include "src/core/lib/gprpp/crash.h"
37
37
  #include "src/core/lib/gprpp/ref_counted_ptr.h"
38
38
  #include "src/core/lib/gprpp/ref_counted_string.h"
39
- #include "src/core/lib/surface/api_trace.h"
40
39
 
41
40
  namespace grpc_core {
42
41
 
@@ -112,8 +111,6 @@ absl::optional<grpc_compression_algorithm> ParseCompressionAlgorithm(
112
111
  grpc_compression_algorithm
113
112
  CompressionAlgorithmSet::CompressionAlgorithmForLevel(
114
113
  grpc_compression_level level) const {
115
- GRPC_API_TRACE("grpc_message_compression_algorithm_for_level(level=%d)", 1,
116
- ((int)level));
117
114
  if (level > GRPC_COMPRESS_LEVEL_HIGH) {
118
115
  Crash(absl::StrFormat("Unknown message compression level %d.",
119
116
  static_cast<int>(level)));
@@ -193,7 +193,7 @@ AresResolver::CreateAresResolver(
193
193
  AresResolver::AresResolver(
194
194
  std::unique_ptr<GrpcPolledFdFactory> polled_fd_factory,
195
195
  std::shared_ptr<EventEngine> event_engine, ares_channel channel)
196
- : grpc_core::InternallyRefCounted<AresResolver>(
196
+ : RefCountedDNSResolverInterface(
197
197
  GRPC_TRACE_FLAG_ENABLED(grpc_trace_ares_resolver) ? "AresResolver"
198
198
  : nullptr),
199
199
  channel_(channel),
@@ -230,8 +230,8 @@ void AresResolver::Orphan() {
230
230
  }
231
231
 
232
232
  void AresResolver::LookupHostname(
233
- absl::string_view name, absl::string_view default_port,
234
- EventEngine::DNSResolver::LookupHostnameCallback callback) {
233
+ EventEngine::DNSResolver::LookupHostnameCallback callback,
234
+ absl::string_view name, absl::string_view default_port) {
235
235
  absl::string_view host;
236
236
  absl::string_view port_string;
237
237
  if (!grpc_core::SplitHostPort(name, &host, &port_string)) {
@@ -241,7 +241,13 @@ void AresResolver::LookupHostname(
241
241
  "Unparseable name: ", name))]() mutable { callback(status); });
242
242
  return;
243
243
  }
244
- GPR_ASSERT(!host.empty());
244
+ if (host.empty()) {
245
+ event_engine_->Run([callback = std::move(callback),
246
+ status = absl::InvalidArgumentError(absl::StrCat(
247
+ "host must not be empty in name: ",
248
+ name))]() mutable { callback(status); });
249
+ return;
250
+ }
245
251
  if (port_string.empty()) {
246
252
  if (default_port.empty()) {
247
253
  event_engine_->Run([callback = std::move(callback),
@@ -296,8 +302,8 @@ void AresResolver::LookupHostname(
296
302
  }
297
303
 
298
304
  void AresResolver::LookupSRV(
299
- absl::string_view name,
300
- EventEngine::DNSResolver::LookupSRVCallback callback) {
305
+ EventEngine::DNSResolver::LookupSRVCallback callback,
306
+ absl::string_view name) {
301
307
  absl::string_view host;
302
308
  absl::string_view port;
303
309
  if (!grpc_core::SplitHostPort(name, &host, &port)) {
@@ -307,7 +313,13 @@ void AresResolver::LookupSRV(
307
313
  "Unparseable name: ", name))]() mutable { callback(status); });
308
314
  return;
309
315
  }
310
- GPR_ASSERT(!host.empty());
316
+ if (host.empty()) {
317
+ event_engine_->Run([callback = std::move(callback),
318
+ status = absl::InvalidArgumentError(absl::StrCat(
319
+ "host must not be empty in name: ",
320
+ name))]() mutable { callback(status); });
321
+ return;
322
+ }
311
323
  // Don't query for SRV records if the target is "localhost"
312
324
  if (absl::EqualsIgnoreCase(host, "localhost")) {
313
325
  event_engine_->Run([callback = std::move(callback)]() mutable {
@@ -325,8 +337,8 @@ void AresResolver::LookupSRV(
325
337
  }
326
338
 
327
339
  void AresResolver::LookupTXT(
328
- absl::string_view name,
329
- EventEngine::DNSResolver::LookupTXTCallback callback) {
340
+ EventEngine::DNSResolver::LookupTXTCallback callback,
341
+ absl::string_view name) {
330
342
  absl::string_view host;
331
343
  absl::string_view port;
332
344
  if (!grpc_core::SplitHostPort(name, &host, &port)) {
@@ -336,7 +348,13 @@ void AresResolver::LookupTXT(
336
348
  "Unparseable name: ", name))]() mutable { callback(status); });
337
349
  return;
338
350
  }
339
- GPR_ASSERT(!host.empty());
351
+ if (host.empty()) {
352
+ event_engine_->Run([callback = std::move(callback),
353
+ status = absl::InvalidArgumentError(absl::StrCat(
354
+ "host must not be empty in name: ",
355
+ name))]() mutable { callback(status); });
356
+ return;
357
+ }
340
358
  // Don't query for TXT records if the target is "localhost"
341
359
  if (absl::EqualsIgnoreCase(host, "localhost")) {
342
360
  event_engine_->Run([callback = std::move(callback)]() mutable {
@@ -387,7 +405,8 @@ void AresResolver::CheckSocketsLocked() {
387
405
  event_engine_->Run(
388
406
  [self = Ref(DEBUG_LOCATION, "CheckSocketsLocked"),
389
407
  fd_node]() mutable {
390
- self->OnReadable(fd_node, absl::OkStatus());
408
+ static_cast<AresResolver*>(self.get())
409
+ ->OnReadable(fd_node, absl::OkStatus());
391
410
  });
392
411
  } else {
393
412
  // Otherwise register with the poller for readable event.
@@ -396,7 +415,8 @@ void AresResolver::CheckSocketsLocked() {
396
415
  fd_node->polled_fd->RegisterForOnReadableLocked(
397
416
  [self = Ref(DEBUG_LOCATION, "CheckSocketsLocked"),
398
417
  fd_node](absl::Status status) mutable {
399
- self->OnReadable(fd_node, status);
418
+ static_cast<AresResolver*>(self.get())
419
+ ->OnReadable(fd_node, status);
400
420
  });
401
421
  }
402
422
  }
@@ -410,7 +430,8 @@ void AresResolver::CheckSocketsLocked() {
410
430
  fd_node->polled_fd->RegisterForOnWriteableLocked(
411
431
  [self = Ref(DEBUG_LOCATION, "CheckSocketsLocked"),
412
432
  fd_node](absl::Status status) mutable {
413
- self->OnWritable(fd_node, status);
433
+ static_cast<AresResolver*>(self.get())
434
+ ->OnWritable(fd_node, status);
414
435
  });
415
436
  }
416
437
  }
@@ -453,7 +474,7 @@ void AresResolver::MaybeStartTimerLocked() {
453
474
  ares_backup_poll_alarm_handle_ = event_engine_->RunAfter(
454
475
  kAresBackupPollAlarmDuration,
455
476
  [self = Ref(DEBUG_LOCATION, "MaybeStartTimerLocked")]() {
456
- self->OnAresBackupPollAlarm();
477
+ static_cast<AresResolver*>(self.get())->OnAresBackupPollAlarm();
457
478
  });
458
479
  }
459
480
 
@@ -39,6 +39,7 @@
39
39
  #include <grpc/support/log.h>
40
40
 
41
41
  #include "src/core/lib/event_engine/grpc_polled_fd.h"
42
+ #include "src/core/lib/event_engine/ref_counted_dns_resolver_interface.h"
42
43
  #include "src/core/lib/gprpp/orphanable.h"
43
44
  #include "src/core/lib/gprpp/sync.h"
44
45
 
@@ -54,7 +55,7 @@ extern grpc_core::TraceFlag grpc_trace_ares_resolver;
54
55
  } \
55
56
  } while (0)
56
57
 
57
- class AresResolver : public grpc_core::InternallyRefCounted<AresResolver> {
58
+ class AresResolver : public RefCountedDNSResolverInterface {
58
59
  public:
59
60
  static absl::StatusOr<grpc_core::OrphanablePtr<AresResolver>>
60
61
  CreateAresResolver(absl::string_view dns_server,
@@ -67,15 +68,13 @@ class AresResolver : public grpc_core::InternallyRefCounted<AresResolver> {
67
68
  ~AresResolver() override;
68
69
  void Orphan() override ABSL_LOCKS_EXCLUDED(mutex_);
69
70
 
70
- void LookupHostname(absl::string_view name, absl::string_view default_port,
71
- EventEngine::DNSResolver::LookupHostnameCallback callback)
72
- ABSL_LOCKS_EXCLUDED(mutex_);
73
- void LookupSRV(absl::string_view name,
74
- EventEngine::DNSResolver::LookupSRVCallback callback)
75
- ABSL_LOCKS_EXCLUDED(mutex_);
76
- void LookupTXT(absl::string_view name,
77
- EventEngine::DNSResolver::LookupTXTCallback callback)
78
- ABSL_LOCKS_EXCLUDED(mutex_);
71
+ void LookupHostname(EventEngine::DNSResolver::LookupHostnameCallback callback,
72
+ absl::string_view name, absl::string_view default_port)
73
+ ABSL_LOCKS_EXCLUDED(mutex_) override;
74
+ void LookupSRV(EventEngine::DNSResolver::LookupSRVCallback callback,
75
+ absl::string_view name) ABSL_LOCKS_EXCLUDED(mutex_) override;
76
+ void LookupTXT(EventEngine::DNSResolver::LookupTXTCallback callback,
77
+ absl::string_view name) ABSL_LOCKS_EXCLUDED(mutex_) override;
79
78
 
80
79
  private:
81
80
  // A FdNode saves (not owns) a live socket/fd which c-ares creates, and owns a
@@ -50,7 +50,14 @@ void DNSServiceResolverImpl::LookupHostname(
50
50
  });
51
51
  return;
52
52
  }
53
- GPR_ASSERT(!host.empty());
53
+ if (host.empty()) {
54
+ engine_->Run([on_resolve = std::move(on_resolve),
55
+ status = absl::InvalidArgumentError(absl::StrCat(
56
+ "host must not be empty in name: ", name))]() mutable {
57
+ on_resolve(status);
58
+ });
59
+ return;
60
+ }
54
61
  if (port_string.empty()) {
55
62
  if (default_port.empty()) {
56
63
  engine_->Run([on_resolve = std::move(on_resolve),
@@ -0,0 +1,132 @@
1
+ // Copyright 2023 The gRPC Authors.
2
+ //
3
+ // Licensed under the Apache License, Version 2.0 (the "License");
4
+ // you may not use this file except in compliance with the License.
5
+ // You may obtain a copy of the License at
6
+ //
7
+ // http://www.apache.org/licenses/LICENSE-2.0
8
+ //
9
+ // Unless required by applicable law or agreed to in writing, software
10
+ // distributed under the License is distributed on an "AS IS" BASIS,
11
+ // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12
+ // See the License for the specific language governing permissions and
13
+ // limitations under the License.
14
+
15
+ #include <grpc/support/port_platform.h>
16
+
17
+ #include "src/core/lib/iomgr/port.h"
18
+
19
+ #ifdef GRPC_POSIX_SOCKET_RESOLVE_ADDRESS
20
+
21
+ #include <netdb.h>
22
+ #include <string.h>
23
+ #include <sys/socket.h>
24
+
25
+ #include <string>
26
+ #include <type_traits>
27
+ #include <utility>
28
+ #include <vector>
29
+
30
+ #include "absl/functional/any_invocable.h"
31
+ #include "absl/status/status.h"
32
+ #include "absl/status/statusor.h"
33
+ #include "absl/strings/str_cat.h"
34
+ #include "absl/strings/str_format.h"
35
+
36
+ #include "src/core/lib/event_engine/posix_engine/native_posix_dns_resolver.h"
37
+ #include "src/core/lib/gpr/useful.h"
38
+ #include "src/core/lib/gprpp/host_port.h"
39
+
40
+ namespace grpc_event_engine {
41
+ namespace experimental {
42
+ namespace {
43
+
44
+ absl::StatusOr<std::vector<EventEngine::ResolvedAddress>>
45
+ LookupHostnameBlocking(absl::string_view name, absl::string_view default_port) {
46
+ struct addrinfo hints;
47
+ struct addrinfo *result = nullptr, *resp;
48
+ std::string host;
49
+ std::string port;
50
+ // parse name, splitting it into host and port parts
51
+ grpc_core::SplitHostPort(name, &host, &port);
52
+ if (host.empty()) {
53
+ return absl::InvalidArgumentError(absl::StrCat("Unparseable name: ", name));
54
+ }
55
+ if (port.empty()) {
56
+ if (default_port.empty()) {
57
+ return absl::InvalidArgumentError(
58
+ absl::StrFormat("No port in name %s or default_port argument", name));
59
+ }
60
+ port = std::string(default_port);
61
+ }
62
+ // Call getaddrinfo
63
+ memset(&hints, 0, sizeof(hints));
64
+ hints.ai_family = AF_UNSPEC; // ipv4 or ipv6
65
+ hints.ai_socktype = SOCK_STREAM; // stream socket
66
+ hints.ai_flags = AI_PASSIVE; // for wildcard IP address
67
+ int s = getaddrinfo(host.c_str(), port.c_str(), &hints, &result);
68
+ if (s != 0) {
69
+ // Retry if well-known service name is recognized
70
+ const char* svc[][2] = {{"http", "80"}, {"https", "443"}};
71
+ for (size_t i = 0; i < GPR_ARRAY_SIZE(svc); i++) {
72
+ if (port == svc[i][0]) {
73
+ s = getaddrinfo(host.c_str(), svc[i][1], &hints, &result);
74
+ break;
75
+ }
76
+ }
77
+ }
78
+ if (s != 0) {
79
+ return absl::UnknownError(absl::StrFormat(
80
+ "Address lookup failed for %s os_error: %s syscall: getaddrinfo", name,
81
+ gai_strerror(s)));
82
+ }
83
+ // Success path: fill in addrs
84
+ std::vector<EventEngine::ResolvedAddress> addresses;
85
+ for (resp = result; resp != nullptr; resp = resp->ai_next) {
86
+ addresses.emplace_back(resp->ai_addr, resp->ai_addrlen);
87
+ }
88
+ if (result) {
89
+ freeaddrinfo(result);
90
+ }
91
+ return addresses;
92
+ }
93
+
94
+ } // namespace
95
+
96
+ NativePosixDNSResolver::NativePosixDNSResolver(
97
+ std::shared_ptr<EventEngine> event_engine)
98
+ : event_engine_(std::move(event_engine)) {}
99
+
100
+ void NativePosixDNSResolver::LookupHostname(
101
+ EventEngine::DNSResolver::LookupHostnameCallback on_resolved,
102
+ absl::string_view name, absl::string_view default_port) {
103
+ event_engine_->Run(
104
+ [name, default_port, on_resolved = std::move(on_resolved)]() mutable {
105
+ on_resolved(LookupHostnameBlocking(name, default_port));
106
+ });
107
+ }
108
+
109
+ void NativePosixDNSResolver::LookupSRV(
110
+ EventEngine::DNSResolver::LookupSRVCallback on_resolved,
111
+ absl::string_view /* name */) {
112
+ // Not supported
113
+ event_engine_->Run([on_resolved = std::move(on_resolved)]() mutable {
114
+ on_resolved(absl::UnimplementedError(
115
+ "The Native resolver does not support looking up SRV records"));
116
+ });
117
+ }
118
+
119
+ void NativePosixDNSResolver::LookupTXT(
120
+ EventEngine::DNSResolver::LookupTXTCallback on_resolved,
121
+ absl::string_view /* name */) {
122
+ // Not supported
123
+ event_engine_->Run([on_resolved = std::move(on_resolved)]() mutable {
124
+ on_resolved(absl::UnimplementedError(
125
+ "The Native resolver does not support looking up TXT records"));
126
+ });
127
+ }
128
+
129
+ } // namespace experimental
130
+ } // namespace grpc_event_engine
131
+
132
+ #endif // GRPC_POSIX_SOCKET_RESOLVE_ADDRESS
@@ -0,0 +1,61 @@
1
+ // Copyright 2023 The gRPC Authors.
2
+ //
3
+ // Licensed under the Apache License, Version 2.0 (the "License");
4
+ // you may not use this file except in compliance with the License.
5
+ // You may obtain a copy of the License at
6
+ //
7
+ // http://www.apache.org/licenses/LICENSE-2.0
8
+ //
9
+ // Unless required by applicable law or agreed to in writing, software
10
+ // distributed under the License is distributed on an "AS IS" BASIS,
11
+ // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12
+ // See the License for the specific language governing permissions and
13
+ // limitations under the License.
14
+
15
+ #ifndef GRPC_SRC_CORE_LIB_EVENT_ENGINE_POSIX_ENGINE_NATIVE_POSIX_DNS_RESOLVER_H
16
+ #define GRPC_SRC_CORE_LIB_EVENT_ENGINE_POSIX_ENGINE_NATIVE_POSIX_DNS_RESOLVER_H
17
+
18
+ #include <grpc/support/port_platform.h>
19
+
20
+ #include <memory>
21
+
22
+ #include "absl/strings/string_view.h"
23
+
24
+ #include "src/core/lib/iomgr/port.h"
25
+
26
+ #ifdef GRPC_POSIX_SOCKET_RESOLVE_ADDRESS
27
+
28
+ #include <grpc/event_engine/event_engine.h>
29
+
30
+ #include "src/core/lib/event_engine/ref_counted_dns_resolver_interface.h"
31
+
32
+ namespace grpc_event_engine {
33
+ namespace experimental {
34
+
35
+ // An asynchronous DNS resolver which uses the native platform's getaddrinfo
36
+ // API. Only supports A/AAAA records.
37
+ class NativePosixDNSResolver : public RefCountedDNSResolverInterface {
38
+ public:
39
+ explicit NativePosixDNSResolver(std::shared_ptr<EventEngine> event_engine);
40
+
41
+ void LookupHostname(
42
+ EventEngine::DNSResolver::LookupHostnameCallback on_resolved,
43
+ absl::string_view name, absl::string_view default_port) override;
44
+
45
+ void LookupSRV(EventEngine::DNSResolver::LookupSRVCallback on_resolved,
46
+ absl::string_view name) override;
47
+
48
+ void LookupTXT(EventEngine::DNSResolver::LookupTXTCallback on_resolved,
49
+ absl::string_view name) override;
50
+
51
+ void Orphan() override { delete this; }
52
+
53
+ private:
54
+ std::shared_ptr<EventEngine> event_engine_;
55
+ };
56
+
57
+ } // namespace experimental
58
+ } // namespace grpc_event_engine
59
+
60
+ #endif // GRPC_POSIX_SOCKET_RESOLVE_ADDRESS
61
+ #endif // GRPC_SRC_CORE_LIB_EVENT_ENGINE_POSIX_ENGINE_NATIVE_POSIX_DNS_RESOLVER_H
@@ -28,6 +28,7 @@
28
28
  #include "absl/cleanup/cleanup.h"
29
29
  #include "absl/functional/any_invocable.h"
30
30
  #include "absl/status/status.h"
31
+ #include "absl/strings/match.h"
31
32
  #include "absl/strings/str_cat.h"
32
33
 
33
34
  #include <grpc/event_engine/event_engine.h>
@@ -36,12 +37,15 @@
36
37
  #include <grpc/support/cpu.h>
37
38
  #include <grpc/support/log.h>
38
39
 
40
+ #include "src/core/lib/config/config_vars.h"
39
41
  #include "src/core/lib/debug/trace.h"
42
+ #include "src/core/lib/event_engine/ares_resolver.h"
40
43
  #include "src/core/lib/event_engine/forkable.h"
41
44
  #include "src/core/lib/event_engine/grpc_polled_fd.h"
42
45
  #include "src/core/lib/event_engine/poller.h"
43
46
  #include "src/core/lib/event_engine/posix.h"
44
47
  #include "src/core/lib/event_engine/posix_engine/grpc_polled_fd_posix.h"
48
+ #include "src/core/lib/event_engine/posix_engine/native_posix_dns_resolver.h"
45
49
  #include "src/core/lib/event_engine/posix_engine/tcp_socket_utils.h"
46
50
  #include "src/core/lib/event_engine/posix_engine/timer.h"
47
51
  #include "src/core/lib/event_engine/tcp_socket_utils.h"
@@ -90,6 +94,15 @@ class TimerForkCallbackMethods {
90
94
  static void PostforkChild() { g_timer_fork_manager->PostforkChild(); }
91
95
  };
92
96
 
97
+ bool ShouldUseAresDnsResolver() {
98
+ #if GRPC_ARES == 1 && defined(GRPC_POSIX_SOCKET_ARES_EV_DRIVER)
99
+ auto resolver_env = grpc_core::ConfigVars::Get().DnsResolver();
100
+ return resolver_env.empty() || absl::EqualsIgnoreCase(resolver_env, "ares");
101
+ #else // GRPC_ARES == 1 && defined(GRPC_POSIX_SOCKET_ARES_EV_DRIVER)
102
+ return false;
103
+ #endif // GRPC_ARES == 1 && defined(GRPC_POSIX_SOCKET_ARES_EV_DRIVER)
104
+ }
105
+
93
106
  } // namespace
94
107
 
95
108
  #ifdef GRPC_POSIX_SOCKET_TCP
@@ -242,11 +255,11 @@ EventEngine::ConnectionHandle PosixEventEngine::ConnectInternal(
242
255
  MemoryAllocator&& allocator, const PosixTcpOptions& options,
243
256
  Duration timeout) {
244
257
  int err;
245
- int saved_errno;
258
+ int connect_errno;
246
259
  do {
247
260
  err = connect(sock.Fd(), addr.address(), addr.size());
248
261
  } while (err < 0 && errno == EINTR);
249
- saved_errno = errno;
262
+ connect_errno = (err < 0) ? errno : 0;
250
263
 
251
264
  auto addr_uri = ResolvedAddressToURI(addr);
252
265
  if (!addr_uri.ok()) {
@@ -261,13 +274,8 @@ EventEngine::ConnectionHandle PosixEventEngine::ConnectInternal(
261
274
  PosixEventPoller* poller = poller_manager_->Poller();
262
275
  EventHandle* handle =
263
276
  poller->CreateHandle(sock.Fd(), name, poller->CanTrackErrors());
264
- int64_t connection_id = 0;
265
- if (saved_errno == EWOULDBLOCK || saved_errno == EINPROGRESS) {
266
- // Connection is still in progress.
267
- connection_id = last_connection_id_.fetch_add(1, std::memory_order_acq_rel);
268
- }
269
277
 
270
- if (err >= 0) {
278
+ if (connect_errno == 0) {
271
279
  // Connection already succeded. Return 0 to discourage any cancellation
272
280
  // attempts.
273
281
  Run([on_connect = std::move(on_connect),
@@ -277,18 +285,21 @@ EventEngine::ConnectionHandle PosixEventEngine::ConnectInternal(
277
285
  });
278
286
  return EventEngine::ConnectionHandle::kInvalid;
279
287
  }
280
- if (saved_errno != EWOULDBLOCK && saved_errno != EINPROGRESS) {
288
+ if (connect_errno != EWOULDBLOCK && connect_errno != EINPROGRESS) {
281
289
  // Connection already failed. Return 0 to discourage any cancellation
282
290
  // attempts.
283
291
  handle->OrphanHandle(nullptr, nullptr, "tcp_client_connect_error");
284
292
  Run([on_connect = std::move(on_connect),
285
- ep = absl::FailedPreconditionError(
286
- absl::StrCat("connect failed: ", "addr: ", addr_uri.value(),
287
- " error: ", std::strerror(saved_errno)))]() mutable {
293
+ ep = absl::FailedPreconditionError(absl::StrCat(
294
+ "connect failed: ", "addr: ", addr_uri.value(),
295
+ " error: ", std::strerror(connect_errno)))]() mutable {
288
296
  on_connect(std::move(ep));
289
297
  });
290
298
  return EventEngine::ConnectionHandle::kInvalid;
291
299
  }
300
+ // Connection is still in progress.
301
+ int64_t connection_id =
302
+ last_connection_id_.fetch_add(1, std::memory_order_acq_rel);
292
303
  AsyncConnect* ac = new AsyncConnect(
293
304
  std::move(on_connect), shared_from_this(), executor_.get(), handle,
294
305
  std::move(allocator), options, addr_uri.value(), connection_id);
@@ -517,49 +528,54 @@ EventEngine::TaskHandle PosixEventEngine::RunAfterInternal(
517
528
  return handle;
518
529
  }
519
530
 
520
- #if GRPC_ARES == 1 && defined(GRPC_POSIX_SOCKET_TCP)
521
-
522
531
  PosixEventEngine::PosixDNSResolver::PosixDNSResolver(
523
- grpc_core::OrphanablePtr<AresResolver> ares_resolver)
524
- : ares_resolver_(std::move(ares_resolver)) {}
532
+ grpc_core::OrphanablePtr<RefCountedDNSResolverInterface> dns_resolver)
533
+ : dns_resolver_(std::move(dns_resolver)) {}
525
534
 
526
535
  void PosixEventEngine::PosixDNSResolver::LookupHostname(
527
536
  LookupHostnameCallback on_resolve, absl::string_view name,
528
537
  absl::string_view default_port) {
529
- ares_resolver_->LookupHostname(name, default_port, std::move(on_resolve));
538
+ dns_resolver_->LookupHostname(std::move(on_resolve), name, default_port);
530
539
  }
531
540
 
532
541
  void PosixEventEngine::PosixDNSResolver::LookupSRV(LookupSRVCallback on_resolve,
533
542
  absl::string_view name) {
534
- ares_resolver_->LookupSRV(name, std::move(on_resolve));
543
+ dns_resolver_->LookupSRV(std::move(on_resolve), name);
535
544
  }
536
545
 
537
546
  void PosixEventEngine::PosixDNSResolver::LookupTXT(LookupTXTCallback on_resolve,
538
547
  absl::string_view name) {
539
- ares_resolver_->LookupTXT(name, std::move(on_resolve));
548
+ dns_resolver_->LookupTXT(std::move(on_resolve), name);
540
549
  }
541
550
 
542
- #endif // GRPC_ARES == 1 && defined(GRPC_POSIX_SOCKET_TCP)
543
-
544
551
  absl::StatusOr<std::unique_ptr<EventEngine::DNSResolver>>
545
552
  PosixEventEngine::GetDNSResolver(
546
- const EventEngine::DNSResolver::ResolverOptions& options) {
547
- #if GRPC_ARES == 1 && defined(GRPC_POSIX_SOCKET_TCP)
548
- auto ares_resolver = AresResolver::CreateAresResolver(
549
- options.dns_server,
550
- std::make_unique<GrpcPolledFdFactoryPosix>(poller_manager_->Poller()),
551
- shared_from_this());
552
- if (!ares_resolver.ok()) {
553
- return ares_resolver.status();
553
+ GRPC_UNUSED const EventEngine::DNSResolver::ResolverOptions& options) {
554
+ #ifndef GRPC_POSIX_SOCKET_RESOLVE_ADDRESS
555
+ grpc_core::Crash("Unable to get DNS resolver for this platform.");
556
+ #else // GRPC_POSIX_SOCKET_RESOLVE_ADDRESS
557
+ // If c-ares is supported on the platform, build according to user's
558
+ // configuration.
559
+ if (ShouldUseAresDnsResolver()) {
560
+ #if GRPC_ARES == 1 && defined(GRPC_POSIX_SOCKET_ARES_EV_DRIVER)
561
+ GRPC_EVENT_ENGINE_DNS_TRACE("PosixEventEngine:%p creating AresResolver",
562
+ this);
563
+ auto ares_resolver = AresResolver::CreateAresResolver(
564
+ options.dns_server,
565
+ std::make_unique<GrpcPolledFdFactoryPosix>(poller_manager_->Poller()),
566
+ shared_from_this());
567
+ if (!ares_resolver.ok()) {
568
+ return ares_resolver.status();
569
+ }
570
+ return std::make_unique<PosixEventEngine::PosixDNSResolver>(
571
+ std::move(*ares_resolver));
572
+ #endif // GRPC_ARES == 1 && defined(GRPC_POSIX_SOCKET_ARES_EV_DRIVER)
554
573
  }
574
+ GRPC_EVENT_ENGINE_DNS_TRACE(
575
+ "PosixEventEngine:%p creating NativePosixDNSResolver", this);
555
576
  return std::make_unique<PosixEventEngine::PosixDNSResolver>(
556
- std::move(*ares_resolver));
557
- #else // GRPC_ARES == 1 && defined(GRPC_POSIX_SOCKET_TCP)
558
- // TODO(yijiem): Implement a basic A/AAAA-only native resolver in
559
- // PosixEventEngine.
560
- (void)options;
561
- grpc_core::Crash("unimplemented");
562
- #endif // GRPC_ARES == 1 && defined(GRPC_POSIX_SOCKET_TCP)
577
+ grpc_core::MakeOrphanable<NativePosixDNSResolver>(shared_from_this()));
578
+ #endif // GRPC_POSIX_SOCKET_RESOLVE_ADDRESS
563
579
  }
564
580
 
565
581
  bool PosixEventEngine::IsWorkerThread() { grpc_core::Crash("unimplemented"); }