diff --git a/CMakeLists.txt b/CMakeLists.txt
index 9d2a53f4ed6..9782163ed81 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -1212,6 +1212,9 @@ if(gRPC_BUILD_TESTS)
if(_gRPC_PLATFORM_LINUX OR _gRPC_PLATFORM_POSIX)
add_dependencies(buildtests_cxx posix_event_engine_connect_test)
endif()
+ if(_gRPC_PLATFORM_LINUX OR _gRPC_PLATFORM_POSIX)
+ add_dependencies(buildtests_cxx posix_event_engine_native_dns_test)
+ endif()
if(_gRPC_PLATFORM_LINUX OR _gRPC_PLATFORM_POSIX)
add_dependencies(buildtests_cxx posix_event_engine_test)
endif()
@@ -2245,6 +2248,7 @@ add_library(grpc
src/core/lib/event_engine/posix_engine/event_poller_posix_default.cc
src/core/lib/event_engine/posix_engine/internal_errqueue.cc
src/core/lib/event_engine/posix_engine/lockfree_event.cc
+ src/core/lib/event_engine/posix_engine/native_dns_resolver.cc
src/core/lib/event_engine/posix_engine/posix_endpoint.cc
src/core/lib/event_engine/posix_engine/posix_engine.cc
src/core/lib/event_engine/posix_engine/posix_engine_listener.cc
@@ -2973,6 +2977,7 @@ add_library(grpc_unsecure
src/core/lib/event_engine/posix_engine/event_poller_posix_default.cc
src/core/lib/event_engine/posix_engine/internal_errqueue.cc
src/core/lib/event_engine/posix_engine/lockfree_event.cc
+ src/core/lib/event_engine/posix_engine/native_dns_resolver.cc
src/core/lib/event_engine/posix_engine/posix_endpoint.cc
src/core/lib/event_engine/posix_engine/posix_engine.cc
src/core/lib/event_engine/posix_engine/posix_engine_listener.cc
@@ -4961,6 +4966,7 @@ add_library(grpc_authorization_provider
src/core/lib/event_engine/posix_engine/event_poller_posix_default.cc
src/core/lib/event_engine/posix_engine/internal_errqueue.cc
src/core/lib/event_engine/posix_engine/lockfree_event.cc
+ src/core/lib/event_engine/posix_engine/native_dns_resolver.cc
src/core/lib/event_engine/posix_engine/posix_endpoint.cc
src/core/lib/event_engine/posix_engine/posix_engine.cc
src/core/lib/event_engine/posix_engine/posix_engine_listener.cc
@@ -18275,6 +18281,48 @@ if(_gRPC_PLATFORM_LINUX OR _gRPC_PLATFORM_POSIX)
)
+endif()
+endif()
+if(gRPC_BUILD_TESTS)
+if(_gRPC_PLATFORM_LINUX OR _gRPC_PLATFORM_POSIX)
+
+ add_executable(posix_event_engine_native_dns_test
+ test/core/event_engine/event_engine_test_utils.cc
+ test/core/event_engine/test_suite/event_engine_test_framework.cc
+ test/core/event_engine/test_suite/posix/oracle_event_engine_posix.cc
+ test/core/event_engine/test_suite/posix_event_engine_native_dns_test.cc
+ test/core/event_engine/test_suite/tests/dns_test.cc
+ test/core/util/fake_udp_and_tcp_server.cc
+ test/cpp/util/get_grpc_test_runfile_dir.cc
+ test/cpp/util/windows/manifest_file.cc
+ )
+ target_compile_features(posix_event_engine_native_dns_test PUBLIC cxx_std_14)
+ target_include_directories(posix_event_engine_native_dns_test
+ PRIVATE
+ ${CMAKE_CURRENT_SOURCE_DIR}
+ ${CMAKE_CURRENT_SOURCE_DIR}/include
+ ${_gRPC_ADDRESS_SORTING_INCLUDE_DIR}
+ ${_gRPC_RE2_INCLUDE_DIR}
+ ${_gRPC_SSL_INCLUDE_DIR}
+ ${_gRPC_UPB_GENERATED_DIR}
+ ${_gRPC_UPB_GRPC_GENERATED_DIR}
+ ${_gRPC_UPB_INCLUDE_DIR}
+ ${_gRPC_XXHASH_INCLUDE_DIR}
+ ${_gRPC_ZLIB_INCLUDE_DIR}
+ third_party/googletest/googletest/include
+ third_party/googletest/googletest
+ third_party/googletest/googlemock/include
+ third_party/googletest/googlemock
+ ${_gRPC_PROTO_GENS_DIR}
+ )
+
+ target_link_libraries(posix_event_engine_native_dns_test
+ ${_gRPC_ALLTARGETS_LIBRARIES}
+ gtest
+ grpc++_test_util
+ )
+
+
endif()
endif()
if(gRPC_BUILD_TESTS)
@@ -24603,6 +24651,7 @@ add_executable(test_core_transport_chaotic_good_frame_test
src/core/lib/event_engine/posix_engine/event_poller_posix_default.cc
src/core/lib/event_engine/posix_engine/internal_errqueue.cc
src/core/lib/event_engine/posix_engine/lockfree_event.cc
+ src/core/lib/event_engine/posix_engine/native_dns_resolver.cc
src/core/lib/event_engine/posix_engine/posix_endpoint.cc
src/core/lib/event_engine/posix_engine/posix_engine.cc
src/core/lib/event_engine/posix_engine/posix_engine_listener.cc
diff --git a/Makefile b/Makefile
index 4833a2944fe..224e74adc5e 100644
--- a/Makefile
+++ b/Makefile
@@ -1450,6 +1450,7 @@ LIBGRPC_SRC = \
src/core/lib/event_engine/posix_engine/event_poller_posix_default.cc \
src/core/lib/event_engine/posix_engine/internal_errqueue.cc \
src/core/lib/event_engine/posix_engine/lockfree_event.cc \
+ src/core/lib/event_engine/posix_engine/native_dns_resolver.cc \
src/core/lib/event_engine/posix_engine/posix_endpoint.cc \
src/core/lib/event_engine/posix_engine/posix_engine.cc \
src/core/lib/event_engine/posix_engine/posix_engine_listener.cc \
@@ -2028,6 +2029,7 @@ LIBGRPC_UNSECURE_SRC = \
src/core/lib/event_engine/posix_engine/event_poller_posix_default.cc \
src/core/lib/event_engine/posix_engine/internal_errqueue.cc \
src/core/lib/event_engine/posix_engine/lockfree_event.cc \
+ src/core/lib/event_engine/posix_engine/native_dns_resolver.cc \
src/core/lib/event_engine/posix_engine/posix_endpoint.cc \
src/core/lib/event_engine/posix_engine/posix_engine.cc \
src/core/lib/event_engine/posix_engine/posix_engine_listener.cc \
diff --git a/Package.swift b/Package.swift
index 65543f68046..9e501b405fd 100644
--- a/Package.swift
+++ b/Package.swift
@@ -1277,6 +1277,8 @@ let package = Package(
"src/core/lib/event_engine/posix_engine/internal_errqueue.h",
"src/core/lib/event_engine/posix_engine/lockfree_event.cc",
"src/core/lib/event_engine/posix_engine/lockfree_event.h",
+ "src/core/lib/event_engine/posix_engine/native_dns_resolver.cc",
+ "src/core/lib/event_engine/posix_engine/native_dns_resolver.h",
"src/core/lib/event_engine/posix_engine/posix_endpoint.cc",
"src/core/lib/event_engine/posix_engine/posix_endpoint.h",
"src/core/lib/event_engine/posix_engine/posix_engine.cc",
@@ -1303,6 +1305,7 @@ let package = Package(
"src/core/lib/event_engine/posix_engine/wakeup_fd_posix.h",
"src/core/lib/event_engine/posix_engine/wakeup_fd_posix_default.cc",
"src/core/lib/event_engine/posix_engine/wakeup_fd_posix_default.h",
+ "src/core/lib/event_engine/ref_counted_dns_resolver_interface.h",
"src/core/lib/event_engine/resolved_address.cc",
"src/core/lib/event_engine/resolved_address_internal.h",
"src/core/lib/event_engine/shim.cc",
diff --git a/build_autogenerated.yaml b/build_autogenerated.yaml
index 5ed752b05e0..392481ce4cc 100644
--- a/build_autogenerated.yaml
+++ b/build_autogenerated.yaml
@@ -877,6 +877,7 @@ libs:
- src/core/lib/event_engine/posix_engine/grpc_polled_fd_posix.h
- src/core/lib/event_engine/posix_engine/internal_errqueue.h
- src/core/lib/event_engine/posix_engine/lockfree_event.h
+ - src/core/lib/event_engine/posix_engine/native_dns_resolver.h
- src/core/lib/event_engine/posix_engine/posix_endpoint.h
- src/core/lib/event_engine/posix_engine/posix_engine.h
- src/core/lib/event_engine/posix_engine/posix_engine_closure.h
@@ -891,6 +892,7 @@ libs:
- src/core/lib/event_engine/posix_engine/wakeup_fd_pipe.h
- src/core/lib/event_engine/posix_engine/wakeup_fd_posix.h
- src/core/lib/event_engine/posix_engine/wakeup_fd_posix_default.h
+ - src/core/lib/event_engine/ref_counted_dns_resolver_interface.h
- src/core/lib/event_engine/resolved_address_internal.h
- src/core/lib/event_engine/shim.h
- src/core/lib/event_engine/tcp_socket_utils.h
@@ -1699,6 +1701,7 @@ libs:
- src/core/lib/event_engine/posix_engine/event_poller_posix_default.cc
- src/core/lib/event_engine/posix_engine/internal_errqueue.cc
- src/core/lib/event_engine/posix_engine/lockfree_event.cc
+ - src/core/lib/event_engine/posix_engine/native_dns_resolver.cc
- src/core/lib/event_engine/posix_engine/posix_endpoint.cc
- src/core/lib/event_engine/posix_engine/posix_engine.cc
- src/core/lib/event_engine/posix_engine/posix_engine_listener.cc
@@ -2331,6 +2334,7 @@ libs:
- src/core/lib/event_engine/posix_engine/grpc_polled_fd_posix.h
- src/core/lib/event_engine/posix_engine/internal_errqueue.h
- src/core/lib/event_engine/posix_engine/lockfree_event.h
+ - src/core/lib/event_engine/posix_engine/native_dns_resolver.h
- src/core/lib/event_engine/posix_engine/posix_endpoint.h
- src/core/lib/event_engine/posix_engine/posix_engine.h
- src/core/lib/event_engine/posix_engine/posix_engine_closure.h
@@ -2345,6 +2349,7 @@ libs:
- src/core/lib/event_engine/posix_engine/wakeup_fd_pipe.h
- src/core/lib/event_engine/posix_engine/wakeup_fd_posix.h
- src/core/lib/event_engine/posix_engine/wakeup_fd_posix_default.h
+ - src/core/lib/event_engine/ref_counted_dns_resolver_interface.h
- src/core/lib/event_engine/resolved_address_internal.h
- src/core/lib/event_engine/shim.h
- src/core/lib/event_engine/tcp_socket_utils.h
@@ -2777,6 +2782,7 @@ libs:
- src/core/lib/event_engine/posix_engine/event_poller_posix_default.cc
- src/core/lib/event_engine/posix_engine/internal_errqueue.cc
- src/core/lib/event_engine/posix_engine/lockfree_event.cc
+ - src/core/lib/event_engine/posix_engine/native_dns_resolver.cc
- src/core/lib/event_engine/posix_engine/posix_endpoint.cc
- src/core/lib/event_engine/posix_engine/posix_engine.cc
- src/core/lib/event_engine/posix_engine/posix_engine_listener.cc
@@ -4465,6 +4471,7 @@ libs:
- src/core/lib/event_engine/posix_engine/grpc_polled_fd_posix.h
- src/core/lib/event_engine/posix_engine/internal_errqueue.h
- src/core/lib/event_engine/posix_engine/lockfree_event.h
+ - src/core/lib/event_engine/posix_engine/native_dns_resolver.h
- src/core/lib/event_engine/posix_engine/posix_endpoint.h
- src/core/lib/event_engine/posix_engine/posix_engine.h
- src/core/lib/event_engine/posix_engine/posix_engine_closure.h
@@ -4479,6 +4486,7 @@ libs:
- src/core/lib/event_engine/posix_engine/wakeup_fd_pipe.h
- src/core/lib/event_engine/posix_engine/wakeup_fd_posix.h
- src/core/lib/event_engine/posix_engine/wakeup_fd_posix_default.h
+ - src/core/lib/event_engine/ref_counted_dns_resolver_interface.h
- src/core/lib/event_engine/resolved_address_internal.h
- src/core/lib/event_engine/shim.h
- src/core/lib/event_engine/tcp_socket_utils.h
@@ -4818,6 +4826,7 @@ libs:
- src/core/lib/event_engine/posix_engine/event_poller_posix_default.cc
- src/core/lib/event_engine/posix_engine/internal_errqueue.cc
- src/core/lib/event_engine/posix_engine/lockfree_event.cc
+ - src/core/lib/event_engine/posix_engine/native_dns_resolver.cc
- src/core/lib/event_engine/posix_engine/posix_endpoint.cc
- src/core/lib/event_engine/posix_engine/posix_engine.cc
- src/core/lib/event_engine/posix_engine/posix_engine_listener.cc
@@ -12970,6 +12979,33 @@ targets:
platforms:
- linux
- posix
+- name: posix_event_engine_native_dns_test
+ gtest: true
+ build: test
+ language: c++
+ headers:
+ - test/core/event_engine/event_engine_test_utils.h
+ - test/core/event_engine/test_suite/event_engine_test_framework.h
+ - test/core/event_engine/test_suite/posix/oracle_event_engine_posix.h
+ - test/core/event_engine/test_suite/tests/dns_test.h
+ - test/core/util/fake_udp_and_tcp_server.h
+ - test/cpp/util/get_grpc_test_runfile_dir.h
+ - test/cpp/util/windows/manifest_file.h
+ src:
+ - test/core/event_engine/event_engine_test_utils.cc
+ - test/core/event_engine/test_suite/event_engine_test_framework.cc
+ - test/core/event_engine/test_suite/posix/oracle_event_engine_posix.cc
+ - test/core/event_engine/test_suite/posix_event_engine_native_dns_test.cc
+ - test/core/event_engine/test_suite/tests/dns_test.cc
+ - test/core/util/fake_udp_and_tcp_server.cc
+ - test/cpp/util/get_grpc_test_runfile_dir.cc
+ - test/cpp/util/windows/manifest_file.cc
+ deps:
+ - gtest
+ - grpc++_test_util
+ platforms:
+ - linux
+ - posix
- name: posix_event_engine_test
gtest: true
build: test
@@ -16795,6 +16831,7 @@ targets:
- src/core/lib/event_engine/posix_engine/grpc_polled_fd_posix.h
- src/core/lib/event_engine/posix_engine/internal_errqueue.h
- src/core/lib/event_engine/posix_engine/lockfree_event.h
+ - src/core/lib/event_engine/posix_engine/native_dns_resolver.h
- src/core/lib/event_engine/posix_engine/posix_endpoint.h
- src/core/lib/event_engine/posix_engine/posix_engine.h
- src/core/lib/event_engine/posix_engine/posix_engine_closure.h
@@ -16809,6 +16846,7 @@ targets:
- src/core/lib/event_engine/posix_engine/wakeup_fd_pipe.h
- src/core/lib/event_engine/posix_engine/wakeup_fd_posix.h
- src/core/lib/event_engine/posix_engine/wakeup_fd_posix_default.h
+ - src/core/lib/event_engine/ref_counted_dns_resolver_interface.h
- src/core/lib/event_engine/resolved_address_internal.h
- src/core/lib/event_engine/shim.h
- src/core/lib/event_engine/tcp_socket_utils.h
@@ -17129,6 +17167,7 @@ targets:
- src/core/lib/event_engine/posix_engine/event_poller_posix_default.cc
- src/core/lib/event_engine/posix_engine/internal_errqueue.cc
- src/core/lib/event_engine/posix_engine/lockfree_event.cc
+ - src/core/lib/event_engine/posix_engine/native_dns_resolver.cc
- src/core/lib/event_engine/posix_engine/posix_endpoint.cc
- src/core/lib/event_engine/posix_engine/posix_engine.cc
- src/core/lib/event_engine/posix_engine/posix_engine_listener.cc
diff --git a/config.m4 b/config.m4
index 01455fdd842..894bef129aa 100644
--- a/config.m4
+++ b/config.m4
@@ -540,6 +540,7 @@ if test "$PHP_GRPC" != "no"; then
src/core/lib/event_engine/posix_engine/event_poller_posix_default.cc \
src/core/lib/event_engine/posix_engine/internal_errqueue.cc \
src/core/lib/event_engine/posix_engine/lockfree_event.cc \
+ src/core/lib/event_engine/posix_engine/native_dns_resolver.cc \
src/core/lib/event_engine/posix_engine/posix_endpoint.cc \
src/core/lib/event_engine/posix_engine/posix_engine.cc \
src/core/lib/event_engine/posix_engine/posix_engine_listener.cc \
diff --git a/config.w32 b/config.w32
index 0025913ecd7..f778ae8e4b0 100644
--- a/config.w32
+++ b/config.w32
@@ -505,6 +505,7 @@ if (PHP_GRPC != "no") {
"src\\core\\lib\\event_engine\\posix_engine\\event_poller_posix_default.cc " +
"src\\core\\lib\\event_engine\\posix_engine\\internal_errqueue.cc " +
"src\\core\\lib\\event_engine\\posix_engine\\lockfree_event.cc " +
+ "src\\core\\lib\\event_engine\\posix_engine\\native_dns_resolver.cc " +
"src\\core\\lib\\event_engine\\posix_engine\\posix_endpoint.cc " +
"src\\core\\lib\\event_engine\\posix_engine\\posix_engine.cc " +
"src\\core\\lib\\event_engine\\posix_engine\\posix_engine_listener.cc " +
diff --git a/gRPC-C++.podspec b/gRPC-C++.podspec
index 5e8485aad75..14b9978f503 100644
--- a/gRPC-C++.podspec
+++ b/gRPC-C++.podspec
@@ -951,6 +951,7 @@ Pod::Spec.new do |s|
'src/core/lib/event_engine/posix_engine/grpc_polled_fd_posix.h',
'src/core/lib/event_engine/posix_engine/internal_errqueue.h',
'src/core/lib/event_engine/posix_engine/lockfree_event.h',
+ 'src/core/lib/event_engine/posix_engine/native_dns_resolver.h',
'src/core/lib/event_engine/posix_engine/posix_endpoint.h',
'src/core/lib/event_engine/posix_engine/posix_engine.h',
'src/core/lib/event_engine/posix_engine/posix_engine_closure.h',
@@ -965,6 +966,7 @@ Pod::Spec.new do |s|
'src/core/lib/event_engine/posix_engine/wakeup_fd_pipe.h',
'src/core/lib/event_engine/posix_engine/wakeup_fd_posix.h',
'src/core/lib/event_engine/posix_engine/wakeup_fd_posix_default.h',
+ 'src/core/lib/event_engine/ref_counted_dns_resolver_interface.h',
'src/core/lib/event_engine/resolved_address_internal.h',
'src/core/lib/event_engine/shim.h',
'src/core/lib/event_engine/tcp_socket_utils.h',
@@ -2183,6 +2185,7 @@ Pod::Spec.new do |s|
'src/core/lib/event_engine/posix_engine/grpc_polled_fd_posix.h',
'src/core/lib/event_engine/posix_engine/internal_errqueue.h',
'src/core/lib/event_engine/posix_engine/lockfree_event.h',
+ 'src/core/lib/event_engine/posix_engine/native_dns_resolver.h',
'src/core/lib/event_engine/posix_engine/posix_endpoint.h',
'src/core/lib/event_engine/posix_engine/posix_engine.h',
'src/core/lib/event_engine/posix_engine/posix_engine_closure.h',
@@ -2197,6 +2200,7 @@ Pod::Spec.new do |s|
'src/core/lib/event_engine/posix_engine/wakeup_fd_pipe.h',
'src/core/lib/event_engine/posix_engine/wakeup_fd_posix.h',
'src/core/lib/event_engine/posix_engine/wakeup_fd_posix_default.h',
+ 'src/core/lib/event_engine/ref_counted_dns_resolver_interface.h',
'src/core/lib/event_engine/resolved_address_internal.h',
'src/core/lib/event_engine/shim.h',
'src/core/lib/event_engine/tcp_socket_utils.h',
diff --git a/gRPC-Core.podspec b/gRPC-Core.podspec
index 0fd3d263628..a1a61b62611 100644
--- a/gRPC-Core.podspec
+++ b/gRPC-Core.podspec
@@ -1380,6 +1380,8 @@ Pod::Spec.new do |s|
'src/core/lib/event_engine/posix_engine/internal_errqueue.h',
'src/core/lib/event_engine/posix_engine/lockfree_event.cc',
'src/core/lib/event_engine/posix_engine/lockfree_event.h',
+ 'src/core/lib/event_engine/posix_engine/native_dns_resolver.cc',
+ 'src/core/lib/event_engine/posix_engine/native_dns_resolver.h',
'src/core/lib/event_engine/posix_engine/posix_endpoint.cc',
'src/core/lib/event_engine/posix_engine/posix_endpoint.h',
'src/core/lib/event_engine/posix_engine/posix_engine.cc',
@@ -1406,6 +1408,7 @@ Pod::Spec.new do |s|
'src/core/lib/event_engine/posix_engine/wakeup_fd_posix.h',
'src/core/lib/event_engine/posix_engine/wakeup_fd_posix_default.cc',
'src/core/lib/event_engine/posix_engine/wakeup_fd_posix_default.h',
+ 'src/core/lib/event_engine/ref_counted_dns_resolver_interface.h',
'src/core/lib/event_engine/resolved_address.cc',
'src/core/lib/event_engine/resolved_address_internal.h',
'src/core/lib/event_engine/shim.cc',
@@ -2945,6 +2948,7 @@ Pod::Spec.new do |s|
'src/core/lib/event_engine/posix_engine/grpc_polled_fd_posix.h',
'src/core/lib/event_engine/posix_engine/internal_errqueue.h',
'src/core/lib/event_engine/posix_engine/lockfree_event.h',
+ 'src/core/lib/event_engine/posix_engine/native_dns_resolver.h',
'src/core/lib/event_engine/posix_engine/posix_endpoint.h',
'src/core/lib/event_engine/posix_engine/posix_engine.h',
'src/core/lib/event_engine/posix_engine/posix_engine_closure.h',
@@ -2959,6 +2963,7 @@ Pod::Spec.new do |s|
'src/core/lib/event_engine/posix_engine/wakeup_fd_pipe.h',
'src/core/lib/event_engine/posix_engine/wakeup_fd_posix.h',
'src/core/lib/event_engine/posix_engine/wakeup_fd_posix_default.h',
+ 'src/core/lib/event_engine/ref_counted_dns_resolver_interface.h',
'src/core/lib/event_engine/resolved_address_internal.h',
'src/core/lib/event_engine/shim.h',
'src/core/lib/event_engine/tcp_socket_utils.h',
diff --git a/grpc.gemspec b/grpc.gemspec
index c7248f3c6b2..aef58159c38 100644
--- a/grpc.gemspec
+++ b/grpc.gemspec
@@ -1283,6 +1283,8 @@ Gem::Specification.new do |s|
s.files += %w( src/core/lib/event_engine/posix_engine/internal_errqueue.h )
s.files += %w( src/core/lib/event_engine/posix_engine/lockfree_event.cc )
s.files += %w( src/core/lib/event_engine/posix_engine/lockfree_event.h )
+ s.files += %w( src/core/lib/event_engine/posix_engine/native_dns_resolver.cc )
+ s.files += %w( src/core/lib/event_engine/posix_engine/native_dns_resolver.h )
s.files += %w( src/core/lib/event_engine/posix_engine/posix_endpoint.cc )
s.files += %w( src/core/lib/event_engine/posix_engine/posix_endpoint.h )
s.files += %w( src/core/lib/event_engine/posix_engine/posix_engine.cc )
@@ -1309,6 +1311,7 @@ Gem::Specification.new do |s|
s.files += %w( src/core/lib/event_engine/posix_engine/wakeup_fd_posix.h )
s.files += %w( src/core/lib/event_engine/posix_engine/wakeup_fd_posix_default.cc )
s.files += %w( src/core/lib/event_engine/posix_engine/wakeup_fd_posix_default.h )
+ s.files += %w( src/core/lib/event_engine/ref_counted_dns_resolver_interface.h )
s.files += %w( src/core/lib/event_engine/resolved_address.cc )
s.files += %w( src/core/lib/event_engine/resolved_address_internal.h )
s.files += %w( src/core/lib/event_engine/shim.cc )
diff --git a/grpc.gyp b/grpc.gyp
index f81c1290172..7a29bd04e94 100644
--- a/grpc.gyp
+++ b/grpc.gyp
@@ -770,6 +770,7 @@
'src/core/lib/event_engine/posix_engine/event_poller_posix_default.cc',
'src/core/lib/event_engine/posix_engine/internal_errqueue.cc',
'src/core/lib/event_engine/posix_engine/lockfree_event.cc',
+ 'src/core/lib/event_engine/posix_engine/native_dns_resolver.cc',
'src/core/lib/event_engine/posix_engine/posix_endpoint.cc',
'src/core/lib/event_engine/posix_engine/posix_engine.cc',
'src/core/lib/event_engine/posix_engine/posix_engine_listener.cc',
@@ -1290,6 +1291,7 @@
'src/core/lib/event_engine/posix_engine/event_poller_posix_default.cc',
'src/core/lib/event_engine/posix_engine/internal_errqueue.cc',
'src/core/lib/event_engine/posix_engine/lockfree_event.cc',
+ 'src/core/lib/event_engine/posix_engine/native_dns_resolver.cc',
'src/core/lib/event_engine/posix_engine/posix_endpoint.cc',
'src/core/lib/event_engine/posix_engine/posix_engine.cc',
'src/core/lib/event_engine/posix_engine/posix_engine_listener.cc',
@@ -2069,6 +2071,7 @@
'src/core/lib/event_engine/posix_engine/event_poller_posix_default.cc',
'src/core/lib/event_engine/posix_engine/internal_errqueue.cc',
'src/core/lib/event_engine/posix_engine/lockfree_event.cc',
+ 'src/core/lib/event_engine/posix_engine/native_dns_resolver.cc',
'src/core/lib/event_engine/posix_engine/posix_endpoint.cc',
'src/core/lib/event_engine/posix_engine/posix_engine.cc',
'src/core/lib/event_engine/posix_engine/posix_engine_listener.cc',
diff --git a/package.xml b/package.xml
index 38b4ade03a1..98876682011 100644
--- a/package.xml
+++ b/package.xml
@@ -1265,6 +1265,8 @@
+
+
@@ -1291,6 +1293,7 @@
+
diff --git a/src/core/BUILD b/src/core/BUILD
index e6a4457ac0f..ffae458b39a 100644
--- a/src/core/BUILD
+++ b/src/core/BUILD
@@ -2141,6 +2141,7 @@ grpc_cc_library(
"forkable",
"init_internally",
"iomgr_port",
+ "native_dns_resolver",
"no_destruct",
"posix_event_engine_base_hdrs",
"posix_event_engine_closure",
@@ -2151,7 +2152,9 @@ grpc_cc_library(
"posix_event_engine_tcp_socket_utils",
"posix_event_engine_timer",
"posix_event_engine_timer_manager",
+ "ref_counted_dns_resolver_interface",
"useful",
+ "//:config_vars",
"//:event_engine_base_hdrs",
"//:gpr",
"//:grpc_trace",
@@ -2472,6 +2475,41 @@ grpc_cc_library(
],
)
+grpc_cc_library(
+ name = "ref_counted_dns_resolver_interface",
+ hdrs = ["lib/event_engine/ref_counted_dns_resolver_interface.h"],
+ external_deps = ["absl/strings"],
+ deps = [
+ "//:event_engine_base_hdrs",
+ "//:gpr_platform",
+ "//:orphanable",
+ ],
+)
+
+grpc_cc_library(
+ name = "native_dns_resolver",
+ srcs = [
+ "lib/event_engine/posix_engine/native_dns_resolver.cc",
+ ],
+ hdrs = [
+ "lib/event_engine/posix_engine/native_dns_resolver.h",
+ ],
+ external_deps = [
+ "absl/functional:any_invocable",
+ "absl/status",
+ "absl/status:statusor",
+ "absl/strings",
+ "absl/strings:str_format",
+ ],
+ deps = [
+ "iomgr_port",
+ "ref_counted_dns_resolver_interface",
+ "useful",
+ "//:event_engine_base_hdrs",
+ "//:gpr",
+ ],
+)
+
grpc_cc_library(
name = "ares_resolver",
srcs = [
@@ -2507,6 +2545,7 @@ grpc_cc_library(
"posix_event_engine_closure",
"posix_event_engine_event_poller",
"posix_event_engine_tcp_socket_utils",
+ "ref_counted_dns_resolver_interface",
"resolved_address",
"slice",
"windows_iocp",
diff --git a/src/core/lib/event_engine/ares_resolver.cc b/src/core/lib/event_engine/ares_resolver.cc
index d88f0a9c245..70813eb649a 100644
--- a/src/core/lib/event_engine/ares_resolver.cc
+++ b/src/core/lib/event_engine/ares_resolver.cc
@@ -193,7 +193,7 @@ AresResolver::CreateAresResolver(
AresResolver::AresResolver(
std::unique_ptr polled_fd_factory,
std::shared_ptr event_engine, ares_channel channel)
- : grpc_core::InternallyRefCounted(
+ : RefCountedDNSResolverInterface(
GRPC_TRACE_FLAG_ENABLED(grpc_trace_ares_resolver) ? "AresResolver"
: nullptr),
channel_(channel),
@@ -230,8 +230,8 @@ void AresResolver::Orphan() {
}
void AresResolver::LookupHostname(
- absl::string_view name, absl::string_view default_port,
- EventEngine::DNSResolver::LookupHostnameCallback callback) {
+ EventEngine::DNSResolver::LookupHostnameCallback callback,
+ absl::string_view name, absl::string_view default_port) {
absl::string_view host;
absl::string_view port_string;
if (!grpc_core::SplitHostPort(name, &host, &port_string)) {
@@ -296,8 +296,8 @@ void AresResolver::LookupHostname(
}
void AresResolver::LookupSRV(
- absl::string_view name,
- EventEngine::DNSResolver::LookupSRVCallback callback) {
+ EventEngine::DNSResolver::LookupSRVCallback callback,
+ absl::string_view name) {
absl::string_view host;
absl::string_view port;
if (!grpc_core::SplitHostPort(name, &host, &port)) {
@@ -325,8 +325,8 @@ void AresResolver::LookupSRV(
}
void AresResolver::LookupTXT(
- absl::string_view name,
- EventEngine::DNSResolver::LookupTXTCallback callback) {
+ EventEngine::DNSResolver::LookupTXTCallback callback,
+ absl::string_view name) {
absl::string_view host;
absl::string_view port;
if (!grpc_core::SplitHostPort(name, &host, &port)) {
@@ -387,7 +387,8 @@ void AresResolver::CheckSocketsLocked() {
event_engine_->Run(
[self = Ref(DEBUG_LOCATION, "CheckSocketsLocked"),
fd_node]() mutable {
- self->OnReadable(fd_node, absl::OkStatus());
+ static_cast(self.get())
+ ->OnReadable(fd_node, absl::OkStatus());
});
} else {
// Otherwise register with the poller for readable event.
@@ -396,7 +397,8 @@ void AresResolver::CheckSocketsLocked() {
fd_node->polled_fd->RegisterForOnReadableLocked(
[self = Ref(DEBUG_LOCATION, "CheckSocketsLocked"),
fd_node](absl::Status status) mutable {
- self->OnReadable(fd_node, status);
+ static_cast(self.get())
+ ->OnReadable(fd_node, status);
});
}
}
@@ -410,7 +412,8 @@ void AresResolver::CheckSocketsLocked() {
fd_node->polled_fd->RegisterForOnWriteableLocked(
[self = Ref(DEBUG_LOCATION, "CheckSocketsLocked"),
fd_node](absl::Status status) mutable {
- self->OnWritable(fd_node, status);
+ static_cast(self.get())
+ ->OnWritable(fd_node, status);
});
}
}
@@ -453,7 +456,7 @@ void AresResolver::MaybeStartTimerLocked() {
ares_backup_poll_alarm_handle_ = event_engine_->RunAfter(
kAresBackupPollAlarmDuration,
[self = Ref(DEBUG_LOCATION, "MaybeStartTimerLocked")]() {
- self->OnAresBackupPollAlarm();
+ static_cast(self.get())->OnAresBackupPollAlarm();
});
}
diff --git a/src/core/lib/event_engine/ares_resolver.h b/src/core/lib/event_engine/ares_resolver.h
index df394ca69dc..a1837f2ccf0 100644
--- a/src/core/lib/event_engine/ares_resolver.h
+++ b/src/core/lib/event_engine/ares_resolver.h
@@ -39,6 +39,7 @@
#include
#include "src/core/lib/event_engine/grpc_polled_fd.h"
+#include "src/core/lib/event_engine/ref_counted_dns_resolver_interface.h"
#include "src/core/lib/gprpp/orphanable.h"
#include "src/core/lib/gprpp/sync.h"
@@ -54,7 +55,7 @@ extern grpc_core::TraceFlag grpc_trace_ares_resolver;
} \
} while (0)
-class AresResolver : public grpc_core::InternallyRefCounted {
+class AresResolver : public RefCountedDNSResolverInterface {
public:
static absl::StatusOr>
CreateAresResolver(absl::string_view dns_server,
@@ -67,15 +68,13 @@ class AresResolver : public grpc_core::InternallyRefCounted {
~AresResolver() override;
void Orphan() override ABSL_LOCKS_EXCLUDED(mutex_);
- void LookupHostname(absl::string_view name, absl::string_view default_port,
- EventEngine::DNSResolver::LookupHostnameCallback callback)
- ABSL_LOCKS_EXCLUDED(mutex_);
- void LookupSRV(absl::string_view name,
- EventEngine::DNSResolver::LookupSRVCallback callback)
- ABSL_LOCKS_EXCLUDED(mutex_);
- void LookupTXT(absl::string_view name,
- EventEngine::DNSResolver::LookupTXTCallback callback)
- ABSL_LOCKS_EXCLUDED(mutex_);
+ void LookupHostname(EventEngine::DNSResolver::LookupHostnameCallback callback,
+ absl::string_view name, absl::string_view default_port)
+ ABSL_LOCKS_EXCLUDED(mutex_) override;
+ void LookupSRV(EventEngine::DNSResolver::LookupSRVCallback callback,
+ absl::string_view name) ABSL_LOCKS_EXCLUDED(mutex_) override;
+ void LookupTXT(EventEngine::DNSResolver::LookupTXTCallback callback,
+ absl::string_view name) ABSL_LOCKS_EXCLUDED(mutex_) override;
private:
// A FdNode saves (not owns) a live socket/fd which c-ares creates, and owns a
diff --git a/src/core/lib/event_engine/posix_engine/native_dns_resolver.cc b/src/core/lib/event_engine/posix_engine/native_dns_resolver.cc
new file mode 100644
index 00000000000..79a9489d661
--- /dev/null
+++ b/src/core/lib/event_engine/posix_engine/native_dns_resolver.cc
@@ -0,0 +1,131 @@
+// Copyright 2023 The gRPC Authors.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+#include
+
+#include "src/core/lib/iomgr/port.h"
+
+#ifdef GRPC_POSIX_SOCKET_RESOLVE_ADDRESS
+
+#include
+#include
+#include
+
+#include
+#include
+#include
+#include
+
+#include "absl/functional/any_invocable.h"
+#include "absl/status/status.h"
+#include "absl/status/statusor.h"
+#include "absl/strings/str_cat.h"
+#include "absl/strings/str_format.h"
+
+#include "src/core/lib/event_engine/posix_engine/native_dns_resolver.h"
+#include "src/core/lib/gpr/useful.h"
+#include "src/core/lib/gprpp/host_port.h"
+
+namespace grpc_event_engine {
+namespace experimental {
+namespace {
+
+absl::StatusOr>
+LookupHostnameBlocking(absl::string_view name, absl::string_view default_port) {
+ struct addrinfo hints;
+ struct addrinfo *result = nullptr, *resp;
+ std::string host;
+ std::string port;
+ // parse name, splitting it into host and port parts
+ grpc_core::SplitHostPort(name, &host, &port);
+ if (host.empty()) {
+ return absl::InvalidArgumentError(absl::StrCat("Unparseable name: ", name));
+ }
+ if (port.empty()) {
+ if (default_port.empty()) {
+ return absl::InvalidArgumentError(
+ absl::StrFormat("No port in name %s or default_port argument", name));
+ }
+ port = std::string(default_port);
+ }
+ // Call getaddrinfo
+ memset(&hints, 0, sizeof(hints));
+ hints.ai_family = AF_UNSPEC; // ipv4 or ipv6
+ hints.ai_socktype = SOCK_STREAM; // stream socket
+ hints.ai_flags = AI_PASSIVE; // for wildcard IP address
+ int s = getaddrinfo(host.c_str(), port.c_str(), &hints, &result);
+ if (s != 0) {
+ // Retry if well-known service name is recognized
+ const char* svc[][2] = {{"http", "80"}, {"https", "443"}};
+ for (size_t i = 0; i < GPR_ARRAY_SIZE(svc); i++) {
+ if (port == svc[i][0]) {
+ s = getaddrinfo(host.c_str(), svc[i][1], &hints, &result);
+ break;
+ }
+ }
+ }
+ if (s != 0) {
+ return absl::UnknownError(absl::StrFormat(
+ "Address lookup failed for %s os_error: %s syscall: getaddrinfo", name,
+ gai_strerror(s)));
+ }
+ // Success path: fill in addrs
+ std::vector addresses;
+ for (resp = result; resp != nullptr; resp = resp->ai_next) {
+ addresses.emplace_back(resp->ai_addr, resp->ai_addrlen);
+ }
+ if (result) {
+ freeaddrinfo(result);
+ }
+ return addresses;
+}
+
+} // namespace
+
+NativeDNSResolver::NativeDNSResolver(std::shared_ptr event_engine)
+ : event_engine_(std::move(event_engine)) {}
+
+void NativeDNSResolver::LookupHostname(
+ EventEngine::DNSResolver::LookupHostnameCallback on_resolved,
+ absl::string_view name, absl::string_view default_port) {
+ event_engine_->Run(
+ [name, default_port, on_resolved = std::move(on_resolved)]() mutable {
+ on_resolved(LookupHostnameBlocking(name, default_port));
+ });
+}
+
+void NativeDNSResolver::LookupSRV(
+ EventEngine::DNSResolver::LookupSRVCallback on_resolved,
+ absl::string_view /* name */) {
+ // Not supported
+ event_engine_->Run([on_resolved = std::move(on_resolved)]() mutable {
+ on_resolved(absl::UnimplementedError(
+ "The Native resolver does not support looking up SRV records"));
+ });
+}
+
+void NativeDNSResolver::LookupTXT(
+ EventEngine::DNSResolver::LookupTXTCallback on_resolved,
+ absl::string_view /* name */) {
+ // Not supported
+ event_engine_->Run([on_resolved = std::move(on_resolved)]() mutable {
+ on_resolved(absl::UnimplementedError(
+ "The Native resolver does not support looking up TXT records"));
+ });
+}
+
+} // namespace experimental
+} // namespace grpc_event_engine
+
+#endif // GRPC_POSIX_SOCKET_RESOLVE_ADDRESS
diff --git a/src/core/lib/event_engine/posix_engine/native_dns_resolver.h b/src/core/lib/event_engine/posix_engine/native_dns_resolver.h
new file mode 100644
index 00000000000..411b090ab64
--- /dev/null
+++ b/src/core/lib/event_engine/posix_engine/native_dns_resolver.h
@@ -0,0 +1,61 @@
+// Copyright 2023 The gRPC Authors.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+#ifndef GRPC_SRC_CORE_LIB_EVENT_ENGINE_POSIX_ENGINE_NATIVE_DNS_RESOLVER_H
+#define GRPC_SRC_CORE_LIB_EVENT_ENGINE_POSIX_ENGINE_NATIVE_DNS_RESOLVER_H
+
+#include
+
+#include
+
+#include "absl/strings/string_view.h"
+
+#include "src/core/lib/iomgr/port.h"
+
+#ifdef GRPC_POSIX_SOCKET_RESOLVE_ADDRESS
+
+#include
+
+#include "src/core/lib/event_engine/ref_counted_dns_resolver_interface.h"
+
+namespace grpc_event_engine {
+namespace experimental {
+
+// An asynchronous DNS resolver which uses the native platform's getaddrinfo
+// API. Only supports A/AAAA records.
+class NativeDNSResolver : public RefCountedDNSResolverInterface {
+ public:
+ explicit NativeDNSResolver(std::shared_ptr event_engine);
+
+ void LookupHostname(
+ EventEngine::DNSResolver::LookupHostnameCallback on_resolved,
+ absl::string_view name, absl::string_view default_port) override;
+
+ void LookupSRV(EventEngine::DNSResolver::LookupSRVCallback on_resolved,
+ absl::string_view name) override;
+
+ void LookupTXT(EventEngine::DNSResolver::LookupTXTCallback on_resolved,
+ absl::string_view name) override;
+
+ void Orphan() override { delete this; }
+
+ private:
+ std::shared_ptr event_engine_;
+};
+
+} // namespace experimental
+} // namespace grpc_event_engine
+
+#endif // GRPC_POSIX_SOCKET_RESOLVE_ADDRESS
+#endif // GRPC_SRC_CORE_LIB_EVENT_ENGINE_POSIX_ENGINE_NATIVE_DNS_RESOLVER_H
diff --git a/src/core/lib/event_engine/posix_engine/posix_engine.cc b/src/core/lib/event_engine/posix_engine/posix_engine.cc
index f7e9a035f63..dad5bd03a6c 100644
--- a/src/core/lib/event_engine/posix_engine/posix_engine.cc
+++ b/src/core/lib/event_engine/posix_engine/posix_engine.cc
@@ -28,6 +28,7 @@
#include "absl/cleanup/cleanup.h"
#include "absl/functional/any_invocable.h"
#include "absl/status/status.h"
+#include "absl/strings/match.h"
#include "absl/strings/str_cat.h"
#include
@@ -36,12 +37,15 @@
#include
#include
+#include "src/core/lib/config/config_vars.h"
#include "src/core/lib/debug/trace.h"
+#include "src/core/lib/event_engine/ares_resolver.h"
#include "src/core/lib/event_engine/forkable.h"
#include "src/core/lib/event_engine/grpc_polled_fd.h"
#include "src/core/lib/event_engine/poller.h"
#include "src/core/lib/event_engine/posix.h"
#include "src/core/lib/event_engine/posix_engine/grpc_polled_fd_posix.h"
+#include "src/core/lib/event_engine/posix_engine/native_dns_resolver.h"
#include "src/core/lib/event_engine/posix_engine/tcp_socket_utils.h"
#include "src/core/lib/event_engine/posix_engine/timer.h"
#include "src/core/lib/event_engine/tcp_socket_utils.h"
@@ -90,6 +94,15 @@ class TimerForkCallbackMethods {
static void PostforkChild() { g_timer_fork_manager->PostforkChild(); }
};
+bool ShouldUseAresDnsResolver() {
+#if GRPC_ARES == 1 && defined(GRPC_POSIX_SOCKET_ARES_EV_DRIVER)
+ auto resolver_env = grpc_core::ConfigVars::Get().DnsResolver();
+ return resolver_env.empty() || absl::EqualsIgnoreCase(resolver_env, "ares");
+#else // GRPC_ARES == 1 && defined(GRPC_POSIX_SOCKET_ARES_EV_DRIVER)
+ return false;
+#endif // GRPC_ARES == 1 && defined(GRPC_POSIX_SOCKET_ARES_EV_DRIVER)
+}
+
} // namespace
#ifdef GRPC_POSIX_SOCKET_TCP
@@ -517,49 +530,54 @@ EventEngine::TaskHandle PosixEventEngine::RunAfterInternal(
return handle;
}
-#if GRPC_ARES == 1 && defined(GRPC_POSIX_SOCKET_TCP)
-
PosixEventEngine::PosixDNSResolver::PosixDNSResolver(
- grpc_core::OrphanablePtr ares_resolver)
- : ares_resolver_(std::move(ares_resolver)) {}
+ grpc_core::OrphanablePtr dns_resolver)
+ : dns_resolver_(std::move(dns_resolver)) {}
void PosixEventEngine::PosixDNSResolver::LookupHostname(
LookupHostnameCallback on_resolve, absl::string_view name,
absl::string_view default_port) {
- ares_resolver_->LookupHostname(name, default_port, std::move(on_resolve));
+ dns_resolver_->LookupHostname(std::move(on_resolve), name, default_port);
}
void PosixEventEngine::PosixDNSResolver::LookupSRV(LookupSRVCallback on_resolve,
absl::string_view name) {
- ares_resolver_->LookupSRV(name, std::move(on_resolve));
+ dns_resolver_->LookupSRV(std::move(on_resolve), name);
}
void PosixEventEngine::PosixDNSResolver::LookupTXT(LookupTXTCallback on_resolve,
absl::string_view name) {
- ares_resolver_->LookupTXT(name, std::move(on_resolve));
+ dns_resolver_->LookupTXT(std::move(on_resolve), name);
}
-#endif // GRPC_ARES == 1 && defined(GRPC_POSIX_SOCKET_TCP)
-
absl::StatusOr>
PosixEventEngine::GetDNSResolver(
const EventEngine::DNSResolver::ResolverOptions& options) {
-#if GRPC_ARES == 1 && defined(GRPC_POSIX_SOCKET_TCP)
- auto ares_resolver = AresResolver::CreateAresResolver(
- options.dns_server,
- std::make_unique(poller_manager_->Poller()),
- shared_from_this());
- if (!ares_resolver.ok()) {
- return ares_resolver.status();
+#ifndef GRPC_POSIX_SOCKET_RESOLVE_ADDRESS
+ grpc_core::Crash("Unable to get DNS resolver for this platform.");
+#else // GRPC_POSIX_SOCKET_RESOLVE_ADDRESS
+ // If c-ares is supported on the platform, build according to user's
+ // configuration.
+ if (ShouldUseAresDnsResolver()) {
+#if GRPC_ARES == 1 && defined(GRPC_POSIX_SOCKET_ARES_EV_DRIVER)
+ GRPC_EVENT_ENGINE_DNS_TRACE("PosixEventEngine:%p creating AresResolver",
+ this);
+ auto ares_resolver = AresResolver::CreateAresResolver(
+ options.dns_server,
+ std::make_unique(poller_manager_->Poller()),
+ shared_from_this());
+ if (!ares_resolver.ok()) {
+ return ares_resolver.status();
+ }
+ return std::make_unique(
+ std::move(*ares_resolver));
+#endif // GRPC_ARES == 1 && defined(GRPC_POSIX_SOCKET_ARES_EV_DRIVER)
}
+ GRPC_EVENT_ENGINE_DNS_TRACE("PosixEventEngine:%p creating NativeDNSResolver",
+ this);
return std::make_unique(
- std::move(*ares_resolver));
-#else // GRPC_ARES == 1 && defined(GRPC_POSIX_SOCKET_TCP)
- // TODO(yijiem): Implement a basic A/AAAA-only native resolver in
- // PosixEventEngine.
- (void)options;
- grpc_core::Crash("unimplemented");
-#endif // GRPC_ARES == 1 && defined(GRPC_POSIX_SOCKET_TCP)
+ grpc_core::MakeOrphanable(shared_from_this()));
+#endif // GRPC_POSIX_SOCKET_RESOLVE_ADDRESS
}
bool PosixEventEngine::IsWorkerThread() { grpc_core::Crash("unimplemented"); }
diff --git a/src/core/lib/event_engine/posix_engine/posix_engine.h b/src/core/lib/event_engine/posix_engine/posix_engine.h
index 50810a53b08..e38479854e0 100644
--- a/src/core/lib/event_engine/posix_engine/posix_engine.h
+++ b/src/core/lib/event_engine/posix_engine/posix_engine.h
@@ -34,11 +34,11 @@
#include
#include
-#include "src/core/lib/event_engine/ares_resolver.h"
#include "src/core/lib/event_engine/handle_containers.h"
#include "src/core/lib/event_engine/posix.h"
#include "src/core/lib/event_engine/posix_engine/event_poller.h"
#include "src/core/lib/event_engine/posix_engine/timer_manager.h"
+#include "src/core/lib/event_engine/ref_counted_dns_resolver_interface.h"
#include "src/core/lib/event_engine/thread_pool/thread_pool.h"
#include "src/core/lib/gprpp/orphanable.h"
#include "src/core/lib/gprpp/sync.h"
@@ -141,11 +141,8 @@ class PosixEventEngine final : public PosixEventEngineWithFdSupport,
public:
class PosixDNSResolver : public EventEngine::DNSResolver {
public:
- PosixDNSResolver() = delete;
-#if GRPC_ARES == 1 && defined(GRPC_POSIX_SOCKET_TCP)
explicit PosixDNSResolver(
- grpc_core::OrphanablePtr ares_resolver);
-#endif // GRPC_ARES == 1 && defined(GRPC_POSIX_SOCKET_TCP)
+ grpc_core::OrphanablePtr dns_resolver);
void LookupHostname(LookupHostnameCallback on_resolve,
absl::string_view name,
absl::string_view default_port) override;
@@ -154,10 +151,8 @@ class PosixEventEngine final : public PosixEventEngineWithFdSupport,
void LookupTXT(LookupTXTCallback on_resolve,
absl::string_view name) override;
-#if GRPC_ARES == 1 && defined(GRPC_POSIX_SOCKET_TCP)
private:
- grpc_core::OrphanablePtr ares_resolver_;
-#endif // GRPC_ARES == 1 && defined(GRPC_POSIX_SOCKET_TCP)
+ grpc_core::OrphanablePtr dns_resolver_;
};
#ifdef GRPC_POSIX_SOCKET_TCP
diff --git a/src/core/lib/event_engine/ref_counted_dns_resolver_interface.h b/src/core/lib/event_engine/ref_counted_dns_resolver_interface.h
new file mode 100644
index 00000000000..645788e9a83
--- /dev/null
+++ b/src/core/lib/event_engine/ref_counted_dns_resolver_interface.h
@@ -0,0 +1,55 @@
+// Copyright 2023 The gRPC Authors.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+#ifndef GRPC_SRC_CORE_LIB_EVENT_ENGINE_REF_COUNTED_DNS_RESOLVER_INTERFACE_H
+#define GRPC_SRC_CORE_LIB_EVENT_ENGINE_REF_COUNTED_DNS_RESOLVER_INTERFACE_H
+
+#include
+
+#include
+
+#include "absl/strings/string_view.h"
+
+#include
+
+#include "src/core/lib/gprpp/orphanable.h"
+
+namespace grpc_event_engine {
+namespace experimental {
+
+class RefCountedDNSResolverInterface
+ : public grpc_core::InternallyRefCounted {
+ public:
+ explicit RefCountedDNSResolverInterface(const char* trace = nullptr,
+ intptr_t initial_refcount = 1)
+ : grpc_core::InternallyRefCounted(
+ trace, initial_refcount) {}
+
+ virtual void LookupHostname(
+ EventEngine::DNSResolver::LookupHostnameCallback on_resolved,
+ absl::string_view name, absl::string_view default_port) = 0;
+
+ virtual void LookupSRV(
+ EventEngine::DNSResolver::LookupSRVCallback on_resolved,
+ absl::string_view name) = 0;
+
+ virtual void LookupTXT(
+ EventEngine::DNSResolver::LookupTXTCallback on_resolved,
+ absl::string_view name) = 0;
+};
+
+} // namespace experimental
+} // namespace grpc_event_engine
+
+#endif // GRPC_SRC_CORE_LIB_EVENT_ENGINE_REF_COUNTED_DNS_RESOLVER_INTERFACE_H
diff --git a/src/core/lib/event_engine/windows/windows_engine.cc b/src/core/lib/event_engine/windows/windows_engine.cc
index 24b5c8898e6..25120267039 100644
--- a/src/core/lib/event_engine/windows/windows_engine.cc
+++ b/src/core/lib/event_engine/windows/windows_engine.cc
@@ -204,17 +204,17 @@ WindowsEventEngine::WindowsDNSResolver::WindowsDNSResolver(
void WindowsEventEngine::WindowsDNSResolver::LookupHostname(
LookupHostnameCallback on_resolve, absl::string_view name,
absl::string_view default_port) {
- ares_resolver_->LookupHostname(name, default_port, std::move(on_resolve));
+ ares_resolver_->LookupHostname(std::move(on_resolve), name, default_port);
}
void WindowsEventEngine::WindowsDNSResolver::LookupSRV(
LookupSRVCallback on_resolve, absl::string_view name) {
- ares_resolver_->LookupSRV(name, std::move(on_resolve));
+ ares_resolver_->LookupSRV(std::move(on_resolve), name);
}
void WindowsEventEngine::WindowsDNSResolver::LookupTXT(
LookupTXTCallback on_resolve, absl::string_view name) {
- ares_resolver_->LookupTXT(name, std::move(on_resolve));
+ ares_resolver_->LookupTXT(std::move(on_resolve), name);
}
#endif // GRPC_ARES == 1 && defined(GRPC_WINDOWS_SOCKET_ARES_EV_DRIVER)
diff --git a/src/python/grpcio/grpc_core_dependencies.py b/src/python/grpcio/grpc_core_dependencies.py
index 1d2fdd5bacc..afbe5ec3ef0 100644
--- a/src/python/grpcio/grpc_core_dependencies.py
+++ b/src/python/grpcio/grpc_core_dependencies.py
@@ -514,6 +514,7 @@ CORE_SOURCE_FILES = [
'src/core/lib/event_engine/posix_engine/event_poller_posix_default.cc',
'src/core/lib/event_engine/posix_engine/internal_errqueue.cc',
'src/core/lib/event_engine/posix_engine/lockfree_event.cc',
+ 'src/core/lib/event_engine/posix_engine/native_dns_resolver.cc',
'src/core/lib/event_engine/posix_engine/posix_endpoint.cc',
'src/core/lib/event_engine/posix_engine/posix_engine.cc',
'src/core/lib/event_engine/posix_engine/posix_engine_listener.cc',
diff --git a/test/core/event_engine/test_suite/BUILD b/test/core/event_engine/test_suite/BUILD
index 63c37eb70ac..7abf2c2bf9b 100644
--- a/test/core/event_engine/test_suite/BUILD
+++ b/test/core/event_engine/test_suite/BUILD
@@ -56,6 +56,24 @@ grpc_cc_test(
],
)
+grpc_cc_test(
+ name = "posix_event_engine_native_dns_test",
+ srcs = ["posix_event_engine_native_dns_test.cc"],
+ tags = [
+ "no_mac",
+ "no_windows",
+ ],
+ uses_event_engine = True,
+ uses_polling = True,
+ deps = [
+ "//:config_vars",
+ "//src/core:posix_event_engine",
+ "//test/core/event_engine:event_engine_test_utils",
+ "//test/core/event_engine/test_suite/posix:oracle_event_engine_posix",
+ "//test/core/event_engine/test_suite/tests:dns",
+ ],
+)
+
grpc_cc_test(
name = "thready_posix_event_engine_test",
srcs = ["thready_posix_event_engine_test.cc"],
diff --git a/test/core/event_engine/test_suite/posix_event_engine_native_dns_test.cc b/test/core/event_engine/test_suite/posix_event_engine_native_dns_test.cc
new file mode 100644
index 00000000000..0f4ff26720b
--- /dev/null
+++ b/test/core/event_engine/test_suite/posix_event_engine_native_dns_test.cc
@@ -0,0 +1,51 @@
+// Copyright 2023 The gRPC Authors
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+#include
+#include
+#include
+
+#include
+
+#include
+
+#include "src/core/lib/config/config_vars.h"
+#include "src/core/lib/event_engine/posix_engine/posix_engine.h"
+#include "test/core/event_engine/test_suite/event_engine_test_framework.h"
+#include "test/core/event_engine/test_suite/posix/oracle_event_engine_posix.h"
+#include "test/core/event_engine/test_suite/tests/dns_test.h"
+#include "test/core/util/test_config.h"
+
+int main(int argc, char** argv) {
+ testing::InitGoogleTest(&argc, argv);
+ grpc::testing::TestEnvironment env(&argc, argv);
+ SetEventEngineFactories(
+ []() {
+ return std::make_unique<
+ grpc_event_engine::experimental::PosixEventEngine>();
+ },
+ []() {
+ return std::make_unique<
+ grpc_event_engine::experimental::PosixOracleEventEngine>();
+ });
+ // TODO(ctiller): EventEngine temporarily needs grpc to be initialized first
+ // until we clear out the iomgr shutdown code.
+ grpc_core::ConfigVars::Overrides overrides;
+ overrides.dns_resolver = "native";
+ grpc_core::ConfigVars::SetOverrides(overrides);
+ grpc_event_engine::experimental::InitDNSTests();
+ grpc_init();
+ int r = RUN_ALL_TESTS();
+ grpc_shutdown();
+ return r;
+}
diff --git a/test/core/event_engine/test_suite/tests/dns_test.cc b/test/core/event_engine/test_suite/tests/dns_test.cc
index 4e585b59a7d..587b7094f97 100644
--- a/test/core/event_engine/test_suite/tests/dns_test.cc
+++ b/test/core/event_engine/test_suite/tests/dns_test.cc
@@ -35,6 +35,7 @@
#include
+#include "src/core/lib/config/config_vars.h"
#include "src/core/lib/event_engine/tcp_socket_utils.h"
#include "src/core/lib/gprpp/crash.h" // IWYU pragma: keep
#include "src/core/lib/gprpp/notification.h"
@@ -96,6 +97,15 @@ MATCHER(StatusCodeEq, "") {
return std::get<0>(arg).code() == std::get<1>(arg);
}
+#define SKIP_TEST_FOR_NATIVE_DNS_RESOLVER() \
+ do { \
+ if (grpc_core::ConfigVars::Get().DnsResolver() == "native") { \
+ GTEST_SKIP() \
+ << "This test specifies a target DNS server which the native " \
+ "DNS resolver does not support."; \
+ } \
+ } while (0)
+
} // namespace
class EventEngineDNSTest : public EventEngineTest {
@@ -227,6 +237,7 @@ EventEngineDNSTest::DNSServer EventEngineDNSTest::dns_server_;
#ifndef GRPC_IOS_EVENT_ENGINE_CLIENT
TEST_F(EventEngineDNSTest, QueryNXHostname) {
+ SKIP_TEST_FOR_NATIVE_DNS_RESOLVER();
auto dns_resolver = CreateDefaultDNSResolver();
dns_resolver->LookupHostname(
[this](auto result) {
@@ -242,6 +253,7 @@ TEST_F(EventEngineDNSTest, QueryNXHostname) {
}
TEST_F(EventEngineDNSTest, QueryWithIPLiteral) {
+ SKIP_TEST_FOR_NATIVE_DNS_RESOLVER();
auto dns_resolver = CreateDefaultDNSResolver();
dns_resolver->LookupHostname(
[this](auto result) {
@@ -257,6 +269,7 @@ TEST_F(EventEngineDNSTest, QueryWithIPLiteral) {
}
TEST_F(EventEngineDNSTest, QueryARecord) {
+ SKIP_TEST_FOR_NATIVE_DNS_RESOLVER();
auto dns_resolver = CreateDefaultDNSResolver();
dns_resolver->LookupHostname(
[this](auto result) {
@@ -274,6 +287,7 @@ TEST_F(EventEngineDNSTest, QueryARecord) {
}
TEST_F(EventEngineDNSTest, QueryAAAARecord) {
+ SKIP_TEST_FOR_NATIVE_DNS_RESOLVER();
auto dns_resolver = CreateDefaultDNSResolver();
dns_resolver->LookupHostname(
[this](auto result) {
@@ -294,6 +308,7 @@ TEST_F(EventEngineDNSTest, QueryAAAARecord) {
}
TEST_F(EventEngineDNSTest, TestAddressSorting) {
+ SKIP_TEST_FOR_NATIVE_DNS_RESOLVER();
auto dns_resolver = CreateDefaultDNSResolver();
dns_resolver->LookupHostname(
[this](auto result) {
@@ -311,6 +326,7 @@ TEST_F(EventEngineDNSTest, TestAddressSorting) {
}
TEST_F(EventEngineDNSTest, QuerySRVRecord) {
+ SKIP_TEST_FOR_NATIVE_DNS_RESOLVER();
const SRVRecord kExpectedRecords[] = {
{/*host=*/"ipv4-only-multi-target.dns-test.event-engine", /*port=*/1234,
/*priority=*/0, /*weight=*/0},
@@ -329,6 +345,7 @@ TEST_F(EventEngineDNSTest, QuerySRVRecord) {
}
TEST_F(EventEngineDNSTest, QuerySRVRecordWithLocalhost) {
+ SKIP_TEST_FOR_NATIVE_DNS_RESOLVER();
auto dns_resolver = CreateDefaultDNSResolver();
dns_resolver->LookupSRV(
[this](auto result) {
@@ -341,6 +358,7 @@ TEST_F(EventEngineDNSTest, QuerySRVRecordWithLocalhost) {
}
TEST_F(EventEngineDNSTest, QueryTXTRecord) {
+ SKIP_TEST_FOR_NATIVE_DNS_RESOLVER();
// clang-format off
const std::string kExpectedRecord =
"grpc_config=[{"
@@ -370,6 +388,7 @@ TEST_F(EventEngineDNSTest, QueryTXTRecord) {
}
TEST_F(EventEngineDNSTest, QueryTXTRecordWithLocalhost) {
+ SKIP_TEST_FOR_NATIVE_DNS_RESOLVER();
auto dns_resolver = CreateDefaultDNSResolver();
dns_resolver->LookupTXT(
[this](auto result) {
@@ -382,6 +401,7 @@ TEST_F(EventEngineDNSTest, QueryTXTRecordWithLocalhost) {
}
TEST_F(EventEngineDNSTest, TestCancelActiveDNSQuery) {
+ SKIP_TEST_FOR_NATIVE_DNS_RESOLVER();
const std::string name = "dont-care-since-wont-be-resolved.test.com:1234";
auto dns_resolver = CreateDNSResolverWithNonResponsiveServer();
dns_resolver->LookupHostname(
diff --git a/tools/doxygen/Doxyfile.c++.internal b/tools/doxygen/Doxyfile.c++.internal
index 03508b982b8..5ff3e2299c9 100644
--- a/tools/doxygen/Doxyfile.c++.internal
+++ b/tools/doxygen/Doxyfile.c++.internal
@@ -2282,6 +2282,8 @@ src/core/lib/event_engine/posix_engine/internal_errqueue.cc \
src/core/lib/event_engine/posix_engine/internal_errqueue.h \
src/core/lib/event_engine/posix_engine/lockfree_event.cc \
src/core/lib/event_engine/posix_engine/lockfree_event.h \
+src/core/lib/event_engine/posix_engine/native_dns_resolver.cc \
+src/core/lib/event_engine/posix_engine/native_dns_resolver.h \
src/core/lib/event_engine/posix_engine/posix_endpoint.cc \
src/core/lib/event_engine/posix_engine/posix_endpoint.h \
src/core/lib/event_engine/posix_engine/posix_engine.cc \
@@ -2308,6 +2310,7 @@ src/core/lib/event_engine/posix_engine/wakeup_fd_pipe.h \
src/core/lib/event_engine/posix_engine/wakeup_fd_posix.h \
src/core/lib/event_engine/posix_engine/wakeup_fd_posix_default.cc \
src/core/lib/event_engine/posix_engine/wakeup_fd_posix_default.h \
+src/core/lib/event_engine/ref_counted_dns_resolver_interface.h \
src/core/lib/event_engine/resolved_address.cc \
src/core/lib/event_engine/resolved_address_internal.h \
src/core/lib/event_engine/shim.cc \
diff --git a/tools/doxygen/Doxyfile.core.internal b/tools/doxygen/Doxyfile.core.internal
index 681c20500de..9ba3a65871f 100644
--- a/tools/doxygen/Doxyfile.core.internal
+++ b/tools/doxygen/Doxyfile.core.internal
@@ -2058,6 +2058,8 @@ src/core/lib/event_engine/posix_engine/internal_errqueue.cc \
src/core/lib/event_engine/posix_engine/internal_errqueue.h \
src/core/lib/event_engine/posix_engine/lockfree_event.cc \
src/core/lib/event_engine/posix_engine/lockfree_event.h \
+src/core/lib/event_engine/posix_engine/native_dns_resolver.cc \
+src/core/lib/event_engine/posix_engine/native_dns_resolver.h \
src/core/lib/event_engine/posix_engine/posix_endpoint.cc \
src/core/lib/event_engine/posix_engine/posix_endpoint.h \
src/core/lib/event_engine/posix_engine/posix_engine.cc \
@@ -2084,6 +2086,7 @@ src/core/lib/event_engine/posix_engine/wakeup_fd_pipe.h \
src/core/lib/event_engine/posix_engine/wakeup_fd_posix.h \
src/core/lib/event_engine/posix_engine/wakeup_fd_posix_default.cc \
src/core/lib/event_engine/posix_engine/wakeup_fd_posix_default.h \
+src/core/lib/event_engine/ref_counted_dns_resolver_interface.h \
src/core/lib/event_engine/resolved_address.cc \
src/core/lib/event_engine/resolved_address_internal.h \
src/core/lib/event_engine/shim.cc \
diff --git a/tools/run_tests/generated/tests.json b/tools/run_tests/generated/tests.json
index d58a72accec..6b2a8024173 100644
--- a/tools/run_tests/generated/tests.json
+++ b/tools/run_tests/generated/tests.json
@@ -6881,6 +6881,26 @@
],
"uses_polling": true
},
+ {
+ "args": [],
+ "benchmark": false,
+ "ci_platforms": [
+ "linux",
+ "posix"
+ ],
+ "cpu_cost": 1.0,
+ "exclude_configs": [],
+ "exclude_iomgrs": [],
+ "flaky": false,
+ "gtest": true,
+ "language": "c++",
+ "name": "posix_event_engine_native_dns_test",
+ "platforms": [
+ "linux",
+ "posix"
+ ],
+ "uses_polling": true
+ },
{
"args": [],
"benchmark": false,