From 2c4678a1e307920abb762d109ccb3b2b6d69dcc4 Mon Sep 17 00:00:00 2001 From: levlam Date: Thu, 19 Apr 2018 20:21:26 +0300 Subject: [PATCH] Send NetQuery to callback when closing. GitOrigin-RevId: 6e564fd9401ae4352471d2938058d02e54c73f05 --- td/telegram/ConfigManager.cpp | 8 ++++--- td/telegram/net/NetQuery.cpp | 2 ++ td/telegram/net/NetQuery.h | 2 ++ td/telegram/net/NetQueryDelayer.cpp | 2 ++ td/telegram/net/NetQueryDelayer.h | 2 ++ td/telegram/net/NetQueryDispatcher.cpp | 29 +++++++++++++------------- td/telegram/net/NetQueryDispatcher.h | 4 ++++ 7 files changed, 31 insertions(+), 18 deletions(-) diff --git a/td/telegram/ConfigManager.cpp b/td/telegram/ConfigManager.cpp index e73fc345..34658d91 100644 --- a/td/telegram/ConfigManager.cpp +++ b/td/telegram/ConfigManager.cpp @@ -616,9 +616,11 @@ void ConfigManager::on_result(NetQueryPtr res) { config_sent_cnt_--; auto r_config = fetch_result(std::move(res)); if (r_config.is_error()) { - LOG(ERROR) << "TODO: getConfig failed: " << r_config.error(); - expire_ = Timestamp::in(60.0); // try again in a minute - set_timeout_in(expire_.in()); + if (!G()->close_flag()) { + LOG(ERROR) << "TODO: getConfig failed: " << r_config.error(); + expire_ = Timestamp::in(60.0); // try again in a minute + set_timeout_in(expire_.in()); + } } else { on_dc_options_update(DcOptions()); process_config(r_config.move_as_ok()); diff --git a/td/telegram/net/NetQuery.cpp b/td/telegram/net/NetQuery.cpp index 8cda0bcc..3fdb3c18 100644 --- a/td/telegram/net/NetQuery.cpp +++ b/td/telegram/net/NetQuery.cpp @@ -21,12 +21,14 @@ void NetQuery::on_net_write(size_t size) { } G()->get_net_stats_file_callbacks().at(file_type_)->on_write(size); } + void NetQuery::on_net_read(size_t size) { if (file_type_ == -1) { return; } G()->get_net_stats_file_callbacks().at(file_type_)->on_read(size); } + int32 NetQuery::tl_magic(const BufferSlice &buffer_slice) { auto slice = buffer_slice.as_slice(); if (slice.size() < 4) { diff --git a/td/telegram/net/NetQuery.h b/td/telegram/net/NetQuery.h index 003ac516..ba19d8e7 100644 --- a/td/telegram/net/NetQuery.h +++ b/td/telegram/net/NetQuery.h @@ -244,9 +244,11 @@ class NetQuery : public ListNode { debug_cnt_++; VLOG(net_query) << *this << " " << tag("debug", debug_str_); } + void set_callback(ActorShared callback) { callback_ = std::move(callback); } + ActorShared move_callback() { return std::move(callback_); } diff --git a/td/telegram/net/NetQueryDelayer.cpp b/td/telegram/net/NetQueryDelayer.cpp index 0950b19f..76e16969 100644 --- a/td/telegram/net/NetQueryDelayer.cpp +++ b/td/telegram/net/NetQueryDelayer.cpp @@ -16,6 +16,7 @@ #include "td/utils/Status.h" namespace td { + void NetQueryDelayer::delay(NetQueryPtr query) { query->debug("try delay"); query->is_ready(); @@ -116,4 +117,5 @@ void NetQueryDelayer::tear_down() { G()->net_query_dispatcher().dispatch(std::move(query_slot.query_)); }); } + } // namespace td diff --git a/td/telegram/net/NetQueryDelayer.h b/td/telegram/net/NetQueryDelayer.h index 50834340..322fe144 100644 --- a/td/telegram/net/NetQueryDelayer.h +++ b/td/telegram/net/NetQueryDelayer.h @@ -13,6 +13,7 @@ #include "td/utils/Container.h" namespace td { + class NetQueryDelayer : public Actor { public: explicit NetQueryDelayer(ActorShared<> parent) : parent_(std::move(parent)) { @@ -32,4 +33,5 @@ class NetQueryDelayer : public Actor { void tear_down() override; }; + } // namespace td diff --git a/td/telegram/net/NetQueryDispatcher.cpp b/td/telegram/net/NetQueryDispatcher.cpp index 9eb0571a..1c822e9f 100644 --- a/td/telegram/net/NetQueryDispatcher.cpp +++ b/td/telegram/net/NetQueryDispatcher.cpp @@ -26,16 +26,23 @@ #include "td/utils/Slice.h" namespace td { + +void NetQueryDispatcher::complete_net_query(NetQueryPtr net_query) { + auto callback = net_query->move_callback(); + if (callback.empty()) { + net_query->debug("sent to td (no callback)"); + send_closure(G()->td(), &NetQueryCallback::on_result, std::move(net_query)); + } else { + net_query->debug("sent to callback", true); + send_closure(std::move(callback), &NetQueryCallback::on_result, std::move(net_query)); + } +} + void NetQueryDispatcher::dispatch(NetQueryPtr net_query) { net_query->debug("dispatch"); if (stop_flag_.load(std::memory_order_relaxed)) { - // Set error to avoid warning - // No need to send result somewhere, it probably will be ignored anyway net_query->set_error(Status::Error(500, "Internal Server Error: closing")); - net_query->clear(); - net_query.reset(); - // G()->net_query_creator().release(std::move(net_query)); - return; + return complete_net_query(std::move(net_query)); } if (net_query->is_ready()) { @@ -67,15 +74,7 @@ void NetQueryDispatcher::dispatch(NetQueryPtr net_query) { } if (net_query->is_ready()) { - auto callback = net_query->move_callback(); - if (callback.empty()) { - net_query->debug("sent to td (no callback)"); - send_closure(G()->td(), &NetQueryCallback::on_result, std::move(net_query)); - } else { - net_query->debug("sent to callback", true); - send_closure(std::move(callback), &NetQueryCallback::on_result, std::move(net_query)); - } - return; + return complete_net_query(std::move(net_query)); } if (net_query->dispatch_ttl > 0) { diff --git a/td/telegram/net/NetQueryDispatcher.h b/td/telegram/net/NetQueryDispatcher.h index 461c8b5b..f47b06b2 100644 --- a/td/telegram/net/NetQueryDispatcher.h +++ b/td/telegram/net/NetQueryDispatcher.h @@ -30,6 +30,7 @@ class PublicRsaKeyWatchdog; } // namespace td namespace td { + // Not just dispatcher. class NetQueryDispatcher { public: @@ -83,6 +84,9 @@ class NetQueryDispatcher { static int32 get_session_count(); static bool get_use_pfs(); + static void complete_net_query(NetQueryPtr net_query); + void try_fix_migrate(NetQueryPtr &net_query); }; + } // namespace td