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,