From d0f845072652163d55b3a7f2270ccdcb9ae1da6a Mon Sep 17 00:00:00 2001 From: levlam Date: Wed, 12 Dec 2018 05:22:26 +0300 Subject: [PATCH] Trying to repair broken messages in the database. GitOrigin-RevId: 1720ff9641329b1b027dc2529f0b8df8e9124dae --- td/telegram/MessagesManager.cpp | 13 ++++++++----- td/telegram/MessagesManager.h | 2 +- 2 files changed, 9 insertions(+), 6 deletions(-) diff --git a/td/telegram/MessagesManager.cpp b/td/telegram/MessagesManager.cpp index 2f5aa7cd..944d81dd 100644 --- a/td/telegram/MessagesManager.cpp +++ b/td/telegram/MessagesManager.cpp @@ -14075,16 +14075,19 @@ void MessagesManager::preload_older_messages(const Dialog *d, MessageId min_mess } } -unique_ptr MessagesManager::parse_message(const BufferSlice &value) { +unique_ptr MessagesManager::parse_message(DialogId dialog_id, const BufferSlice &value) { LOG(INFO) << "Loaded message of size " << value.size() << " from database"; auto m = make_unique(); auto status = log_event_parse(*m, value.as_slice()); if (status.is_error() || !m->message_id.is_valid()) { // can't happen unless database is broken, but has been seen in the wild - - LOG(FATAL) << "Receive invalid message from database: " << m->message_id << ' ' << status << ' ' + LOG(ERROR) << "Receive invalid message from database: " << m->message_id << ' ' << status << ' ' << format::as_hex_dump<4>(value.as_slice()); + if (dialog_id.get_type() != DialogType::SecretChat && m->message_id.is_valid() && m->message_id.is_server()) { + // trying to repair the message + get_messages_from_server({FullMessageId{dialog_id, m->message_id}}, Auto()); + } return nullptr; } @@ -14128,7 +14131,7 @@ void MessagesManager::on_get_history_from_database(DialogId dialog_id, MessageId if (!d->first_database_message_id.is_valid() && !d->have_full_history) { break; } - auto message = parse_message(std::move(message_slice)); + auto message = parse_message(dialog_id, std::move(message_slice)); if (message == nullptr) { if (d->have_full_history) { d->have_full_history = false; @@ -20479,7 +20482,7 @@ MessagesManager::Message *MessagesManager::on_get_message_from_database(DialogId return nullptr; } - auto m = parse_message(std::move(value)); + auto m = parse_message(dialog_id, std::move(value)); if (m == nullptr) { return nullptr; } diff --git a/td/telegram/MessagesManager.h b/td/telegram/MessagesManager.h index f3ee75a6..70c39ccb 100644 --- a/td/telegram/MessagesManager.h +++ b/td/telegram/MessagesManager.h @@ -1918,7 +1918,7 @@ class MessagesManager : public Actor { string get_search_text(const Message *m) const; - static unique_ptr parse_message(const BufferSlice &value); + unique_ptr parse_message(DialogId dialog_id, const BufferSlice &value); unique_ptr parse_dialog(DialogId dialog_id, const BufferSlice &value);