dnsresolver_ondemand.cpp 2.0 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364
  1. #include "dnsresolver.h"
  2. #include <library/cpp/actors/core/hfunc.h>
  3. namespace NActors {
  4. namespace NDnsResolver {
  5. class TOnDemandDnsResolver : public TActor<TOnDemandDnsResolver> {
  6. public:
  7. TOnDemandDnsResolver(TOnDemandDnsResolverOptions options)
  8. : TActor(&TThis::StateWork)
  9. , Options(std::move(options))
  10. { }
  11. static constexpr EActivityType ActorActivityType() {
  12. return DNS_RESOLVER;
  13. }
  14. private:
  15. STRICT_STFUNC(StateWork, {
  16. cFunc(TEvents::TEvPoison::EventType, PassAway);
  17. fFunc(TEvDns::TEvGetHostByName::EventType, Forward);
  18. fFunc(TEvDns::TEvGetAddr::EventType, Forward);
  19. });
  20. void Forward(STATEFN_SIG) {
  21. ev->Rewrite(ev->GetTypeRewrite(), GetUpstream());
  22. TActivationContext::Send(std::move(ev));
  23. }
  24. private:
  25. TActorId GetUpstream() {
  26. if (Y_UNLIKELY(!CachingResolverId)) {
  27. if (Y_LIKELY(!SimpleResolverId)) {
  28. SimpleResolverId = RegisterWithSameMailbox(CreateSimpleDnsResolver(Options));
  29. }
  30. CachingResolverId = RegisterWithSameMailbox(CreateCachingDnsResolver(SimpleResolverId, Options));
  31. }
  32. return CachingResolverId;
  33. }
  34. void PassAway() override {
  35. if (CachingResolverId) {
  36. Send(CachingResolverId, new TEvents::TEvPoison);
  37. CachingResolverId = { };
  38. }
  39. if (SimpleResolverId) {
  40. Send(SimpleResolverId, new TEvents::TEvPoison);
  41. SimpleResolverId = { };
  42. }
  43. }
  44. private:
  45. TOnDemandDnsResolverOptions Options;
  46. TActorId SimpleResolverId;
  47. TActorId CachingResolverId;
  48. };
  49. IActor* CreateOnDemandDnsResolver(TOnDemandDnsResolverOptions options) {
  50. return new TOnDemandDnsResolver(std::move(options));
  51. }
  52. } // namespace NDnsResolver
  53. } // namespace NActors