From d6474dc83d55dbafc8eb113738d2626cc1a375c3 Mon Sep 17 00:00:00 2001 From: levlam Date: Tue, 5 Feb 2019 01:32:37 +0300 Subject: [PATCH] Lazy GetHostByNameActor creation. GitOrigin-RevId: 423a126e40a77d47cfa8d16889729f3102194724 --- td/telegram/net/ConnectionCreator.cpp | 31 +++++++++++++++++---------- td/telegram/net/ConnectionCreator.h | 2 +- 2 files changed, 21 insertions(+), 12 deletions(-) diff --git a/td/telegram/net/ConnectionCreator.cpp b/td/telegram/net/ConnectionCreator.cpp index 99d0fb00..7c1d31f3 100644 --- a/td/telegram/net/ConnectionCreator.cpp +++ b/td/telegram/net/ConnectionCreator.cpp @@ -457,10 +457,27 @@ void ConnectionCreator::get_proxy_link(int32 proxy_id, Promise promise) promise.set_value(std::move(url)); } -ActorId ConnectionCreator::get_resolver() const { +ActorId ConnectionCreator::get_dns_resolver() { if (G()->shared_config().get_option_boolean("expect_blocking", true)) { + if (block_get_host_by_name_actor_.empty()) { + VLOG(connections) << "Init block bypass DNS resolver"; + GetHostByNameActor::Options options; + options.scheduler_id = G()->get_gc_scheduler_id(); + options.resolver_types = {GetHostByNameActor::ResolverType::Google, GetHostByNameActor::ResolverType::Native}; + options.ok_timeout = 60; + options.error_timeout = 0; + block_get_host_by_name_actor_ = create_actor("BlockDnsResolverActor", std::move(options)); + } return block_get_host_by_name_actor_.get(); } else { + if (get_host_by_name_actor_.empty()) { + VLOG(connections) << "Init DNS resolver"; + GetHostByNameActor::Options options; + options.scheduler_id = G()->get_gc_scheduler_id(); + options.ok_timeout = 5 * 60 - 1; + options.error_timeout = 0; + get_host_by_name_actor_ = create_actor("DnsResolverActor", std::move(options)); + } return get_host_by_name_actor_.get(); } } @@ -515,7 +532,7 @@ void ConnectionCreator::ping_proxy(int32 proxy_id, Promise promise) { } const Proxy &proxy = it->second; bool prefer_ipv6 = G()->shared_config().get_option_boolean("prefer_ipv6"); - send_closure(get_resolver(), &GetHostByNameActor::run, proxy.server().str(), proxy.port(), prefer_ipv6, + send_closure(get_dns_resolver(), &GetHostByNameActor::run, proxy.server().str(), proxy.port(), prefer_ipv6, PromiseCreator::lambda([actor_id = actor_id(this), promise = std::move(promise), proxy_id](Result result) mutable { if (result.is_error()) { @@ -1249,14 +1266,6 @@ void ConnectionCreator::start_up() { on_proxy_changed(true); } - GetHostByNameActor::Options options; - options.scheduler_id = G()->get_gc_scheduler_id(); - options.ok_timeout = 5 * 60 - 1; - options.error_timeout = 0; - get_host_by_name_actor_ = create_actor("GetHostByNameActor", options); - options.resolver_types = {GetHostByNameActor::ResolverType::Google, GetHostByNameActor::ResolverType::Native}; - block_get_host_by_name_actor_ = create_actor("GetHostByNameActor", options); - ref_cnt_guard_ = create_reference(-1); is_inited_ = true; @@ -1382,7 +1391,7 @@ void ConnectionCreator::loop() { bool prefer_ipv6 = G()->shared_config().get_option_boolean("prefer_ipv6"); VLOG(connections) << "Resolve IP address " << resolve_proxy_query_token_ << " of " << proxy.server(); send_closure( - get_resolver(), &GetHostByNameActor::run, proxy.server().str(), proxy.port(), prefer_ipv6, + get_dns_resolver(), &GetHostByNameActor::run, proxy.server().str(), proxy.port(), prefer_ipv6, PromiseCreator::lambda([actor_id = create_reference(resolve_proxy_query_token_)](Result result) { send_closure(std::move(actor_id), &ConnectionCreator::on_proxy_resolved, std::move(result), false); })); diff --git a/td/telegram/net/ConnectionCreator.h b/td/telegram/net/ConnectionCreator.h index e9cc76e5..41cafe4a 100644 --- a/td/telegram/net/ConnectionCreator.h +++ b/td/telegram/net/ConnectionCreator.h @@ -323,7 +323,7 @@ class ConnectionCreator : public NetQueryCallback { Result find_connection(const ProxyInfo &proxy, DcId dc_id, bool allow_media_only, FindConnectionExtra &extra); - ActorId get_resolver() const; + ActorId get_dns_resolver(); void ping_proxy_resolved(int32 proxy_id, IPAddress ip_address, Promise promise);