Better repair of has_scheduled_server_messages.

GitOrigin-RevId: eb1ebac91773ce3a7306a252afe98d2a1a9686fa
This commit is contained in:
levlam 2020-02-28 21:40:31 +03:00
parent cf8254b2c9
commit dd6e52418c
2 changed files with 42 additions and 25 deletions

View File

@ -5953,7 +5953,7 @@ void MessagesManager::on_update_delete_scheduled_messages(DialogId dialog_id,
send_update_delete_messages(dialog_id, std::move(deleted_message_ids), true, false); send_update_delete_messages(dialog_id, std::move(deleted_message_ids), true, false);
send_update_chat_has_scheduled_messages(d); send_update_chat_has_scheduled_messages(d, true);
} }
void MessagesManager::on_update_include_sponsored_dialog_to_unread_count() { void MessagesManager::on_update_include_sponsored_dialog_to_unread_count() {
@ -8321,7 +8321,7 @@ void MessagesManager::on_get_scheduled_server_messages(DialogId dialog_id, uint3
send_update_delete_messages(dialog_id, {message->message_id.get()}, true, false); send_update_delete_messages(dialog_id, {message->message_id.get()}, true, false);
} }
send_update_chat_has_scheduled_messages(d); send_update_chat_has_scheduled_messages(d, false);
} }
void MessagesManager::on_get_recent_locations(DialogId dialog_id, int32 limit, int64 random_id, int32 total_count, void MessagesManager::on_get_recent_locations(DialogId dialog_id, int32 limit, int64 random_id, int32 total_count,
@ -8654,7 +8654,7 @@ void MessagesManager::delete_messages(DialogId dialog_id, const vector<MessageId
} }
send_update_delete_messages(dialog_id, std::move(deleted_message_ids), true, false); send_update_delete_messages(dialog_id, std::move(deleted_message_ids), true, false);
send_update_chat_has_scheduled_messages(d); send_update_chat_has_scheduled_messages(d, true);
} }
void MessagesManager::delete_message_from_server(DialogId dialog_id, MessageId message_id, bool revoke) { void MessagesManager::delete_message_from_server(DialogId dialog_id, MessageId message_id, bool revoke) {
@ -11554,7 +11554,7 @@ FullMessageId MessagesManager::on_get_message(MessageInfo &&message_info, bool f
return FullMessageId(); return FullMessageId();
} }
send_update_chat_has_scheduled_messages(d); send_update_chat_has_scheduled_messages(d, false);
if (need_update_dialog_pos) { if (need_update_dialog_pos) {
send_update_chat_last_message(d, "on_get_message"); send_update_chat_last_message(d, "on_get_message");
@ -17563,7 +17563,7 @@ void MessagesManager::on_get_scheduled_messages_from_database(DialogId dialog_id
for (auto message_id : added_message_ids) { for (auto message_id : added_message_ids) {
send_update_new_message(d, get_message(d, message_id)); send_update_new_message(d, get_message(d, message_id));
} }
send_update_chat_has_scheduled_messages(d); send_update_chat_has_scheduled_messages(d, false);
auto it = load_scheduled_messages_from_database_queries_.find(dialog_id); auto it = load_scheduled_messages_from_database_queries_.find(dialog_id);
CHECK(it != load_scheduled_messages_from_database_queries_.end()); CHECK(it != load_scheduled_messages_from_database_queries_.end());
@ -17820,7 +17820,7 @@ MessagesManager::Message *MessagesManager::get_message_to_send(
CHECK(have_input_peer(dialog_id, AccessRights::Read)); CHECK(have_input_peer(dialog_id, AccessRights::Read));
auto result = add_message_to_dialog(d, std::move(m), true, &need_update, need_update_dialog_pos, "send message"); auto result = add_message_to_dialog(d, std::move(m), true, &need_update, need_update_dialog_pos, "send message");
CHECK(result != nullptr); CHECK(result != nullptr);
send_update_chat_has_scheduled_messages(d); send_update_chat_has_scheduled_messages(d, false);
return result; return result;
} }
@ -22827,21 +22827,31 @@ void MessagesManager::send_update_chat_action_bar(const Dialog *d) {
send_update_secret_chats_with_user_action_bar(d); send_update_secret_chats_with_user_action_bar(d);
} }
void MessagesManager::send_update_chat_has_scheduled_messages(Dialog *d) { void MessagesManager::send_update_chat_has_scheduled_messages(Dialog *d, bool from_deletion) {
if (td_->auth_manager_->is_bot()) { if (td_->auth_manager_->is_bot()) {
return; return;
} }
if (d->scheduled_messages == nullptr) { if (d->scheduled_messages == nullptr) {
if (d->has_loaded_scheduled_messages_from_database) { if (d->has_scheduled_database_messages) {
set_dialog_has_scheduled_database_messages_impl(d, false); if (d->has_loaded_scheduled_messages_from_database) {
} else if (d->has_scheduled_database_messages) { set_dialog_has_scheduled_database_messages_impl(d, false);
CHECK(G()->parameters().use_message_db); } else {
repair_dialog_scheduled_messages(d->dialog_id); CHECK(G()->parameters().use_message_db);
repair_dialog_scheduled_messages(d);
}
}
if (d->has_scheduled_server_messages) {
if (from_deletion && d->scheduled_messages_sync_generation > 0) {
set_dialog_has_scheduled_server_messages(d, false);
} else {
d->last_repair_scheduled_messages_generation = 0;
repair_dialog_scheduled_messages(d);
}
} }
} }
LOG(INFO) << "Have scheduled messages on server = " << d->has_scheduled_server_messages LOG(INFO) << "In " << d->dialog_id << " have scheduled messages on server = " << d->has_scheduled_server_messages
<< ", in database = " << d->has_scheduled_database_messages << ", in database = " << d->has_scheduled_database_messages
<< " and in memory = " << (d->scheduled_messages != nullptr) << " and in memory = " << (d->scheduled_messages != nullptr)
<< "; was loaded from database = " << d->has_loaded_scheduled_messages_from_database; << "; was loaded from database = " << d->has_loaded_scheduled_messages_from_database;
@ -22880,14 +22890,14 @@ void MessagesManager::check_send_message_result(int64 random_id, DialogId dialog
*sent_messages_random_ids.begin() != random_id || get_message_dialog_id(*sent_messages[0]) != dialog_id) { *sent_messages_random_ids.begin() != random_id || get_message_dialog_id(*sent_messages[0]) != dialog_id) {
LOG(ERROR) << "Receive wrong result for sending message with random_id " << random_id << " from " << source LOG(ERROR) << "Receive wrong result for sending message with random_id " << random_id << " from " << source
<< " to " << dialog_id << ": " << oneline(to_string(*updates_ptr)); << " to " << dialog_id << ": " << oneline(to_string(*updates_ptr));
Dialog *d = get_dialog(dialog_id);
CHECK(d != nullptr);
if (dialog_id.get_type() == DialogType::Channel) { if (dialog_id.get_type() == DialogType::Channel) {
Dialog *d = get_dialog(dialog_id);
CHECK(d != nullptr);
get_channel_difference(dialog_id, d->pts, true, "check_send_message_result"); get_channel_difference(dialog_id, d->pts, true, "check_send_message_result");
} else { } else {
td_->updates_manager_->schedule_get_difference("check_send_message_result"); td_->updates_manager_->schedule_get_difference("check_send_message_result");
} }
repair_dialog_scheduled_messages(dialog_id); repair_dialog_scheduled_messages(d);
} }
} }
@ -23677,12 +23687,18 @@ void MessagesManager::set_dialog_pinned_message_id(Dialog *d, MessageId pinned_m
make_tl_object<td_api::updateChatPinnedMessage>(d->dialog_id.get(), pinned_message_id.get())); make_tl_object<td_api::updateChatPinnedMessage>(d->dialog_id.get(), pinned_message_id.get()));
} }
void MessagesManager::repair_dialog_scheduled_messages(DialogId dialog_id) { void MessagesManager::repair_dialog_scheduled_messages(Dialog *d) {
if (td_->auth_manager_->is_bot() || dialog_id.get_type() == DialogType::SecretChat) { if (td_->auth_manager_->is_bot() || d->dialog_id.get_type() == DialogType::SecretChat) {
return; return;
} }
if (d->last_repair_scheduled_messages_generation == scheduled_messages_sync_generation_) {
return;
}
d->last_repair_scheduled_messages_generation = scheduled_messages_sync_generation_;
// TODO create logevent // TODO create logevent
auto dialog_id = d->dialog_id;
LOG(INFO) << "Repair scheduled messages in " << dialog_id; LOG(INFO) << "Repair scheduled messages in " << dialog_id;
get_dialog_scheduled_messages(dialog_id, false, PromiseCreator::lambda([actor_id = actor_id(this), dialog_id](Unit) { get_dialog_scheduled_messages(dialog_id, false, PromiseCreator::lambda([actor_id = actor_id(this), dialog_id](Unit) {
send_closure(G()->messages_manager(), &MessagesManager::get_dialog_scheduled_messages, send_closure(G()->messages_manager(), &MessagesManager::get_dialog_scheduled_messages,
@ -23711,7 +23727,7 @@ void MessagesManager::on_update_dialog_has_scheduled_server_messages(DialogId di
set_dialog_has_scheduled_server_messages(d, has_scheduled_server_messages); set_dialog_has_scheduled_server_messages(d, has_scheduled_server_messages);
} else if (has_scheduled_server_messages != } else if (has_scheduled_server_messages !=
(d->has_scheduled_database_messages || d->scheduled_messages != nullptr)) { (d->has_scheduled_database_messages || d->scheduled_messages != nullptr)) {
repair_dialog_scheduled_messages(d->dialog_id); repair_dialog_scheduled_messages(d);
} }
} }
@ -23719,12 +23735,12 @@ void MessagesManager::set_dialog_has_scheduled_server_messages(Dialog *d, bool h
CHECK(d != nullptr); CHECK(d != nullptr);
CHECK(d->has_scheduled_server_messages != has_scheduled_server_messages); CHECK(d->has_scheduled_server_messages != has_scheduled_server_messages);
d->has_scheduled_server_messages = has_scheduled_server_messages; d->has_scheduled_server_messages = has_scheduled_server_messages;
repair_dialog_scheduled_messages(d->dialog_id); repair_dialog_scheduled_messages(d);
on_dialog_updated(d->dialog_id, "set_dialog_has_scheduled_server_messages"); on_dialog_updated(d->dialog_id, "set_dialog_has_scheduled_server_messages");
LOG(INFO) << "Set " << d->dialog_id << " has_scheduled_server_messages to " << has_scheduled_server_messages; LOG(INFO) << "Set " << d->dialog_id << " has_scheduled_server_messages to " << has_scheduled_server_messages;
send_update_chat_has_scheduled_messages(d); send_update_chat_has_scheduled_messages(d, false);
} }
void MessagesManager::set_dialog_has_scheduled_database_messages(DialogId dialog_id, void MessagesManager::set_dialog_has_scheduled_database_messages(DialogId dialog_id,
@ -29285,7 +29301,7 @@ MessagesManager::Message *MessagesManager::continue_send_message(DialogId dialog
add_message_to_dialog(d, std::move(m), true, &need_update, &need_update_dialog_pos, "resend message"); add_message_to_dialog(d, std::move(m), true, &need_update, &need_update_dialog_pos, "resend message");
CHECK(result_message != nullptr); CHECK(result_message != nullptr);
send_update_chat_has_scheduled_messages(d); send_update_chat_has_scheduled_messages(d, false);
send_update_new_message(d, result_message); send_update_new_message(d, result_message);
if (need_update_dialog_pos) { if (need_update_dialog_pos) {
@ -29500,7 +29516,7 @@ void MessagesManager::on_binlog_events(vector<BinlogEvent> &&events) {
send_update_new_message(to_dialog, forwarded_messages.back()); send_update_new_message(to_dialog, forwarded_messages.back());
} }
send_update_chat_has_scheduled_messages(to_dialog); send_update_chat_has_scheduled_messages(to_dialog, false);
if (need_update_dialog_pos) { if (need_update_dialog_pos) {
send_update_chat_last_message(to_dialog, "on_reforward_message"); send_update_chat_last_message(to_dialog, "on_reforward_message");

View File

@ -1068,6 +1068,7 @@ class MessagesManager : public Actor {
MessageId max_notification_message_id; MessageId max_notification_message_id;
MessageId last_edited_message_id; MessageId last_edited_message_id;
uint32 scheduled_messages_sync_generation = 0; uint32 scheduled_messages_sync_generation = 0;
uint32 last_repair_scheduled_messages_generation = 0;
MessageId max_added_message_id; MessageId max_added_message_id;
MessageId being_added_message_id; MessageId being_added_message_id;
@ -1926,7 +1927,7 @@ class MessagesManager : public Actor {
void send_update_chat_action_bar(const Dialog *d); void send_update_chat_action_bar(const Dialog *d);
void send_update_chat_has_scheduled_messages(Dialog *d); void send_update_chat_has_scheduled_messages(Dialog *d, bool from_deletion);
void hide_dialog_action_bar(Dialog *d); void hide_dialog_action_bar(Dialog *d);
@ -1993,7 +1994,7 @@ class MessagesManager : public Actor {
void set_dialog_pinned_message_id(Dialog *d, MessageId pinned_message_id); void set_dialog_pinned_message_id(Dialog *d, MessageId pinned_message_id);
void repair_dialog_scheduled_messages(DialogId dialog_id); void repair_dialog_scheduled_messages(Dialog *d);
void set_dialog_has_scheduled_server_messages(Dialog *d, bool has_scheduled_server_messages); void set_dialog_has_scheduled_server_messages(Dialog *d, bool has_scheduled_server_messages);