Trying to repair broken Dialog, received from database.
GitOrigin-RevId: 39a0bc85a5edb557b598ac0486d287f0eb332aed
This commit is contained in:
parent
19c3c03808
commit
321df81ebb
@ -25298,7 +25298,29 @@ unique_ptr<MessagesManager::Dialog> MessagesManager::parse_dialog(DialogId dialo
|
|||||||
loaded_dialogs_.insert(dialog_id);
|
loaded_dialogs_.insert(dialog_id);
|
||||||
|
|
||||||
auto status = log_event_parse(*d, value.as_slice());
|
auto status = log_event_parse(*d, value.as_slice());
|
||||||
CHECK(status.is_ok()) << dialog_id << " " << format::as_hex_dump<4>(value.as_slice());
|
if (status.is_error() || !d->dialog_id.is_valid()) {
|
||||||
|
// can't happen unless database is broken, but has been seen in the wild
|
||||||
|
// if dialog_id is invalid, we can't repair the dialog
|
||||||
|
CHECK(dialog_id.is_valid()) << "Can't repair " << dialog_id << " " << d->dialog_id << " "
|
||||||
|
<< format::as_hex_dump<4>(value.as_slice());
|
||||||
|
|
||||||
|
LOG(ERROR) << "Repair broken " << dialog_id << " " << format::as_hex_dump<4>(value.as_slice());
|
||||||
|
|
||||||
|
// just clean all known data about the dialog
|
||||||
|
d = make_unique<Dialog>();
|
||||||
|
std::fill(d->message_count_by_index.begin(), d->message_count_by_index.end(), -1);
|
||||||
|
d->dialog_id = dialog_id;
|
||||||
|
|
||||||
|
// and try to reget it from the server if possible
|
||||||
|
have_dialog_info_force(dialog_id);
|
||||||
|
if (have_input_peer(dialog_id, AccessRights::Read)) {
|
||||||
|
if (dialog_id.get_type() != DialogType::SecretChat) {
|
||||||
|
send_get_dialog_query(dialog_id, Auto());
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
LOG(ERROR) << "Have no info about " << dialog_id << " to repair it";
|
||||||
|
}
|
||||||
|
}
|
||||||
CHECK(dialog_id == d->dialog_id);
|
CHECK(dialog_id == d->dialog_id);
|
||||||
|
|
||||||
Dependencies dependencies;
|
Dependencies dependencies;
|
||||||
|
Reference in New Issue
Block a user