From 1f6342c88eed25342dcf30d82746712087288ed3 Mon Sep 17 00:00:00 2001 From: levlam Date: Sun, 23 Jul 2023 20:42:30 +0300 Subject: [PATCH] Retry loading of channel difference later if receive invalid poll in a message. --- td/telegram/MessagesManager.cpp | 72 +++++++++++++++++++-------------- td/telegram/MessagesManager.h | 4 ++ 2 files changed, 45 insertions(+), 31 deletions(-) diff --git a/td/telegram/MessagesManager.cpp b/td/telegram/MessagesManager.cpp index da0c9cb67..649d18536 100644 --- a/td/telegram/MessagesManager.cpp +++ b/td/telegram/MessagesManager.cpp @@ -30915,6 +30915,22 @@ void MessagesManager::on_send_message_get_quick_ack(int64 random_id) { get_chat_id_object(dialog_id, "updateMessageSendAcknowledged"), message_id.get())); } +bool MessagesManager::is_invalid_poll_message(const telegram_api::Message *message) { + CHECK(message != nullptr); + auto constructor_id = message->get_id(); + if (constructor_id != telegram_api::message::ID) { + return false; + } + + auto media = static_cast(message)->media_.get(); + if (media == nullptr || media->get_id() != telegram_api::messageMediaPoll::ID) { + return false; + } + + auto poll = static_cast(media)->poll_.get(); + return !PollId(poll->id_).is_valid(); +} + void MessagesManager::check_send_message_result(int64 random_id, DialogId dialog_id, const telegram_api::Updates *updates_ptr, const char *source) { CHECK(updates_ptr != nullptr); @@ -30922,25 +30938,6 @@ void MessagesManager::check_send_message_result(int64 random_id, DialogId dialog auto sent_messages = UpdatesManager::get_new_messages(updates_ptr); auto sent_messages_random_ids = UpdatesManager::get_sent_messages_random_ids(updates_ptr); - auto is_invalid_poll_message = [](const telegram_api::Message *message) { - CHECK(message != nullptr); - auto constructor_id = message->get_id(); - if (constructor_id == telegram_api::messageEmpty::ID) { - return true; - } - if (constructor_id != telegram_api::message::ID) { - return false; - } - - auto media = static_cast(message)->media_.get(); - if (media == nullptr || media->get_id() != telegram_api::messageMediaPoll::ID) { - return false; - } - - auto poll = static_cast(media)->poll_.get(); - return !PollId(poll->id_).is_valid(); - }; - if (sent_messages.size() != 1u || sent_messages_random_ids.size() != 1u || *sent_messages_random_ids.begin() != random_id || DialogId::get_message_dialog_id(sent_messages[0].first) != dialog_id || @@ -38639,6 +38636,19 @@ void MessagesManager::on_get_channel_dialog(DialogId dialog_id, MessageId last_m } } +void MessagesManager::retry_get_channel_difference_later(DialogId dialog_id) { + auto &delay = channel_get_difference_retry_timeouts_[dialog_id]; + if (delay == 0) { + delay = 1; + } + schedule_get_channel_difference(dialog_id, 0, MessageId(), Random::fast(delay * 800, delay * 1200) * 1e-3, + "retry_get_channel_difference_later"); + delay *= 2; + if (delay > 60) { + delay = Random::fast(60, 80); + } +} + void MessagesManager::on_get_channel_difference( DialogId dialog_id, int32 request_pts, int32 request_limit, tl_object_ptr &&difference_ptr) { @@ -38662,24 +38672,13 @@ void MessagesManager::on_get_channel_difference( return after_get_channel_difference(dialog_id, false); } } - auto &delay = channel_get_difference_retry_timeouts_[dialog_id]; - if (delay == 0) { - delay = 1; - } - schedule_get_channel_difference(dialog_id, 0, MessageId(), Random::fast(delay * 1000, delay * 1500) * 1e-3, - "on_get_channel_difference"); - delay *= 2; - if (delay > 60) { - delay = Random::fast(60, 80); - } + retry_get_channel_difference_later(dialog_id); } else { after_get_channel_difference(dialog_id, false); } return; } - channel_get_difference_retry_timeouts_.erase(dialog_id); - LOG(INFO) << "Receive result of getChannelDifference for " << dialog_id << " with PTS = " << request_pts << " and limit = " << request_limit << " from " << source << ": " << to_string(difference_ptr); @@ -38688,6 +38687,7 @@ void MessagesManager::on_get_channel_difference( case telegram_api::updates_channelDifferenceEmpty::ID: if (d == nullptr) { // no need to create the dialog + channel_get_difference_retry_timeouts_.erase(dialog_id); after_get_channel_difference(dialog_id, true); return; } @@ -38697,6 +38697,14 @@ void MessagesManager::on_get_channel_difference( have_new_messages = !difference->new_messages_.empty(); td_->contacts_manager_->on_get_users(std::move(difference->users_), "updates.channelDifference"); td_->contacts_manager_->on_get_chats(std::move(difference->chats_), "updates.channelDifference"); + for (const auto &message : difference->new_messages_) { + if (is_invalid_poll_message(message.get())) { + LOG(ERROR) << "Receive invalid poll message in updates.channelDifference: " << oneline(to_string(message)); + if (channel_get_difference_retry_timeouts_[dialog_id] <= 2) { + return retry_get_channel_difference_later(dialog_id); + } + } + } break; } case telegram_api::updates_channelDifferenceTooLong::ID: { @@ -38710,6 +38718,8 @@ void MessagesManager::on_get_channel_difference( UNREACHABLE(); } + channel_get_difference_retry_timeouts_.erase(dialog_id); + bool need_update_dialog_pos = false; if (d == nullptr) { d = add_dialog_for_new_message(dialog_id, have_new_messages, &need_update_dialog_pos, "on_get_channel_difference"); diff --git a/td/telegram/MessagesManager.h b/td/telegram/MessagesManager.h index 7e2105d73..410e82a65 100644 --- a/td/telegram/MessagesManager.h +++ b/td/telegram/MessagesManager.h @@ -3011,6 +3011,8 @@ class MessagesManager final : public Actor { void update_list_last_dialog_date(DialogList &list); + static bool is_invalid_poll_message(const telegram_api::Message *message); + static string get_channel_pts_key(DialogId dialog_id); int32 load_channel_pts(DialogId dialog_id) const; @@ -3024,6 +3026,8 @@ class MessagesManager final : public Actor { bool running_get_channel_difference(DialogId dialog_id) const; + void retry_get_channel_difference_later(DialogId dialog_id); + void on_channel_get_difference_timeout(DialogId dialog_id); void update_expected_channel_pts(DialogId dialog_id, int32 expected_pts);