diff --git a/src/core/BUILD b/src/core/BUILD index ffc7493010a46..be227208df1fd 100644 --- a/src/core/BUILD +++ b/src/core/BUILD @@ -8722,6 +8722,7 @@ grpc_cc_library( "event_engine_extensions", "event_engine_query_extensions", "event_engine_tcp_socket_utils", + "event_engine_utils", "event_engine_wakeup_scheduler", "grpc_promise_endpoint", "if", diff --git a/src/core/ext/transport/chaotic_good/server/chaotic_good_server.cc b/src/core/ext/transport/chaotic_good/server/chaotic_good_server.cc index 650d438dd9ec8..cbb93c7c1aa6f 100644 --- a/src/core/ext/transport/chaotic_good/server/chaotic_good_server.cc +++ b/src/core/ext/transport/chaotic_good/server/chaotic_good_server.cc @@ -44,6 +44,7 @@ #include "src/core/lib/event_engine/query_extensions.h" #include "src/core/lib/event_engine/resolved_address_internal.h" #include "src/core/lib/event_engine/tcp_socket_utils.h" +#include "src/core/lib/event_engine/utils.h" #include "src/core/lib/iomgr/error.h" #include "src/core/lib/iomgr/event_engine_shims/endpoint.h" #include "src/core/lib/promise/activity.h" @@ -77,6 +78,7 @@ const Duration kConnectionDeadline = Duration::Seconds(120); } // namespace using grpc_event_engine::experimental::EventEngine; + ChaoticGoodServerListener::ChaoticGoodServerListener( Server* server, const ChannelArgs& args, absl::AnyInvocable connection_id_generator) @@ -463,27 +465,53 @@ void ChaoticGoodServerListener::Orphan() { } // namespace grpc_core int grpc_server_add_chaotic_good_port(grpc_server* server, const char* addr) { + using grpc_event_engine::experimental::EventEngine; if (grpc_core::IsChaoticGoodLegacyProtocolEnabled()) { return grpc_server_add_chaotic_good_legacy_port(server, addr); } grpc_core::ExecCtx exec_ctx; auto* const core_server = grpc_core::Server::FromC(server); const std::string parsed_addr = grpc_core::URI::PercentDecode(addr); - const auto resolved_or = grpc_core::GetDNSResolver()->LookupHostnameBlocking( - parsed_addr, absl::StrCat(0xd20)); - if (!resolved_or.ok()) { - LOG(ERROR) << "Failed to resolve " << addr << ": " - << resolved_or.status().ToString(); - return 0; + absl::StatusOr> results = + std::vector(); + if (grpc_core::IsEventEngineDnsNonClientChannelEnabled()) { + absl::StatusOr> ee_resolver = + core_server->channel_args().GetObjectRef()->GetDNSResolver( + EventEngine::DNSResolver::ResolverOptions()); + if (!ee_resolver.ok()) { + LOG(ERROR) << "Failed to resolve " << addr << ": " + << ee_resolver.status().ToString(); + return 0; + } + results = grpc_event_engine::experimental::LookupHostnameBlocking( + ee_resolver->get(), parsed_addr, absl::StrCat(0xd20)); + if (!results.ok()) { + LOG(ERROR) << "Failed to resolve " << addr << ": " + << results.status().ToString(); + return 0; + } + } else { + // TODO(yijiem): Remove this after event_engine_dns_non_client_channel + // is fully enabled. + const auto resolved_or = + grpc_core::GetDNSResolver()->LookupHostnameBlocking( + parsed_addr, absl::StrCat(0xd20)); + if (!resolved_or.ok()) { + LOG(ERROR) << "Failed to resolve " << addr << ": " + << resolved_or.status().ToString(); + return 0; + } + for (const auto& addr : *resolved_or) { + results->push_back( + grpc_event_engine::experimental::CreateResolvedAddress(addr)); + } } int port_num = 0; std::vector> error_list; - for (const auto& resolved_addr : resolved_or.value()) { + for (const auto& ee_addr : results.value()) { auto listener = grpc_core::MakeOrphanable< grpc_core::chaotic_good::ChaoticGoodServerListener>( core_server, core_server->channel_args()); - const auto ee_addr = - grpc_event_engine::experimental::CreateResolvedAddress(resolved_addr); std::string addr_str = *grpc_event_engine::experimental::ResolvedAddressToString(ee_addr); GRPC_TRACE_LOG(chaotic_good, INFO) << "BIND: " << addr_str; @@ -500,7 +528,7 @@ int grpc_server_add_chaotic_good_port(grpc_server* server, const char* addr) { } core_server->AddListener(std::move(listener)); } - if (error_list.size() == resolved_or->size()) { + if (error_list.size() == results->size()) { LOG(ERROR) << "Failed to bind any address for " << addr; for (const auto& error : error_list) { LOG(ERROR) << " " << error.first << ": " << error.second;