diff options
author | arcadia-devtools <arcadia-devtools@yandex-team.ru> | 2022-06-24 01:21:07 +0300 |
---|---|---|
committer | arcadia-devtools <arcadia-devtools@yandex-team.ru> | 2022-06-24 01:21:07 +0300 |
commit | fd274bd81aff99a065469b0c1a0f581b1d401c79 (patch) | |
tree | 7e80c91d285bce4bacb1481af0ac0373b6f49a6e | |
parent | 8e70cf7ba03c80199a9b9274694c4cd9e5e3c6e4 (diff) | |
download | ydb-fd274bd81aff99a065469b0c1a0f581b1d401c79.tar.gz |
intermediate changes
ref:1b6eb261e6f9c6cc64e7c70a1bbcb4cae09724e1
-rw-r--r-- | library/cpp/actors/dnsresolver/dnsresolver.cpp | 57 | ||||
-rw-r--r-- | library/cpp/actors/interconnect/interconnect_handshake.cpp | 1 |
2 files changed, 34 insertions, 24 deletions
diff --git a/library/cpp/actors/dnsresolver/dnsresolver.cpp b/library/cpp/actors/dnsresolver/dnsresolver.cpp index 6329bb0083..abd90182e1 100644 --- a/library/cpp/actors/dnsresolver/dnsresolver.cpp +++ b/library/cpp/actors/dnsresolver/dnsresolver.cpp @@ -264,7 +264,7 @@ namespace NDnsResolver { auto reqCtx = MakeIntrusive<TRequestContext>( this, TActivationContext::ActorSystem(), SelfId(), ev->Sender, ev->Cookie, ERequestType::GetHostByName); PushCallback([this, reqCtx = std::move(reqCtx), name = std::move(msg->Name), family = msg->Family] () mutable { - StartGetHostByName(std::move(reqCtx), std::move(name), family); + StartGetAddrInfo(std::move(reqCtx), std::move(name), family); }); } @@ -273,18 +273,28 @@ namespace NDnsResolver { auto reqCtx = MakeIntrusive<TRequestContext>( this, TActivationContext::ActorSystem(), SelfId(), ev->Sender, ev->Cookie, ERequestType::GetAddr); PushCallback([this, reqCtx = std::move(reqCtx), name = std::move(msg->Name), family = msg->Family] () mutable { - StartGetHostByName(std::move(reqCtx), std::move(name), family); + StartGetAddrInfo(std::move(reqCtx), std::move(name), family); }); } - void StartGetHostByName(TRequestContext::TPtr reqCtx, TString name, int family) noexcept { + void StartGetAddrInfo(TRequestContext::TPtr reqCtx, TString name, int family) noexcept { reqCtx->Ref(); - ares_gethostbyname(AresChannel, name.c_str(), family, - &TThis::GetHostByNameAresCallback, reqCtx.Get()); + ares_addrinfo_hints hints; + memset(&hints, 0, sizeof(hints)); + hints.ai_flags = ARES_AI_NOSORT; + hints.ai_family = family; + ares_getaddrinfo(AresChannel, name.c_str(), nullptr, &hints, &TThis::GetAddrInfoAresCallback, reqCtx.Get()); } private: - static void GetHostByNameAresCallback(void* arg, int status, int timeouts, struct hostent* info) { + static void GetAddrInfoAresCallback(void* arg, int status, int timeouts, ares_addrinfo *result) { + struct TDeleter { + void operator ()(ares_addrinfo *ptr) const { + ares_freeaddrinfo(ptr); + } + }; + std::unique_ptr<ares_addrinfo, TDeleter> ptr(result); + Y_UNUSED(timeouts); TRequestContext::TPtr reqCtx(static_cast<TRequestContext*>(arg)); reqCtx->UnRef(); @@ -297,22 +307,20 @@ namespace NDnsResolver { switch (reqCtx->Type) { case ERequestType::GetHostByName: { auto result = MakeHolder<TEvDns::TEvGetHostByNameResult>(); - if (status == 0) { - switch (info->h_addrtype) { - case AF_INET: { - for (int i = 0; info->h_addr_list[i] != nullptr; ++i) { - result->AddrsV4.emplace_back(*(struct in_addr*)(info->h_addr_list[i])); + if (status == ARES_SUCCESS) { + for (auto *node = ptr->nodes; node; node = node->ai_next) { + switch (node->ai_family) { + case AF_INET: { + result->AddrsV4.emplace_back(((sockaddr_in*)node->ai_addr)->sin_addr); + break; } - break; - } - case AF_INET6: { - for (int i = 0; info->h_addr_list[i] != nullptr; ++i) { - result->AddrsV6.emplace_back(*(struct in6_addr*)(info->h_addr_list[i])); + case AF_INET6: { + result->AddrsV6.emplace_back(((sockaddr_in6*)node->ai_addr)->sin6_addr); + break; } - break; + default: + Y_FAIL("unknown address family in ares callback"); } - default: - Y_FAIL("unknown address family in ares callback"); } } else { result->ErrorText = ares_strerror(status); @@ -325,17 +333,18 @@ namespace NDnsResolver { case ERequestType::GetAddr: { auto result = MakeHolder<TEvDns::TEvGetAddrResult>(); - if (status == 0 && Y_UNLIKELY(info->h_addr_list[0] == nullptr)) { + if (status == ARES_SUCCESS && Y_UNLIKELY(ptr->nodes == nullptr)) { status = ARES_ENODATA; } - if (status == 0) { - switch (info->h_addrtype) { + if (status == ARES_SUCCESS) { + auto *node = ptr->nodes; + switch (node->ai_family) { case AF_INET: { - result->Addr = *(struct in_addr*)(info->h_addr_list[0]); + result->Addr = ((sockaddr_in*)node->ai_addr)->sin_addr; break; } case AF_INET6: { - result->Addr = *(struct in6_addr*)(info->h_addr_list[0]); + result->Addr = ((sockaddr_in6*)node->ai_addr)->sin6_addr; break; } default: diff --git a/library/cpp/actors/interconnect/interconnect_handshake.cpp b/library/cpp/actors/interconnect/interconnect_handshake.cpp index 116ccc2724..aaa8440d72 100644 --- a/library/cpp/actors/interconnect/interconnect_handshake.cpp +++ b/library/cpp/actors/interconnect/interconnect_handshake.cpp @@ -861,6 +861,7 @@ namespace NActors { int err = 0; Socket = NInterconnect::TStreamSocket::Make(address.GetFamily(), &err); if (err == EAFNOSUPPORT) { + Socket.Reset(); continue; } else if (*Socket == -1) { Fail(TEvHandshakeFail::HANDSHAKE_FAIL_PERMANENT, "System error: failed to create socket"); |