From 17bc097d123e6f5c31d5a96cfe7cc8b80f0a18f2 Mon Sep 17 00:00:00 2001 From: levlam Date: Thu, 3 Nov 2022 18:10:51 +0300 Subject: [PATCH] Destroy deleted messages on another thread. --- td/telegram/MessagesManager.cpp | 27 +++++++++++++++++++++------ td/telegram/MessagesManager.h | 3 ++- 2 files changed, 23 insertions(+), 7 deletions(-) diff --git a/td/telegram/MessagesManager.cpp b/td/telegram/MessagesManager.cpp index 482609484..217096d49 100644 --- a/td/telegram/MessagesManager.cpp +++ b/td/telegram/MessagesManager.cpp @@ -10739,6 +10739,7 @@ void MessagesManager::on_get_message_public_forwards(int32 total_count, void MessagesManager::delete_messages_from_updates(const vector &message_ids) { FlatHashMap, DialogIdHash> deleted_message_ids; FlatHashMap need_update_dialog_pos; + vector> deleted_messages; for (auto message_id : message_ids) { if (!message_id.is_valid() || !message_id.is_server()) { LOG(ERROR) << "Incoming update tries to delete " << message_id; @@ -10752,6 +10753,7 @@ void MessagesManager::delete_messages_from_updates(const vector &mess CHECK(message != nullptr); LOG_CHECK(message->message_id == message_id) << message_id << " " << message->message_id << " " << d->dialog_id; deleted_message_ids[d->dialog_id].push_back(message->message_id.get()); + deleted_messages.push_back(std::move(message)); } if (last_clear_history_message_id_to_dialog_id_.count(message_id)) { d = get_dialog(last_clear_history_message_id_to_dialog_id_[message_id]); @@ -10773,6 +10775,9 @@ void MessagesManager::delete_messages_from_updates(const vector &mess auto dialog_id = it.first; send_update_delete_messages(dialog_id, std::move(it.second), true, false); } + if (deleted_messages.size() >= MIN_DELETED_ASYNCHRONOUSLY_MESSAGES) { + Scheduler::instance()->destroy_on_scheduler(G()->get_gc_scheduler_id(), deleted_messages); + } } void MessagesManager::delete_dialog_messages(DialogId dialog_id, const vector &message_ids, @@ -11113,16 +11118,21 @@ void MessagesManager::delete_messages(DialogId dialog_id, const vector> deleted_messages; vector deleted_message_ids; for (auto message_id : message_ids) { - auto m = delete_message(d, message_id, true, &need_update_dialog_pos, DELETE_MESSAGE_USER_REQUEST_SOURCE); - if (m == nullptr) { + auto message = delete_message(d, message_id, true, &need_update_dialog_pos, DELETE_MESSAGE_USER_REQUEST_SOURCE); + if (message == nullptr) { LOG(INFO) << "Can't delete " << message_id << " because it is not found"; } else { - need_update_chat_has_scheduled_messages |= m->message_id.is_scheduled(); - deleted_message_ids.push_back(m->message_id.get()); + need_update_chat_has_scheduled_messages |= message->message_id.is_scheduled(); + deleted_message_ids.push_back(message->message_id.get()); + deleted_messages.push_back(std::move(message)); } } + if (deleted_messages.size() >= MIN_DELETED_ASYNCHRONOUSLY_MESSAGES) { + Scheduler::instance()->destroy_on_scheduler(G()->get_gc_scheduler_id(), deleted_messages); + } if (need_update_dialog_pos) { send_update_chat_last_message(d, "delete_messages"); @@ -12008,10 +12018,14 @@ void MessagesManager::unload_dialog(DialogId dialog_id) { to_unload_message_ids, has_left_to_unload_messages); vector unloaded_message_ids; + vector> unloaded_messages; for (auto message_id : to_unload_message_ids) { - unload_message(d, message_id); + unloaded_messages.push_back(unload_message(d, message_id)); unloaded_message_ids.push_back(message_id.get()); } + if (unloaded_messages.size() >= MIN_DELETED_ASYNCHRONOUSLY_MESSAGES) { + Scheduler::instance()->destroy_on_scheduler(G()->get_gc_scheduler_id(), unloaded_messages); + } if (!unloaded_message_ids.empty()) { if (!G()->parameters().use_message_db && !d->is_empty) { @@ -16311,12 +16325,13 @@ bool MessagesManager::can_unload_message(const Dialog *d, const Message *m) cons (m->media_album_id != d->last_media_album_id || m->media_album_id == 0); } -void MessagesManager::unload_message(Dialog *d, MessageId message_id) { +unique_ptr MessagesManager::unload_message(Dialog *d, MessageId message_id) { CHECK(d != nullptr); CHECK(message_id.is_valid()); bool need_update_dialog_pos = false; auto m = do_delete_message(d, message_id, false, true, &need_update_dialog_pos, "unload_message"); CHECK(!need_update_dialog_pos); + return m; } unique_ptr MessagesManager::delete_message(Dialog *d, MessageId message_id, diff --git a/td/telegram/MessagesManager.h b/td/telegram/MessagesManager.h index 4d3e0a29d..db14783a1 100644 --- a/td/telegram/MessagesManager.h +++ b/td/telegram/MessagesManager.h @@ -1810,6 +1810,7 @@ class MessagesManager final : public Actor { static constexpr size_t MAX_DIALOG_FILTER_TITLE_LENGTH = 12; // server side limit for dialog filter title static constexpr int32 MAX_PRIVATE_MESSAGE_TTL = 60; // server side limit static constexpr int32 DIALOG_FILTERS_CACHE_TIME = 86400; + static constexpr size_t MIN_DELETED_ASYNCHRONOUSLY_MESSAGES = 10u; static constexpr int64 SPONSORED_DIALOG_ORDER = static_cast(2147483647) << 32; static constexpr int32 MIN_PINNED_DIALOG_DATE = 2147000000; // some big date @@ -2118,7 +2119,7 @@ class MessagesManager final : public Actor { bool can_unload_message(const Dialog *d, const Message *m) const; - void unload_message(Dialog *d, MessageId message_id); + unique_ptr unload_message(Dialog *d, MessageId message_id); unique_ptr delete_message(Dialog *d, MessageId message_id, bool is_permanently_deleted, bool *need_update_dialog_pos, const char *source);