Skip to content

Commit

Permalink
[EventEngine] Migrate chaotic_good_server to use EE DNSResolver (gr…
Browse files Browse the repository at this point in the history
…pc#38056)

<!--

If you know who should review your pull request, please assign it to that
person, otherwise the pull request would get assigned randomly.

If your pull request is for a specific language, please add the appropriate
lang label.

-->

Closes grpc#38056

COPYBARA_INTEGRATE_REVIEW=grpc#38056 from yijiem:ee-dns-non-client-channel-chaotic 74c3b20
PiperOrigin-RevId: 693112346
  • Loading branch information
yijiem authored and copybara-github committed Nov 4, 2024
1 parent 9049ce0 commit 6c05780
Show file tree
Hide file tree
Showing 2 changed files with 39 additions and 10 deletions.
1 change: 1 addition & 0 deletions src/core/BUILD
Original file line number Diff line number Diff line change
Expand Up @@ -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",
Expand Down
48 changes: 38 additions & 10 deletions src/core/ext/transport/chaotic_good/server/chaotic_good_server.cc
Original file line number Diff line number Diff line change
Expand Up @@ -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"
Expand Down Expand Up @@ -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<std::string()> connection_id_generator)
Expand Down Expand Up @@ -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<std::vector<EventEngine::ResolvedAddress>> results =
std::vector<EventEngine::ResolvedAddress>();
if (grpc_core::IsEventEngineDnsNonClientChannelEnabled()) {
absl::StatusOr<std::unique_ptr<EventEngine::DNSResolver>> ee_resolver =
core_server->channel_args().GetObjectRef<EventEngine>()->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<std::pair<std::string, absl::Status>> 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;
Expand All @@ -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;
Expand Down

0 comments on commit 6c05780

Please sign in to comment.