From b34955e7a9f3e863826ece5605564176bc882ad1 Mon Sep 17 00:00:00 2001 From: levlam Date: Thu, 27 Apr 2023 20:21:30 +0300 Subject: [PATCH] Use separate request to confirm PTS and QTS. --- td/telegram/UpdatesManager.cpp | 53 +++++++++++++++++++++++++++------- td/telegram/UpdatesManager.h | 2 ++ 2 files changed, 44 insertions(+), 11 deletions(-) diff --git a/td/telegram/UpdatesManager.cpp b/td/telegram/UpdatesManager.cpp index 516806dc9..eadea0067 100644 --- a/td/telegram/UpdatesManager.cpp +++ b/td/telegram/UpdatesManager.cpp @@ -176,7 +176,32 @@ class GetDifferenceQuery final : public Td::ResultHandler { } void on_error(Status status) final { - promise_.set_error(std::move(status)); + if (!G()->is_expected_error(status)) { + promise_.set_error(std::move(status)); + } + } +}; + +class ConfirmPtsQtsQuery final : public Td::ResultHandler { + public: + void send(int32 pts, int32 qts) { + int32 flags = + telegram_api::updates_getDifference::PTS_LIMIT_MASK | telegram_api::updates_getDifference::QTS_LIMIT_MASK; + send_query(G()->net_query_creator().create( + telegram_api::updates_getDifference(flags, pts, 1, 0, std::numeric_limits::max(), qts, 1))); + } + + void on_result(BufferSlice packet) final { + auto result_ptr = fetch_result(packet); + if (result_ptr.is_error()) { + return on_error(result_ptr.move_as_error()); + } + } + + void on_error(Status status) final { + if (!G()->is_expected_error(status)) { + LOG(ERROR) << "Failed to confirm PTS/QTS: " << status; + } } }; @@ -513,11 +538,8 @@ Promise<> UpdatesManager::set_pts(int32 pts, const char *source) { } result = add_pts(pts); - if (last_confirmed_pts_ < get_pts() - FORCED_GET_DIFFERENCE_PTS_DIFF) { - if (last_confirmed_pts_ != 0) { - schedule_get_difference("rare PTS getDifference"); - } - last_confirmed_pts_ = get_pts(); + if (last_confirmed_pts_ < get_pts() - FORCED_GET_DIFFERENCE_PTS_DIFF && last_confirmed_pts_ != 0) { + confirm_pts_qts(get_qts()); } } else if (pts < get_pts() && (pts > 1 || td_->option_manager_->get_option_integer("session_count") <= 1)) { LOG(ERROR) << "Receive wrong PTS = " << pts << " from " << source << ". Current PTS = " << get_pts(); @@ -1817,6 +1839,18 @@ void UpdatesManager::on_get_difference(tl_object_ptrcreate_handler()->send(pts, qts); + + last_confirmed_pts_ = pts; + last_confirmed_qts_ = qts; +} + void UpdatesManager::after_get_difference() { CHECK(!running_get_difference_); @@ -2670,11 +2704,8 @@ void UpdatesManager::process_seq_updates(int32 seq_end, int32 date, void UpdatesManager::process_qts_update(tl_object_ptr &&update_ptr, int32 qts, Promise &&promise) { LOG(DEBUG) << "Process " << to_string(update_ptr); - if (last_confirmed_qts_ < qts - FORCED_GET_DIFFERENCE_PTS_DIFF) { - if (last_confirmed_qts_ != 0) { - schedule_get_difference("rare QTS getDifference"); - } - last_confirmed_qts_ = qts; + if (last_confirmed_qts_ < qts - FORCED_GET_DIFFERENCE_PTS_DIFF && last_confirmed_qts_ != 0) { + confirm_pts_qts(qts); } switch (update_ptr->get_id()) { case telegram_api::updateNewEncryptedMessage::ID: { diff --git a/td/telegram/UpdatesManager.h b/td/telegram/UpdatesManager.h index fb9e34360..64c9446d1 100644 --- a/td/telegram/UpdatesManager.h +++ b/td/telegram/UpdatesManager.h @@ -370,6 +370,8 @@ class UpdatesManager final : public Actor { void run_get_difference(bool is_recursive, const char *source); + void confirm_pts_qts(int32 qts); + void on_failed_get_updates_state(Status &&error); void on_failed_get_difference(Status &&error);