Fix adding too new messages.

GitOrigin-RevId: 3874c25b07674608d8a4cef61cd4801ce6a5f115
This commit is contained in:
levlam 2019-04-13 16:50:06 +03:00
parent 30a526f2f0
commit b1a1635ce7
3 changed files with 35 additions and 15 deletions

View File

@ -22191,23 +22191,38 @@ MessagesManager::Message *MessagesManager::add_message_to_dialog(Dialog *d, uniq
}
}
if (!from_update && ((message_id.is_server() && d->last_new_message_id != MessageId() &&
message_id.get() > d->last_new_message_id.get()) ||
(message_id.is_local() && d->last_database_message_id != MessageId() &&
message_id.get() > d->last_database_message_id.get() && !message->is_failed_to_send))) {
if (!message->from_database) {
LOG(ERROR) << "Ignore " << message_id << " in " << dialog_id << " received not through update from " << source
<< ". Last new is " << d->last_new_message_id << ", channel difference "
<< debug_channel_difference_dialog_ << " " << to_string(get_message_object(dialog_id, message.get()));
dump_debug_message_op(d, 3);
if (dialog_id.get_type() == DialogType::Channel && have_input_peer(dialog_id, AccessRights::Read)) {
channel_get_difference_retry_timeout_.add_timeout_in(dialog_id.get(), 0.001);
if (!from_update && !message->is_failed_to_send) {
MessageId max_message_id;
if (message_id.is_server()) {
if (d->being_added_message_id.is_valid()) {
// if a too new message not from update has failed to preload before being_added_message_id was set,
// then it should fail to load event after it is set and last_new_message_id has changed
max_message_id = d->being_updated_last_new_message_id;
} else {
max_message_id = d->last_new_message_id;
}
} else if (message_id.is_local()) {
if (d->being_added_message_id.is_valid()) {
max_message_id = d->being_updated_last_database_message_id;
} else {
max_message_id = d->last_database_message_id;
}
} else {
LOG(INFO) << "Ignore " << message_id << " in " << dialog_id << " received not through update from " << source;
}
debug_add_message_to_dialog_fail_reason_ = "too new message not from update";
return nullptr;
if (max_message_id != MessageId() && message_id.get() > max_message_id.get()) {
if (!message->from_database) {
LOG(ERROR) << "Ignore " << message_id << " in " << dialog_id << " received not through update from " << source
<< ". Last is " << max_message_id << ", channel difference "
<< debug_channel_difference_dialog_ << " " << to_string(get_message_object(dialog_id, message.get()));
dump_debug_message_op(d, 3);
if (dialog_id.get_type() == DialogType::Channel && have_input_peer(dialog_id, AccessRights::Read)) {
channel_get_difference_retry_timeout_.add_timeout_in(dialog_id.get(), 0.001);
}
} else {
LOG(INFO) << "Ignore " << message_id << " in " << dialog_id << " received not through update from " << source;
}
debug_add_message_to_dialog_fail_reason_ = "too new message not from update";
return nullptr;
}
}
if ((message_id.is_server() || (message_id.is_local() && dialog_id.get_type() == DialogType::SecretChat)) &&
message_id.get() <= d->max_unavailable_message_id.get()) {
@ -22397,6 +22412,8 @@ MessagesManager::Message *MessagesManager::add_message_to_dialog(Dialog *d, uniq
<< d->debug_added_pinned_message_id << " " << d->debug_add_message_to_dialog_fail_reason_ << " " << source;
d->being_added_message_id = message_id;
d->being_updated_last_new_message_id = d->last_new_message_id;
d->being_updated_last_database_message_id = d->last_database_message_id;
d->debug_being_added_need_update = *need_update;
d->debug_preloaded_pinned_message_id = preloaded_pinned_message_id;
d->debug_added_pinned_message_id = added_pinned_message_id;

View File

@ -972,6 +972,8 @@ class MessagesManager : public Actor {
MessageId max_added_message_id;
MessageId being_added_message_id;
MessageId being_updated_last_new_message_id;
MessageId being_updated_last_database_message_id;
bool debug_being_added_need_update = false; // TODO remove
MessageId debug_preloaded_pinned_message_id; // TODO remove
MessageId debug_added_pinned_message_id; // TODO remove

View File

@ -8,6 +8,7 @@
#include "td/telegram/CallId.h"
#include "td/telegram/DialogId.h"
#include "td/telegram/Document.h"
#include "td/telegram/MessageId.h"
#include "td/telegram/Notification.h"
#include "td/telegram/NotificationGroupId.h"