Fix handling of duplicate notification identifiers.

GitOrigin-RevId: 54e8cee7d284fdb4579f4f92d50c6db902825e04
This commit is contained in:
levlam 2019-04-03 02:47:35 +03:00
parent 3a2af5d4b1
commit 47bbdabe5a

View File

@ -18402,7 +18402,11 @@ NotificationId MessagesManager::get_next_notification_id(Dialog *d, Notification
return NotificationId(); return NotificationId();
} }
} while (d->notification_id_to_message_id.count(notification_id) != 0 || } while (d->notification_id_to_message_id.count(notification_id) != 0 ||
d->new_secret_chat_notification_id == notification_id); // just in case d->new_secret_chat_notification_id == notification_id ||
notification_id.get() <= d->message_notification_group.last_notification_id.get() ||
notification_id.get() <= d->message_notification_group.max_removed_notification_id.get() ||
notification_id.get() <= d->mention_notification_group.last_notification_id.get() ||
notification_id.get() <= d->mention_notification_group.max_removed_notification_id.get()); // just in case
if (message_id.is_valid()) { if (message_id.is_valid()) {
add_notification_id_to_message_id_correspondence(d, notification_id, message_id); add_notification_id_to_message_id_correspondence(d, notification_id, message_id);
} }
@ -18611,23 +18615,30 @@ vector<Notification> MessagesManager::get_message_notifications_from_database_fo
continue; continue;
} }
LOG_CHECK(m->notification_id.get() < from_notification_id.get()) bool is_correct = true;
<< from_mentions << " " << is_from_mention_notification_group(d, m) << " " << d->dialog_id << " " if (m->notification_id.get() >= from_notification_id.get()) {
<< m->message_id << " " << m->notification_id << " " << from_message_id << " " << from_notification_id << " " // possible if two messages has the same notification_id
<< group_info.group_id << " " << group_info.last_notification_date << " " << group_info.last_notification_id LOG(ERROR) << "Have nonmonotoic notification ids: " << d->dialog_id << " " << m->message_id << " "
<< " " << group_info.max_removed_notification_id << " " << group_info.max_removed_message_id << " " << m->notification_id << " " << from_message_id << " " << from_notification_id;
<< d->last_new_message_id << " " << d->last_message_id << " " << d->first_database_message_id << " " is_correct = false;
<< d->last_database_message_id << " " << d->max_added_message_id << " " } else {
<< d->pinned_message_notification_message_id << " " << d->is_last_message_deleted_locally << " "
<< d->debug_last_new_message_id << " " << d->debug_first_database_message_id << " "
<< d->debug_last_database_message_id;
from_notification_id = m->notification_id; from_notification_id = m->notification_id;
is_found = true;
}
if (m->message_id.get() >= from_message_id.get()) {
LOG(ERROR) << "Have nonmonotoic message ids: " << d->dialog_id << " " << m->message_id << " "
<< m->notification_id << " " << from_message_id << " " << from_notification_id;
is_correct = false;
} else {
from_message_id = m->message_id; from_message_id = m->message_id;
is_found = true; is_found = true;
}
if (is_from_mention_notification_group(d, m) == from_mentions) { if (is_correct && is_from_mention_notification_group(d, m) == from_mentions) {
// skip mention messages returned among unread messages // skip mention messages returned among unread messages
res.emplace_back(m->notification_id, m->date, create_new_message_notification(m->message_id)); res.emplace_back(m->notification_id, m->date, create_new_message_notification(m->message_id));
} else if (!is_correct) {
remove_message_notification_id(d, m, true, false);
} }
} }
if (!res.empty() || !is_found) { if (!res.empty() || !is_found) {
@ -18822,24 +18833,27 @@ void MessagesManager::on_get_message_notifications_from_database(DialogId dialog
continue; continue;
} }
CHECK(!from_notification_id.is_valid() || m->notification_id.get() < from_notification_id.get()); bool is_correct = true;
LOG_CHECK(!from_message_id.is_valid() || m->message_id.get() < from_message_id.get()) if (from_notification_id.is_valid() && m->notification_id.get() >= from_notification_id.get()) {
<< from_mentions << " " << is_from_mention_notification_group(d, m) << " " << dialog_id << " " << m->message_id LOG(ERROR) << "Receive " << m->message_id << "/" << m->notification_id << " after " << from_message_id << "/"
<< " " << m->notification_id << " " << from_message_id << " " << from_notification_id << " " << from_notification_id;
<< group_info.group_id << " " << group_info.last_notification_date << " " << group_info.last_notification_id is_correct = false;
<< " " << group_info.max_removed_notification_id << " " << group_info.max_removed_message_id << " " } else {
<< d->last_new_message_id << " " << d->last_message_id << " " << d->first_database_message_id << " "
<< d->last_database_message_id << " " << d->max_added_message_id << " "
<< d->pinned_message_notification_message_id << " " << d->is_last_message_deleted_locally << " "
<< d->debug_last_new_message_id << " " << d->debug_first_database_message_id << " "
<< d->debug_last_database_message_id;
from_notification_id = m->notification_id; from_notification_id = m->notification_id;
}
if (from_message_id.is_valid() && m->message_id.get() >= from_message_id.get()) {
LOG(ERROR) << "Receive " << m->message_id << "/" << m->notification_id << " after " << from_message_id << "/"
<< from_notification_id;
is_correct = false;
} else {
from_message_id = m->message_id; from_message_id = m->message_id;
}
if (is_from_mention_notification_group(d, m) == from_mentions) { if (is_correct && is_from_mention_notification_group(d, m) == from_mentions) {
// skip mention messages returned among unread messages // skip mention messages returned among unread messages
res.emplace_back(m->notification_id, m->date, create_new_message_notification(m->message_id)); res.emplace_back(m->notification_id, m->date, create_new_message_notification(m->message_id));
} else if (!is_correct) {
remove_message_notification_id(d, m, true, false);
} }
} }
if (!res.empty() || !from_notification_id.is_valid() || static_cast<size_t>(limit) > messages.size()) { if (!res.empty() || !from_notification_id.is_valid() || static_cast<size_t>(limit) > messages.size()) {