Skip to content

Commit 0004636

Browse files
authored
EXT-1634: DnsResolver Add trailing dot option (#27774)
1 parent 1787dd7 commit 0004636

File tree

5 files changed

+54
-35
lines changed

5 files changed

+54
-35
lines changed

ydb/core/driver_lib/run/kikimr_services_initializers.cpp

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -572,6 +572,7 @@ void TBasicServicesInitializer::InitializeServices(NActors::TActorSystemSetup* s
572572
resolverOptions.Type = NDnsResolver::EDnsResolverType::Libc;
573573
break;
574574
}
575+
resolverOptions.AddTrailingDot = nsConfig.GetAddTrailingDot();
575576
IActor *resolver = NDnsResolver::CreateOnDemandDnsResolver(resolverOptions);
576577

577578
setup->LocalServices.emplace_back(

ydb/core/protos/config.proto

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -183,6 +183,7 @@ message TStaticNameserviceConfig {
183183
optional bool KeepSocket = 6 [default = true];
184184
optional bool ForceTcp = 7 [default = false];
185185
optional EDnsResolverType DnsResolverType = 8 [default = ARES];
186+
optional bool AddTrailingDot = 9 [default = false];
186187
}
187188

188189
message TDynamicNameserviceConfig {

ydb/library/actors/dnsresolver/dnsresolver.cpp

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -130,6 +130,13 @@ namespace NDnsResolver {
130130
std::atomic<size_t> Activations{ 0 };
131131
};
132132

133+
static TString AddTrailingDot(TString&& name, bool addTrailingDot) noexcept {
134+
if (addTrailingDot && !name.empty() && name.back() != '.') {
135+
name += ".";
136+
}
137+
return name;
138+
}
139+
133140
class TAresDnsResolver
134141
: public TActor<TAresDnsResolver>
135142
, private TAresLibraryInitBase
@@ -290,6 +297,7 @@ namespace NDnsResolver {
290297
memset(&hints, 0, sizeof(hints));
291298
hints.ai_flags = ARES_AI_NOSORT;
292299
hints.ai_family = family;
300+
name = AddTrailingDot(std::move(name), reqCtx->Self->Options.AddTrailingDot);
293301
ares_getaddrinfo(AresChannel, name.c_str(), nullptr, &hints, &TThis::GetAddrInfoAresCallback, reqCtx.Get());
294302
}
295303

@@ -533,6 +541,7 @@ namespace NDnsResolver {
533541

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

538547
struct addrinfo hints, *res;

ydb/library/actors/dnsresolver/dnsresolver.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -100,6 +100,8 @@ namespace NDnsResolver {
100100
bool KeepSocket = true;
101101
// Force tcp to perform dns requests
102102
bool ForceTcp = false;
103+
// Add trailing dot to hostname
104+
bool AddTrailingDot = false;
103105
};
104106

105107
IActor* CreateSimpleDnsResolver(TSimpleDnsResolverOptions options = TSimpleDnsResolverOptions());

ydb/library/actors/dnsresolver/dnsresolver_ut.cpp

Lines changed: 41 additions & 35 deletions
Original file line numberDiff line numberDiff line change
@@ -29,50 +29,56 @@ Y_UNIT_TEST_SUITE(DnsResolver) {
2929
};
3030

3131
Y_UNIT_TEST(ResolveLocalHost) {
32-
for (auto type : { EDnsResolverType::Ares, EDnsResolverType::Libc }) {
33-
TSimpleDnsResolverOptions options { .Type = type };
34-
TTestActorRuntimeBase runtime;
35-
runtime.Initialize();
36-
auto sender = runtime.AllocateEdgeActor();
37-
auto resolver = runtime.Register(CreateSimpleDnsResolver(options));
38-
runtime.Send(new IEventHandle(resolver, sender, new TEvDns::TEvGetHostByName("localhost", AF_UNSPEC)),
39-
0, true);
40-
auto ev = runtime.GrabEdgeEventRethrow<TEvDns::TEvGetHostByNameResult>(sender);
41-
UNIT_ASSERT_VALUES_EQUAL_C(ev->Get()->Status, 0, ev->Get()->ErrorText);
42-
size_t addrs = ev->Get()->AddrsV4.size() + ev->Get()->AddrsV6.size();
43-
UNIT_ASSERT_C(addrs > 0, "Got " << addrs << " addresses");
32+
for (auto addTrailingDot : { true, false }) {
33+
for (auto type : { EDnsResolverType::Ares, EDnsResolverType::Libc }) {
34+
TSimpleDnsResolverOptions options { .Type = type, .AddTrailingDot = addTrailingDot };
35+
TTestActorRuntimeBase runtime;
36+
runtime.Initialize();
37+
auto sender = runtime.AllocateEdgeActor();
38+
auto resolver = runtime.Register(CreateSimpleDnsResolver(options));
39+
runtime.Send(new IEventHandle(resolver, sender, new TEvDns::TEvGetHostByName("localhost", AF_UNSPEC)),
40+
0, true);
41+
auto ev = runtime.GrabEdgeEventRethrow<TEvDns::TEvGetHostByNameResult>(sender);
42+
UNIT_ASSERT_VALUES_EQUAL_C(ev->Get()->Status, 0, ev->Get()->ErrorText);
43+
size_t addrs = ev->Get()->AddrsV4.size() + ev->Get()->AddrsV6.size();
44+
UNIT_ASSERT_C(addrs > 0, "Got " << addrs << " addresses");
45+
}
4446
}
4547
}
4648

4749
Y_UNIT_TEST(ResolveYandexRu) {
48-
for (auto type : { EDnsResolverType::Ares, EDnsResolverType::Libc }) {
49-
TSimpleDnsResolverOptions options { .Type = type };
50-
TTestActorRuntimeBase runtime;
51-
runtime.Initialize();
52-
auto sender = runtime.AllocateEdgeActor();
53-
auto resolver = runtime.Register(CreateSimpleDnsResolver(options));
54-
runtime.Send(new IEventHandle(resolver, sender, new TEvDns::TEvGetHostByName("yandex.ru", AF_UNSPEC)),
55-
0, true);
56-
auto ev = runtime.GrabEdgeEventRethrow<TEvDns::TEvGetHostByNameResult>(sender);
57-
UNIT_ASSERT_VALUES_EQUAL_C(ev->Get()->Status, 0, ev->Get()->ErrorText);
58-
size_t addrs = ev->Get()->AddrsV4.size() + ev->Get()->AddrsV6.size();
59-
UNIT_ASSERT_C(addrs > 0, "Got " << addrs << " addresses");
50+
for (auto addTrailingDot : { true, false }) {
51+
for (auto type : { EDnsResolverType::Ares, EDnsResolverType::Libc }) {
52+
TSimpleDnsResolverOptions options { .Type = type, .AddTrailingDot = addTrailingDot };
53+
TTestActorRuntimeBase runtime;
54+
runtime.Initialize();
55+
auto sender = runtime.AllocateEdgeActor();
56+
auto resolver = runtime.Register(CreateSimpleDnsResolver(options));
57+
runtime.Send(new IEventHandle(resolver, sender, new TEvDns::TEvGetHostByName("yandex.ru", AF_UNSPEC)),
58+
0, true);
59+
auto ev = runtime.GrabEdgeEventRethrow<TEvDns::TEvGetHostByNameResult>(sender);
60+
UNIT_ASSERT_VALUES_EQUAL_C(ev->Get()->Status, 0, ev->Get()->ErrorText);
61+
size_t addrs = ev->Get()->AddrsV4.size() + ev->Get()->AddrsV6.size();
62+
UNIT_ASSERT_C(addrs > 0, "Got " << addrs << " addresses");
63+
}
6064
}
6165
}
6266

6367
Y_UNIT_TEST(GetAddrYandexRu) {
64-
for (auto type : { EDnsResolverType::Ares, EDnsResolverType::Libc }) {
65-
TSimpleDnsResolverOptions options { .Type = type };
66-
TTestActorRuntimeBase runtime;
67-
runtime.Initialize();
68-
auto sender = runtime.AllocateEdgeActor();
69-
auto resolver = runtime.Register(CreateSimpleDnsResolver(options));
68+
for (auto addTrailingDot : { true, false }) {
69+
for (auto type : { EDnsResolverType::Ares, EDnsResolverType::Libc }) {
70+
TSimpleDnsResolverOptions options { .Type = type, .AddTrailingDot = addTrailingDot };
71+
TTestActorRuntimeBase runtime;
72+
runtime.Initialize();
73+
auto sender = runtime.AllocateEdgeActor();
74+
auto resolver = runtime.Register(CreateSimpleDnsResolver(options));
7075

71-
runtime.Send(new IEventHandle(resolver, sender, new TEvDns::TEvGetAddr("yandex.ru", AF_UNSPEC)),
72-
0, true);
73-
auto ev = runtime.GrabEdgeEventRethrow<TEvDns::TEvGetAddrResult>(sender);
74-
UNIT_ASSERT_VALUES_EQUAL_C(ev->Get()->Status, 0, ev->Get()->ErrorText);
75-
UNIT_ASSERT_C(ev->Get()->IsV4() || ev->Get()->IsV6(), "Expect v4 or v6 address");
76+
runtime.Send(new IEventHandle(resolver, sender, new TEvDns::TEvGetAddr("yandex.ru", AF_UNSPEC)),
77+
0, true);
78+
auto ev = runtime.GrabEdgeEventRethrow<TEvDns::TEvGetAddrResult>(sender);
79+
UNIT_ASSERT_VALUES_EQUAL_C(ev->Get()->Status, 0, ev->Get()->ErrorText);
80+
UNIT_ASSERT_C(ev->Get()->IsV4() || ev->Get()->IsV6(), "Expect v4 or v6 address");
81+
}
7682
}
7783
}
7884

0 commit comments

Comments
 (0)