Don't try to load active stories from database multiple times.

This commit is contained in:
levlam 2023-07-16 13:35:35 +03:00
parent 2e78aea606
commit 99bef75da4
2 changed files with 16 additions and 8 deletions

View File

@ -948,7 +948,7 @@ void StoryManager::on_story_reload_timeout(int64 story_global_id) {
auto story_full_id = stories_by_global_id_.get(story_global_id); auto story_full_id = stories_by_global_id_.get(story_global_id);
auto story = get_story(story_full_id); auto story = get_story(story_full_id);
if (story == nullptr || !opened_stories_.count(story_full_id)) { if (story == nullptr || opened_stories_.count(story_full_id) == 0) {
return; return;
} }
@ -1102,7 +1102,7 @@ StoryManager::Story *StoryManager::get_story_force(StoryFullId story_full_id, co
return story; return story;
} }
if (!G()->use_message_database() || failed_to_load_story_full_ids_.count(story_full_id) || if (!G()->use_message_database() || failed_to_load_story_full_ids_.count(story_full_id) > 0 ||
is_inaccessible_story(story_full_id) || deleted_story_full_ids_.count(story_full_id) > 0) { is_inaccessible_story(story_full_id) || deleted_story_full_ids_.count(story_full_id) > 0) {
return nullptr; return nullptr;
} }
@ -1209,13 +1209,14 @@ StoryManager::ActiveStories *StoryManager::get_active_stories_force(DialogId own
return active_stories; return active_stories;
} }
if (!G()->use_message_database()) { if (!G()->use_message_database() || failed_to_load_active_stories_.count(owner_dialog_id) > 0) {
return nullptr; return nullptr;
} }
LOG(INFO) << "Trying to load active stories of " << owner_dialog_id << " from database from " << source; LOG(INFO) << "Trying to load active stories of " << owner_dialog_id << " from database from " << source;
auto r_value = G()->td_db()->get_story_db_sync()->get_active_stories(owner_dialog_id); auto r_value = G()->td_db()->get_story_db_sync()->get_active_stories(owner_dialog_id);
if (r_value.is_error()) { if (r_value.is_error()) {
failed_to_load_active_stories_.insert(owner_dialog_id);
return nullptr; return nullptr;
} }
return on_get_active_stories_from_database(owner_dialog_id, r_value.ok(), source); return on_get_active_stories_from_database(owner_dialog_id, r_value.ok(), source);
@ -1224,21 +1225,23 @@ StoryManager::ActiveStories *StoryManager::get_active_stories_force(DialogId own
StoryManager::ActiveStories *StoryManager::on_get_active_stories_from_database(DialogId owner_dialog_id, StoryManager::ActiveStories *StoryManager::on_get_active_stories_from_database(DialogId owner_dialog_id,
const BufferSlice &value, const BufferSlice &value,
const char *source) { const char *source) {
if (value.empty()) {
return nullptr;
}
auto active_stories = get_active_stories_editable(owner_dialog_id); auto active_stories = get_active_stories_editable(owner_dialog_id);
if (active_stories != nullptr) { if (active_stories != nullptr) {
return active_stories; return active_stories;
} }
if (value.empty()) {
failed_to_load_active_stories_.insert(owner_dialog_id);
return nullptr;
}
SavedActiveStories saved_active_stories; SavedActiveStories saved_active_stories;
auto status = log_event_parse(saved_active_stories, value.as_slice()); auto status = log_event_parse(saved_active_stories, value.as_slice());
if (status.is_error()) { if (status.is_error()) {
LOG(ERROR) << "Receive invalid active stories in " << owner_dialog_id << " from database: " << status << ' ' LOG(ERROR) << "Receive invalid active stories in " << owner_dialog_id << " from database: " << status << ' '
<< format::as_hex_dump<4>(value.as_slice()); << format::as_hex_dump<4>(value.as_slice());
save_active_stories(owner_dialog_id, nullptr); save_active_stories(owner_dialog_id, nullptr);
failed_to_load_active_stories_.insert(owner_dialog_id);
return nullptr; return nullptr;
} }
@ -1624,7 +1627,7 @@ uint64 StoryManager::save_load_dialog_expiring_stories_log_event(DialogId owner_
} }
void StoryManager::load_dialog_expiring_stories(DialogId owner_dialog_id, uint64 log_event_id, const char *source) { void StoryManager::load_dialog_expiring_stories(DialogId owner_dialog_id, uint64 log_event_id, const char *source) {
if (load_expiring_stories_log_event_ids_.count(owner_dialog_id)) { if (load_expiring_stories_log_event_ids_.count(owner_dialog_id) > 0) {
if (log_event_id != 0) { if (log_event_id != 0) {
binlog_erase(G()->td_db()->get_binlog(), log_event_id); binlog_erase(G()->td_db()->get_binlog(), log_event_id);
} }
@ -2706,8 +2709,11 @@ void StoryManager::on_update_active_stories(DialogId owner_dialog_id, StoryId ma
} else { } else {
max_read_story_ids_.erase(owner_dialog_id); max_read_story_ids_.erase(owner_dialog_id);
} }
failed_to_load_active_stories_.insert(owner_dialog_id);
return; return;
} }
failed_to_load_active_stories_.erase(owner_dialog_id);
if (owner_dialog_id == DialogId(td_->contacts_manager_->get_my_id())) { if (owner_dialog_id == DialogId(td_->contacts_manager_->get_my_id())) {
max_read_story_id = StoryId::max(); max_read_story_id = StoryId::max();
} }

View File

@ -498,6 +498,8 @@ class StoryManager final : public Actor {
WaitFreeHashMap<DialogId, StoryId, DialogIdHash> max_read_story_ids_; WaitFreeHashMap<DialogId, StoryId, DialogIdHash> max_read_story_ids_;
WaitFreeHashSet<DialogId, DialogIdHash> failed_to_load_active_stories_;
FlatHashMap<DialogId, uint64, DialogIdHash> load_expiring_stories_log_event_ids_; FlatHashMap<DialogId, uint64, DialogIdHash> load_expiring_stories_log_event_ids_;
FlatHashMap<StoryFullId, unique_ptr<BeingEditedStory>, StoryFullIdHash> being_edited_stories_; FlatHashMap<StoryFullId, unique_ptr<BeingEditedStory>, StoryFullIdHash> being_edited_stories_;