Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions ydb/core/driver_lib/run/kikimr_services_initializers.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -565,6 +565,7 @@ void TBasicServicesInitializer::InitializeServices(NActors::TActorSystemSetup* s
resolverOptions.Type = NDnsResolver::EDnsResolverType::Libc;
break;
}
resolverOptions.AddTrailingDot = nsConfig.GetAddTrailingDot();
IActor *resolver = NDnsResolver::CreateOnDemandDnsResolver(resolverOptions);

setup->LocalServices.emplace_back(
Expand Down
1 change: 1 addition & 0 deletions ydb/core/protos/config.proto
Original file line number Diff line number Diff line change
Expand Up @@ -183,6 +183,7 @@ message TStaticNameserviceConfig {
optional bool KeepSocket = 6 [default = true];
optional bool ForceTcp = 7 [default = false];
optional EDnsResolverType DnsResolverType = 8 [default = ARES];
optional bool AddTrailingDot = 9 [default = false];
}

message TDynamicNameserviceConfig {
Expand Down
9 changes: 9 additions & 0 deletions ydb/library/actors/dnsresolver/dnsresolver.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -130,6 +130,13 @@ namespace NDnsResolver {
std::atomic<size_t> Activations{ 0 };
};

static TString AddTrailingDot(TString&& name, bool addTrailingDot) noexcept {
if (addTrailingDot && !name.empty() && name.back() != '.') {
name += ".";
}
return name;
}

class TAresDnsResolver
: public TActor<TAresDnsResolver>
, private TAresLibraryInitBase
Expand Down Expand Up @@ -290,6 +297,7 @@ namespace NDnsResolver {
memset(&hints, 0, sizeof(hints));
hints.ai_flags = ARES_AI_NOSORT;
hints.ai_family = family;
name = AddTrailingDot(std::move(name), reqCtx->Self->Options.AddTrailingDot);
ares_getaddrinfo(AresChannel, name.c_str(), nullptr, &hints, &TThis::GetAddrInfoAresCallback, reqCtx.Get());
}

Expand Down Expand Up @@ -533,6 +541,7 @@ namespace NDnsResolver {

private:
std::unique_ptr<TEvDns::TEvGetHostByNameResult> GetHostByName(TString name, int family) {
name = AddTrailingDot(std::move(name), Options.AddTrailingDot);
auto result = std::make_unique<TEvDns::TEvGetHostByNameResult>();

struct addrinfo hints, *res;
Expand Down
2 changes: 2 additions & 0 deletions ydb/library/actors/dnsresolver/dnsresolver.h
Original file line number Diff line number Diff line change
Expand Up @@ -100,6 +100,8 @@ namespace NDnsResolver {
bool KeepSocket = true;
// Force tcp to perform dns requests
bool ForceTcp = false;
// Add trailing dot to hostname
bool AddTrailingDot = false;
};

IActor* CreateSimpleDnsResolver(TSimpleDnsResolverOptions options = TSimpleDnsResolverOptions());
Expand Down
76 changes: 41 additions & 35 deletions ydb/library/actors/dnsresolver/dnsresolver_ut.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -29,50 +29,56 @@ Y_UNIT_TEST_SUITE(DnsResolver) {
};

Y_UNIT_TEST(ResolveLocalHost) {
for (auto type : { EDnsResolverType::Ares, EDnsResolverType::Libc }) {
TSimpleDnsResolverOptions options { .Type = type };
TTestActorRuntimeBase runtime;
runtime.Initialize();
auto sender = runtime.AllocateEdgeActor();
auto resolver = runtime.Register(CreateSimpleDnsResolver(options));
runtime.Send(new IEventHandle(resolver, sender, new TEvDns::TEvGetHostByName("localhost", AF_UNSPEC)),
0, true);
auto ev = runtime.GrabEdgeEventRethrow<TEvDns::TEvGetHostByNameResult>(sender);
UNIT_ASSERT_VALUES_EQUAL_C(ev->Get()->Status, 0, ev->Get()->ErrorText);
size_t addrs = ev->Get()->AddrsV4.size() + ev->Get()->AddrsV6.size();
UNIT_ASSERT_C(addrs > 0, "Got " << addrs << " addresses");
for (auto addTrailingDot : { true, false }) {
for (auto type : { EDnsResolverType::Ares, EDnsResolverType::Libc }) {
TSimpleDnsResolverOptions options { .Type = type, .AddTrailingDot = addTrailingDot };
TTestActorRuntimeBase runtime;
runtime.Initialize();
auto sender = runtime.AllocateEdgeActor();
auto resolver = runtime.Register(CreateSimpleDnsResolver(options));
runtime.Send(new IEventHandle(resolver, sender, new TEvDns::TEvGetHostByName("localhost", AF_UNSPEC)),
0, true);
auto ev = runtime.GrabEdgeEventRethrow<TEvDns::TEvGetHostByNameResult>(sender);
UNIT_ASSERT_VALUES_EQUAL_C(ev->Get()->Status, 0, ev->Get()->ErrorText);
size_t addrs = ev->Get()->AddrsV4.size() + ev->Get()->AddrsV6.size();
UNIT_ASSERT_C(addrs > 0, "Got " << addrs << " addresses");
}
}
}

Y_UNIT_TEST(ResolveYandexRu) {
for (auto type : { EDnsResolverType::Ares, EDnsResolverType::Libc }) {
TSimpleDnsResolverOptions options { .Type = type };
TTestActorRuntimeBase runtime;
runtime.Initialize();
auto sender = runtime.AllocateEdgeActor();
auto resolver = runtime.Register(CreateSimpleDnsResolver(options));
runtime.Send(new IEventHandle(resolver, sender, new TEvDns::TEvGetHostByName("yandex.ru", AF_UNSPEC)),
0, true);
auto ev = runtime.GrabEdgeEventRethrow<TEvDns::TEvGetHostByNameResult>(sender);
UNIT_ASSERT_VALUES_EQUAL_C(ev->Get()->Status, 0, ev->Get()->ErrorText);
size_t addrs = ev->Get()->AddrsV4.size() + ev->Get()->AddrsV6.size();
UNIT_ASSERT_C(addrs > 0, "Got " << addrs << " addresses");
for (auto addTrailingDot : { true, false }) {
for (auto type : { EDnsResolverType::Ares, EDnsResolverType::Libc }) {
TSimpleDnsResolverOptions options { .Type = type, .AddTrailingDot = addTrailingDot };
TTestActorRuntimeBase runtime;
runtime.Initialize();
auto sender = runtime.AllocateEdgeActor();
auto resolver = runtime.Register(CreateSimpleDnsResolver(options));
runtime.Send(new IEventHandle(resolver, sender, new TEvDns::TEvGetHostByName("yandex.ru", AF_UNSPEC)),
0, true);
auto ev = runtime.GrabEdgeEventRethrow<TEvDns::TEvGetHostByNameResult>(sender);
UNIT_ASSERT_VALUES_EQUAL_C(ev->Get()->Status, 0, ev->Get()->ErrorText);
size_t addrs = ev->Get()->AddrsV4.size() + ev->Get()->AddrsV6.size();
UNIT_ASSERT_C(addrs > 0, "Got " << addrs << " addresses");
}
}
}

Y_UNIT_TEST(GetAddrYandexRu) {
for (auto type : { EDnsResolverType::Ares, EDnsResolverType::Libc }) {
TSimpleDnsResolverOptions options { .Type = type };
TTestActorRuntimeBase runtime;
runtime.Initialize();
auto sender = runtime.AllocateEdgeActor();
auto resolver = runtime.Register(CreateSimpleDnsResolver(options));
for (auto addTrailingDot : { true, false }) {
for (auto type : { EDnsResolverType::Ares, EDnsResolverType::Libc }) {
TSimpleDnsResolverOptions options { .Type = type, .AddTrailingDot = addTrailingDot };
TTestActorRuntimeBase runtime;
runtime.Initialize();
auto sender = runtime.AllocateEdgeActor();
auto resolver = runtime.Register(CreateSimpleDnsResolver(options));

runtime.Send(new IEventHandle(resolver, sender, new TEvDns::TEvGetAddr("yandex.ru", AF_UNSPEC)),
0, true);
auto ev = runtime.GrabEdgeEventRethrow<TEvDns::TEvGetAddrResult>(sender);
UNIT_ASSERT_VALUES_EQUAL_C(ev->Get()->Status, 0, ev->Get()->ErrorText);
UNIT_ASSERT_C(ev->Get()->IsV4() || ev->Get()->IsV6(), "Expect v4 or v6 address");
runtime.Send(new IEventHandle(resolver, sender, new TEvDns::TEvGetAddr("yandex.ru", AF_UNSPEC)),
0, true);
auto ev = runtime.GrabEdgeEventRethrow<TEvDns::TEvGetAddrResult>(sender);
UNIT_ASSERT_VALUES_EQUAL_C(ev->Get()->Status, 0, ev->Get()->ErrorText);
UNIT_ASSERT_C(ev->Get()->IsV4() || ev->Get()->IsV6(), "Expect v4 or v6 address");
}
}
}

Expand Down
Loading