aboutsummaryrefslogtreecommitdiffstats
path: root/library/cpp/actors/dnsresolver/dnsresolver_ondemand.cpp
diff options
context:
space:
mode:
authorDevtools Arcadia <arcadia-devtools@yandex-team.ru>2022-02-07 18:08:42 +0300
committerDevtools Arcadia <arcadia-devtools@mous.vla.yp-c.yandex.net>2022-02-07 18:08:42 +0300
commit1110808a9d39d4b808aef724c861a2e1a38d2a69 (patch)
treee26c9fed0de5d9873cce7e00bc214573dc2195b7 /library/cpp/actors/dnsresolver/dnsresolver_ondemand.cpp
downloadydb-1110808a9d39d4b808aef724c861a2e1a38d2a69.tar.gz
intermediate changes
ref:cde9a383711a11544ce7e107a78147fb96cc4029
Diffstat (limited to 'library/cpp/actors/dnsresolver/dnsresolver_ondemand.cpp')
-rw-r--r--library/cpp/actors/dnsresolver/dnsresolver_ondemand.cpp64
1 files changed, 64 insertions, 0 deletions
diff --git a/library/cpp/actors/dnsresolver/dnsresolver_ondemand.cpp b/library/cpp/actors/dnsresolver/dnsresolver_ondemand.cpp
new file mode 100644
index 0000000000..2025162e95
--- /dev/null
+++ b/library/cpp/actors/dnsresolver/dnsresolver_ondemand.cpp
@@ -0,0 +1,64 @@
+#include "dnsresolver.h"
+
+#include <library/cpp/actors/core/hfunc.h>
+
+namespace NActors {
+namespace NDnsResolver {
+
+ class TOnDemandDnsResolver : public TActor<TOnDemandDnsResolver> {
+ public:
+ TOnDemandDnsResolver(TOnDemandDnsResolverOptions options)
+ : TActor(&TThis::StateWork)
+ , Options(std::move(options))
+ { }
+
+ static constexpr EActivityType ActorActivityType() {
+ return DNS_RESOLVER;
+ }
+
+ private:
+ STRICT_STFUNC(StateWork, {
+ cFunc(TEvents::TEvPoison::EventType, PassAway);
+ fFunc(TEvDns::TEvGetHostByName::EventType, Forward);
+ fFunc(TEvDns::TEvGetAddr::EventType, Forward);
+ });
+
+ void Forward(STATEFN_SIG) {
+ ev->Rewrite(ev->GetTypeRewrite(), GetUpstream());
+ TActivationContext::Send(std::move(ev));
+ }
+
+ private:
+ TActorId GetUpstream() {
+ if (Y_UNLIKELY(!CachingResolverId)) {
+ if (Y_LIKELY(!SimpleResolverId)) {
+ SimpleResolverId = RegisterWithSameMailbox(CreateSimpleDnsResolver(Options));
+ }
+ CachingResolverId = RegisterWithSameMailbox(CreateCachingDnsResolver(SimpleResolverId, Options));
+ }
+ return CachingResolverId;
+ }
+
+ void PassAway() override {
+ if (CachingResolverId) {
+ Send(CachingResolverId, new TEvents::TEvPoison);
+ CachingResolverId = { };
+ }
+ if (SimpleResolverId) {
+ Send(SimpleResolverId, new TEvents::TEvPoison);
+ SimpleResolverId = { };
+ }
+ }
+
+ private:
+ TOnDemandDnsResolverOptions Options;
+ TActorId SimpleResolverId;
+ TActorId CachingResolverId;
+ };
+
+ IActor* CreateOnDemandDnsResolver(TOnDemandDnsResolverOptions options) {
+ return new TOnDemandDnsResolver(std::move(options));
+ }
+
+} // namespace NDnsResolver
+} // namespace NActors