Use send_closure_later to load *Full to exclude possibility of loading them from the database synchronously and invoke some side effects such as message loading synchronously.
GitOrigin-RevId: 4c97db4ce3fd517274380eb9eea8e586c6f04399
This commit is contained in:
parent
621c920655
commit
e283ad8ac6
@ -8351,7 +8351,7 @@ void ContactsManager::on_load_user_full_from_database(UserId user_id, string val
|
|||||||
if (is_user_deleted(user_id)) {
|
if (is_user_deleted(user_id)) {
|
||||||
drop_user_full(user_id);
|
drop_user_full(user_id);
|
||||||
} else if (user_full->expires_at == 0.0) {
|
} else if (user_full->expires_at == 0.0) {
|
||||||
get_user_full(user_id, true, Auto());
|
load_user_full(user_id, true, Auto());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -8618,7 +8618,7 @@ void ContactsManager::on_load_channel_full_from_database(ChannelId channel_id, s
|
|||||||
update_channel_full(channel_full, channel_id, true);
|
update_channel_full(channel_full, channel_id, true);
|
||||||
|
|
||||||
if (channel_full->expires_at == 0.0) {
|
if (channel_full->expires_at == 0.0) {
|
||||||
get_channel_full(channel_id, true, Auto());
|
load_channel_full(channel_id, true, Auto());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -10086,7 +10086,7 @@ bool ContactsManager::delete_profile_photo_from_cache(UserId user_id, int64 prof
|
|||||||
user_full->photo = Photo();
|
user_full->photo = Photo();
|
||||||
user_full->is_changed = true;
|
user_full->is_changed = true;
|
||||||
|
|
||||||
get_user_full(user_id, true, Auto());
|
load_user_full(user_id, true, Auto());
|
||||||
}
|
}
|
||||||
if (send_updates) {
|
if (send_updates) {
|
||||||
update_user_full(user_full, user_id);
|
update_user_full(user_full, user_id);
|
||||||
@ -10146,7 +10146,7 @@ void ContactsManager::drop_user_photos(UserId user_id, bool is_empty, bool drop_
|
|||||||
user_full->expires_at = 0.0;
|
user_full->expires_at = 0.0;
|
||||||
user_full->need_save_to_database = true;
|
user_full->need_save_to_database = true;
|
||||||
}
|
}
|
||||||
get_user_full(user_id, true, Auto());
|
load_user_full(user_id, true, Auto());
|
||||||
}
|
}
|
||||||
update_user_full(user_full, user_id);
|
update_user_full(user_full, user_id);
|
||||||
}
|
}
|
||||||
@ -12355,7 +12355,7 @@ void ContactsManager::reload_user(UserId user_id, Promise<Unit> &&promise) {
|
|||||||
td_->create_handler<GetUsersQuery>(std::move(promise))->send(std::move(users));
|
td_->create_handler<GetUsersQuery>(std::move(promise))->send(std::move(users));
|
||||||
}
|
}
|
||||||
|
|
||||||
bool ContactsManager::get_user_full(UserId user_id, bool force, Promise<Unit> &&promise) {
|
bool ContactsManager::load_user_full(UserId user_id, bool force, Promise<Unit> &&promise) {
|
||||||
auto u = get_user(user_id);
|
auto u = get_user(user_id);
|
||||||
if (u == nullptr) {
|
if (u == nullptr) {
|
||||||
promise.set_error(Status::Error(6, "User not found"));
|
promise.set_error(Status::Error(6, "User not found"));
|
||||||
@ -12370,17 +12370,17 @@ bool ContactsManager::get_user_full(UserId user_id, bool force, Promise<Unit> &&
|
|||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
send_get_user_full_query(user_id, std::move(input_user), std::move(promise), "get_user_full");
|
send_get_user_full_query(user_id, std::move(input_user), std::move(promise), "load_user_full");
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
if (user_full->is_expired() || is_bot_info_expired(user_id, u->bot_info_version)) {
|
if (user_full->is_expired() || is_bot_info_expired(user_id, u->bot_info_version)) {
|
||||||
auto input_user = get_input_user(user_id);
|
auto input_user = get_input_user(user_id);
|
||||||
CHECK(input_user != nullptr);
|
CHECK(input_user != nullptr);
|
||||||
if (td_->auth_manager_->is_bot() && !force) {
|
if (td_->auth_manager_->is_bot() && !force) {
|
||||||
send_get_user_full_query(user_id, std::move(input_user), std::move(promise), "get expired user_full");
|
send_get_user_full_query(user_id, std::move(input_user), std::move(promise), "load expired user_full");
|
||||||
return false;
|
return false;
|
||||||
} else {
|
} else {
|
||||||
send_get_user_full_query(user_id, std::move(input_user), Auto(), "get expired user_full");
|
send_get_user_full_query(user_id, std::move(input_user), Auto(), "load expired user_full");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -12683,7 +12683,7 @@ bool ContactsManager::is_chat_full_outdated(const ChatFull *chat_full, const Cha
|
|||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool ContactsManager::get_chat_full(ChatId chat_id, bool force, Promise<Unit> &&promise) {
|
bool ContactsManager::load_chat_full(ChatId chat_id, bool force, Promise<Unit> &&promise) {
|
||||||
auto c = get_chat(chat_id);
|
auto c = get_chat(chat_id);
|
||||||
if (c == nullptr) {
|
if (c == nullptr) {
|
||||||
promise.set_error(Status::Error(6, "Group not found"));
|
promise.set_error(Status::Error(6, "Group not found"));
|
||||||
@ -12693,17 +12693,17 @@ bool ContactsManager::get_chat_full(ChatId chat_id, bool force, Promise<Unit> &&
|
|||||||
auto chat_full = get_chat_full_force(chat_id);
|
auto chat_full = get_chat_full_force(chat_id);
|
||||||
if (chat_full == nullptr) {
|
if (chat_full == nullptr) {
|
||||||
LOG(INFO) << "Full " << chat_id << " not found";
|
LOG(INFO) << "Full " << chat_id << " not found";
|
||||||
send_get_chat_full_query(chat_id, std::move(promise), "get_chat_full");
|
send_get_chat_full_query(chat_id, std::move(promise), "load_chat_full");
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (is_chat_full_outdated(chat_full, c, chat_id)) {
|
if (is_chat_full_outdated(chat_full, c, chat_id)) {
|
||||||
LOG(INFO) << "Have outdated full " << chat_id;
|
LOG(INFO) << "Have outdated full " << chat_id;
|
||||||
if (td_->auth_manager_->is_bot() && !force) {
|
if (td_->auth_manager_->is_bot() && !force) {
|
||||||
send_get_chat_full_query(chat_id, std::move(promise), "get expired chat_full");
|
send_get_chat_full_query(chat_id, std::move(promise), "load expired chat_full");
|
||||||
return false;
|
return false;
|
||||||
} else {
|
} else {
|
||||||
send_get_chat_full_query(chat_id, Auto(), "get expired chat_full");
|
send_get_chat_full_query(chat_id, Auto(), "load expired chat_full");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -12990,19 +12990,19 @@ ContactsManager::ChannelFull *ContactsManager::add_channel_full(ChannelId channe
|
|||||||
return channel_full_ptr.get();
|
return channel_full_ptr.get();
|
||||||
}
|
}
|
||||||
|
|
||||||
bool ContactsManager::get_channel_full(ChannelId channel_id, bool force, Promise<Unit> &&promise) {
|
bool ContactsManager::load_channel_full(ChannelId channel_id, bool force, Promise<Unit> &&promise) {
|
||||||
auto channel_full = get_channel_full_force(channel_id, "get_channel_full");
|
auto channel_full = get_channel_full_force(channel_id, "load_channel_full");
|
||||||
if (channel_full == nullptr) {
|
if (channel_full == nullptr) {
|
||||||
send_get_channel_full_query(channel_full, channel_id, std::move(promise), "get_channel_full");
|
send_get_channel_full_query(channel_full, channel_id, std::move(promise), "load_channel_full");
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
if (channel_full->is_expired()) {
|
if (channel_full->is_expired()) {
|
||||||
if (td_->auth_manager_->is_bot() && !force) {
|
if (td_->auth_manager_->is_bot() && !force) {
|
||||||
send_get_channel_full_query(channel_full, channel_id, std::move(promise), "get expired channel_full");
|
send_get_channel_full_query(channel_full, channel_id, std::move(promise), "load expired channel_full");
|
||||||
return false;
|
return false;
|
||||||
} else {
|
} else {
|
||||||
// request has already been sent in get_channel_full_force
|
// request has already been sent in get_channel_full_force
|
||||||
// send_get_channel_full_query(channel_full, channel_id, Auto(), "get expired channel_full");
|
// send_get_channel_full_query(channel_full, channel_id, Auto(), "load expired channel_full");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -13170,7 +13170,7 @@ DialogParticipant ContactsManager::get_chat_participant(ChatId chat_id, UserId u
|
|||||||
LOG(INFO) << "Trying to get " << user_id << " as member of " << chat_id;
|
LOG(INFO) << "Trying to get " << user_id << " as member of " << chat_id;
|
||||||
if (force) {
|
if (force) {
|
||||||
promise.set_value(Unit());
|
promise.set_value(Unit());
|
||||||
} else if (!get_chat_full(chat_id, force, std::move(promise))) {
|
} else if (!load_chat_full(chat_id, force, std::move(promise))) {
|
||||||
return DialogParticipant();
|
return DialogParticipant();
|
||||||
}
|
}
|
||||||
// promise is already set
|
// promise is already set
|
||||||
@ -13195,7 +13195,7 @@ std::pair<int32, vector<DialogParticipant>> ContactsManager::search_chat_partici
|
|||||||
|
|
||||||
if (force) {
|
if (force) {
|
||||||
promise.set_value(Unit());
|
promise.set_value(Unit());
|
||||||
} else if (!get_chat_full(chat_id, force, std::move(promise))) {
|
} else if (!load_chat_full(chat_id, force, std::move(promise))) {
|
||||||
return {};
|
return {};
|
||||||
}
|
}
|
||||||
// promise is already set
|
// promise is already set
|
||||||
@ -13507,7 +13507,7 @@ void ContactsManager::on_update_dialog_administrators(DialogId dialog_id, vector
|
|||||||
void ContactsManager::reload_dialog_administrators(DialogId dialog_id, int32 hash, Promise<Unit> &&promise) {
|
void ContactsManager::reload_dialog_administrators(DialogId dialog_id, int32 hash, Promise<Unit> &&promise) {
|
||||||
switch (dialog_id.get_type()) {
|
switch (dialog_id.get_type()) {
|
||||||
case DialogType::Chat:
|
case DialogType::Chat:
|
||||||
get_chat_full(dialog_id.get_chat_id(), false, std::move(promise));
|
load_chat_full(dialog_id.get_chat_id(), false, std::move(promise));
|
||||||
break;
|
break;
|
||||||
case DialogType::Channel:
|
case DialogType::Channel:
|
||||||
td_->create_handler<GetChannelAdministratorsQuery>(std::move(promise))->send(dialog_id.get_channel_id(), hash);
|
td_->create_handler<GetChannelAdministratorsQuery>(std::move(promise))->send(dialog_id.get_channel_id(), hash);
|
||||||
|
@ -435,7 +435,7 @@ class ContactsManager : public Actor {
|
|||||||
UserId get_me(Promise<Unit> &&promise);
|
UserId get_me(Promise<Unit> &&promise);
|
||||||
bool get_user(UserId user_id, int left_tries, Promise<Unit> &&promise);
|
bool get_user(UserId user_id, int left_tries, Promise<Unit> &&promise);
|
||||||
void reload_user(UserId user_id, Promise<Unit> &&promise);
|
void reload_user(UserId user_id, Promise<Unit> &&promise);
|
||||||
bool get_user_full(UserId user_id, bool force, Promise<Unit> &&promise);
|
bool load_user_full(UserId user_id, bool force, Promise<Unit> &&promise);
|
||||||
void reload_user_full(UserId user_id);
|
void reload_user_full(UserId user_id);
|
||||||
|
|
||||||
std::pair<int32, vector<const Photo *>> get_user_profile_photos(UserId user_id, int32 offset, int32 limit,
|
std::pair<int32, vector<const Photo *>> get_user_profile_photos(UserId user_id, int32 offset, int32 limit,
|
||||||
@ -447,7 +447,7 @@ class ContactsManager : public Actor {
|
|||||||
bool have_chat_force(ChatId chat_id);
|
bool have_chat_force(ChatId chat_id);
|
||||||
bool get_chat(ChatId chat_id, int left_tries, Promise<Unit> &&promise);
|
bool get_chat(ChatId chat_id, int left_tries, Promise<Unit> &&promise);
|
||||||
void reload_chat(ChatId chat_id, Promise<Unit> &&promise);
|
void reload_chat(ChatId chat_id, Promise<Unit> &&promise);
|
||||||
bool get_chat_full(ChatId chat_id, bool force, Promise<Unit> &&promise);
|
bool load_chat_full(ChatId chat_id, bool force, Promise<Unit> &&promise);
|
||||||
FileSourceId get_chat_full_file_source_id(ChatId chat_id);
|
FileSourceId get_chat_full_file_source_id(ChatId chat_id);
|
||||||
void reload_chat_full(ChatId chat_id, Promise<Unit> &&promise);
|
void reload_chat_full(ChatId chat_id, Promise<Unit> &&promise);
|
||||||
|
|
||||||
@ -461,7 +461,7 @@ class ContactsManager : public Actor {
|
|||||||
bool have_channel_force(ChannelId channel_id);
|
bool have_channel_force(ChannelId channel_id);
|
||||||
bool get_channel(ChannelId channel_id, int left_tries, Promise<Unit> &&promise);
|
bool get_channel(ChannelId channel_id, int left_tries, Promise<Unit> &&promise);
|
||||||
void reload_channel(ChannelId chnanel_id, Promise<Unit> &&promise);
|
void reload_channel(ChannelId chnanel_id, Promise<Unit> &&promise);
|
||||||
bool get_channel_full(ChannelId channel_id, bool force, Promise<Unit> &&promise);
|
bool load_channel_full(ChannelId channel_id, bool force, Promise<Unit> &&promise);
|
||||||
FileSourceId get_channel_full_file_source_id(ChannelId channel_id);
|
FileSourceId get_channel_full_file_source_id(ChannelId channel_id);
|
||||||
void reload_channel_full(ChannelId channel_id, Promise<Unit> &&promise, const char *source);
|
void reload_channel_full(ChannelId channel_id, Promise<Unit> &&promise, const char *source);
|
||||||
|
|
||||||
|
@ -6395,7 +6395,8 @@ bool MessagesManager::is_active_message_reply_info(DialogId dialog_id, const Mes
|
|||||||
auto linked_channel_id = td_->contacts_manager_->get_channel_linked_channel_id(channel_id);
|
auto linked_channel_id = td_->contacts_manager_->get_channel_linked_channel_id(channel_id);
|
||||||
if (!linked_channel_id.is_valid()) {
|
if (!linked_channel_id.is_valid()) {
|
||||||
// keep the comment button while linked channel is unknown
|
// keep the comment button while linked channel is unknown
|
||||||
td_->contacts_manager_->get_channel_full(channel_id, true, Auto());
|
send_closure_later(G()->contacts_manager(), &ContactsManager::load_channel_full, channel_id, false,
|
||||||
|
Promise<Unit>());
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -10546,7 +10547,7 @@ void MessagesManager::repair_channel_server_unread_count(Dialog *d) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
LOG(INFO) << "Reload ChannelFull for " << d->dialog_id << " to repair unread message counts";
|
LOG(INFO) << "Reload ChannelFull for " << d->dialog_id << " to repair unread message counts";
|
||||||
td_->contacts_manager_->get_channel_full(d->dialog_id.get_channel_id(), false, Promise<Unit>());
|
get_dialog_info_full(d->dialog_id, Promise<Unit>());
|
||||||
}
|
}
|
||||||
|
|
||||||
void MessagesManager::read_history_inbox(DialogId dialog_id, MessageId max_message_id, int32 unread_count,
|
void MessagesManager::read_history_inbox(DialogId dialog_id, MessageId max_message_id, int32 unread_count,
|
||||||
@ -15859,13 +15860,16 @@ void MessagesManager::on_get_discussion_message(DialogId dialog_id, MessageId me
|
|||||||
void MessagesManager::get_dialog_info_full(DialogId dialog_id, Promise<Unit> &&promise) {
|
void MessagesManager::get_dialog_info_full(DialogId dialog_id, Promise<Unit> &&promise) {
|
||||||
switch (dialog_id.get_type()) {
|
switch (dialog_id.get_type()) {
|
||||||
case DialogType::User:
|
case DialogType::User:
|
||||||
td_->contacts_manager_->get_user_full(dialog_id.get_user_id(), false, std::move(promise));
|
send_closure_later(G()->contacts_manager(), &ContactsManager::load_user_full, dialog_id.get_user_id(), false,
|
||||||
|
std::move(promise));
|
||||||
return;
|
return;
|
||||||
case DialogType::Chat:
|
case DialogType::Chat:
|
||||||
td_->contacts_manager_->get_chat_full(dialog_id.get_chat_id(), false, std::move(promise));
|
send_closure_later(G()->contacts_manager(), &ContactsManager::load_chat_full, dialog_id.get_chat_id(), false,
|
||||||
|
std::move(promise));
|
||||||
return;
|
return;
|
||||||
case DialogType::Channel:
|
case DialogType::Channel:
|
||||||
td_->contacts_manager_->get_channel_full(dialog_id.get_channel_id(), false, std::move(promise));
|
send_closure_later(G()->contacts_manager(), &ContactsManager::load_channel_full, dialog_id.get_channel_id(),
|
||||||
|
false, std::move(promise));
|
||||||
return;
|
return;
|
||||||
case DialogType::SecretChat:
|
case DialogType::SecretChat:
|
||||||
return promise.set_value(Unit());
|
return promise.set_value(Unit());
|
||||||
@ -28514,6 +28518,7 @@ void MessagesManager::set_dialog_folder_id_on_server(DialogId dialog_id, bool fr
|
|||||||
|
|
||||||
Promise<> promise;
|
Promise<> promise;
|
||||||
if (d->set_folder_id_logevent_id.logevent_id != 0) {
|
if (d->set_folder_id_logevent_id.logevent_id != 0) {
|
||||||
|
d->set_folder_id_logevent_id.generation++;
|
||||||
promise = PromiseCreator::lambda([actor_id = actor_id(this), dialog_id,
|
promise = PromiseCreator::lambda([actor_id = actor_id(this), dialog_id,
|
||||||
generation = d->set_folder_id_logevent_id.generation](Result<Unit> result) {
|
generation = d->set_folder_id_logevent_id.generation](Result<Unit> result) {
|
||||||
if (!G()->close_flag()) {
|
if (!G()->close_flag()) {
|
||||||
@ -34401,7 +34406,6 @@ void MessagesManager::on_binlog_events(vector<BinlogEvent> &&events) {
|
|||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
d->set_folder_id_logevent_id.logevent_id = event.id_;
|
d->set_folder_id_logevent_id.logevent_id = event.id_;
|
||||||
d->set_folder_id_logevent_id.generation++;
|
|
||||||
|
|
||||||
set_dialog_folder_id(d, log_event.folder_id_);
|
set_dialog_folder_id(d, log_event.folder_id_);
|
||||||
|
|
||||||
|
@ -690,7 +690,7 @@ class GetUserFullInfoRequest : public RequestActor<> {
|
|||||||
UserId user_id_;
|
UserId user_id_;
|
||||||
|
|
||||||
void do_run(Promise<Unit> &&promise) override {
|
void do_run(Promise<Unit> &&promise) override {
|
||||||
td->contacts_manager_->get_user_full(user_id_, get_tries() < 2, std::move(promise));
|
td->contacts_manager_->load_user_full(user_id_, get_tries() < 2, std::move(promise));
|
||||||
}
|
}
|
||||||
|
|
||||||
void do_send_result() override {
|
void do_send_result() override {
|
||||||
@ -725,7 +725,7 @@ class GetGroupFullInfoRequest : public RequestActor<> {
|
|||||||
ChatId chat_id_;
|
ChatId chat_id_;
|
||||||
|
|
||||||
void do_run(Promise<Unit> &&promise) override {
|
void do_run(Promise<Unit> &&promise) override {
|
||||||
td->contacts_manager_->get_chat_full(chat_id_, get_tries() < 2, std::move(promise));
|
td->contacts_manager_->load_chat_full(chat_id_, get_tries() < 2, std::move(promise));
|
||||||
}
|
}
|
||||||
|
|
||||||
void do_send_result() override {
|
void do_send_result() override {
|
||||||
@ -760,7 +760,7 @@ class GetSupergroupFullInfoRequest : public RequestActor<> {
|
|||||||
ChannelId channel_id_;
|
ChannelId channel_id_;
|
||||||
|
|
||||||
void do_run(Promise<Unit> &&promise) override {
|
void do_run(Promise<Unit> &&promise) override {
|
||||||
td->contacts_manager_->get_channel_full(channel_id_, get_tries() < 2, std::move(promise));
|
td->contacts_manager_->load_channel_full(channel_id_, get_tries() < 2, std::move(promise));
|
||||||
}
|
}
|
||||||
|
|
||||||
void do_send_result() override {
|
void do_send_result() override {
|
||||||
|
Loading…
Reference in New Issue
Block a user