From 0a5d563a2fd7ba9db8781053a8370c6d8d01afc6 Mon Sep 17 00:00:00 2001 From: levlam Date: Sat, 29 Feb 2020 20:36:49 +0300 Subject: [PATCH] Fix MessagesManager::get_next_yet_unsent_scheduled_message_id. GitOrigin-RevId: 2a3a76652e809d46b5395f8cfd505ae625e30459 --- td/telegram/MessagesManager.cpp | 26 ++++++++++++++++---------- td/telegram/MessagesManager.h | 4 +++- 2 files changed, 19 insertions(+), 11 deletions(-) diff --git a/td/telegram/MessagesManager.cpp b/td/telegram/MessagesManager.cpp index c466e7e9..dbfd20b2 100644 --- a/td/telegram/MessagesManager.cpp +++ b/td/telegram/MessagesManager.cpp @@ -17823,7 +17823,7 @@ MessagesManager::Message *MessagesManager::get_message_to_send( bool need_update = false; CHECK(have_input_peer(dialog_id, AccessRights::Read)); auto result = add_message_to_dialog(d, std::move(m), true, &need_update, need_update_dialog_pos, "send message"); - CHECK(result != nullptr); + LOG_CHECK(result != nullptr) << message_id << " " << debug_add_message_to_dialog_fail_reason_; send_update_chat_has_scheduled_messages(d, false); return result; } @@ -23391,18 +23391,23 @@ MessageId MessagesManager::get_next_local_message_id(Dialog *d) { return get_next_message_id(d, MessageType::Local); } -MessageId MessagesManager::get_next_yet_unsent_scheduled_message_id(const Dialog *d, int32 date) { +MessageId MessagesManager::get_next_yet_unsent_scheduled_message_id(Dialog *d, int32 date) { CHECK(date > 0); + + MessageId message_id(ScheduledServerMessageId(1), date); + auto it = MessagesConstIterator(d, MessageId(ScheduledServerMessageId(), date + 1, true)); - int32 prev_date = 0; - if (*it != nullptr) { - prev_date = (*it)->message_id.get_scheduled_message_date(); + if (*it != nullptr && (*it)->message_id > message_id) { + message_id = (*it)->message_id; } - if (prev_date < date) { - return MessageId(ScheduledServerMessageId(1), date).get_next_message_id(MessageType::YetUnsent); + + auto &last_assigned_message_id = d->last_assigned_scheduled_message_id[date]; + if (last_assigned_message_id != MessageId() && last_assigned_message_id > message_id) { + message_id = last_assigned_message_id; } - CHECK(*it != nullptr); - return (*it)->message_id.get_next_message_id(MessageType::YetUnsent); + + last_assigned_message_id = message_id.get_next_message_id(MessageType::YetUnsent); + return last_assigned_message_id; } void MessagesManager::fail_send_message(FullMessageId full_message_id, int error_code, const string &error_message) { @@ -23703,7 +23708,8 @@ void MessagesManager::repair_dialog_scheduled_messages(Dialog *d) { // TODO create logevent auto dialog_id = d->dialog_id; - LOG(INFO) << "Repair scheduled messages in " << dialog_id; + LOG(INFO) << "Repair scheduled messages in " << dialog_id << " with generation " + << d->last_repair_scheduled_messages_generation; get_dialog_scheduled_messages(dialog_id, false, true, PromiseCreator::lambda([actor_id = actor_id(this), dialog_id](Unit) { send_closure(G()->messages_manager(), &MessagesManager::get_dialog_scheduled_messages, diff --git a/td/telegram/MessagesManager.h b/td/telegram/MessagesManager.h index d7a3998e..7ff289db 100644 --- a/td/telegram/MessagesManager.h +++ b/td/telegram/MessagesManager.h @@ -1135,6 +1135,8 @@ class MessagesManager : public Actor { std::unordered_map yet_unsent_message_id_to_persistent_message_id; + std::unordered_map last_assigned_scheduled_message_id; // date -> message_id + std::unordered_set deleted_message_ids; std::unordered_set deleted_scheduled_server_message_ids; @@ -2389,7 +2391,7 @@ class MessagesManager : public Actor { static MessageId get_next_yet_unsent_message_id(Dialog *d); - static MessageId get_next_yet_unsent_scheduled_message_id(const Dialog *d, int32 date); + static MessageId get_next_yet_unsent_scheduled_message_id(Dialog *d, int32 date); bool add_recently_found_dialog_internal(DialogId dialog_id);