From 0184df07f310907698cf9694ff34e089b9bb0c11 Mon Sep 17 00:00:00 2001 From: levlam Date: Sat, 4 May 2019 01:03:10 +0300 Subject: [PATCH] Probably fix race in reusing notification group. GitOrigin-RevId: d7359c1d22ad7aecead1844696915c3946c158dc --- 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 e93682bd..86bca310 100644 --- a/td/telegram/MessagesManager.cpp +++ b/td/telegram/MessagesManager.cpp @@ -4390,8 +4390,10 @@ void MessagesManager::save_dialog_to_database(DialogId dialog_id) { CHECK(d != nullptr); LOG(INFO) << "Save " << dialog_id << " to database"; vector changed_group_keys; + bool can_reuse_notification_group = false; auto add_group_key = [&](auto &group_info) { if (group_info.is_changed) { + can_reuse_notification_group |= group_info.try_reuse; changed_group_keys.emplace_back(group_info.group_id, group_info.try_reuse ? DialogId() : dialog_id, group_info.last_notification_date); group_info.is_changed = false; @@ -4401,15 +4403,16 @@ void MessagesManager::save_dialog_to_database(DialogId dialog_id) { add_group_key(d->mention_notification_group); G()->td_db()->get_dialog_db_async()->add_dialog( dialog_id, d->order, get_dialog_database_value(d), std::move(changed_group_keys), - PromiseCreator::lambda([dialog_id](Result<> result) { - send_closure(G()->messages_manager(), &MessagesManager::on_save_dialog_to_database, dialog_id, result.is_ok()); + PromiseCreator::lambda([dialog_id, can_reuse_notification_group](Result<> result) { + send_closure(G()->messages_manager(), &MessagesManager::on_save_dialog_to_database, dialog_id, + can_reuse_notification_group, result.is_ok()); })); } -void MessagesManager::on_save_dialog_to_database(DialogId dialog_id, bool success) { +void MessagesManager::on_save_dialog_to_database(DialogId dialog_id, bool can_reuse_notification_group, bool success) { LOG(INFO) << "Successfully saved " << dialog_id << " to database"; - if (success) { + if (success && can_reuse_notification_group) { auto d = get_dialog(dialog_id); CHECK(d != nullptr); try_reuse_notification_group(d->message_notification_group); @@ -4423,11 +4426,11 @@ void MessagesManager::try_reuse_notification_group(NotificationGroupInfo &group_ if (!group_info.try_reuse) { return; } - group_info.try_reuse = false; if (group_info.is_changed) { LOG(ERROR) << "Failed to reuse changed " << group_info.group_id; return; } + group_info.try_reuse = false; if (!group_info.group_id.is_valid()) { LOG(ERROR) << "Failed to reuse invalid " << group_info.group_id; return; diff --git a/td/telegram/MessagesManager.h b/td/telegram/MessagesManager.h index 3eecda2e..1dba41a7 100644 --- a/td/telegram/MessagesManager.h +++ b/td/telegram/MessagesManager.h @@ -1540,7 +1540,7 @@ class MessagesManager : public Actor { void save_dialog_to_database(DialogId dialog_id); - void on_save_dialog_to_database(DialogId dialog_id, bool success); + void on_save_dialog_to_database(DialogId dialog_id, bool can_reuse_notification_group, bool success); void try_reuse_notification_group(NotificationGroupInfo &group_info);