From c252e9ceb5d43e1794532cc3f9bf4e2c3b23adc6 Mon Sep 17 00:00:00 2001 From: levlam Date: Thu, 27 Dec 2018 20:23:19 +0300 Subject: [PATCH] Add source to try_flush_node. GitOrigin-RevId: 7cf8c352d6d3c5158adb0ee867e52538075950d1 --- td/telegram/files/FileManager.cpp | 52 +++++++++++++++++++------------ td/telegram/files/FileManager.h | 6 ++-- 2 files changed, 35 insertions(+), 23 deletions(-) diff --git a/td/telegram/files/FileManager.cpp b/td/telegram/files/FileManager.cpp index 479cbf488..d75a5356e 100644 --- a/td/telegram/files/FileManager.cpp +++ b/td/telegram/files/FileManager.cpp @@ -687,7 +687,7 @@ Status FileManager::check_local_location(FileNodePtr node) { } if (status.is_error()) { node->drop_local_location(); - try_flush_node(node); + try_flush_node(node, "check_local_location"); } return status; } @@ -746,7 +746,7 @@ void FileManager::on_file_unlink(const FullLocalFileLocation &location) { auto file_node = get_sync_file_node(file_id); CHECK(file_node); file_node->drop_local_location(); - try_flush_node_info(file_node); + try_flush_node_info(file_node, "on_file_unlink"); } Result FileManager::register_local(FullLocalFileLocation location, DialogId owner_dialog_id, int64 size, @@ -904,7 +904,7 @@ Result FileManager::register_file(FileData data, FileLocationSource file merge(file_id, id, no_sync_merge).ignore(); } - try_flush_node(get_file_node(file_id)); + try_flush_node(get_file_node(file_id), "register_file"); auto main_file_id = get_file_node(file_id)->main_file_id_; try_forget_file_id(file_id); return FileId(main_file_id.get(), remote_key); @@ -1272,13 +1272,13 @@ Result FileManager::merge(FileId x_file_id, FileId y_file_id, bool no_sy // node might not changed, but we need to merge nodes in pmc anyway node->on_pmc_changed(); } - try_flush_node(node, node_i != remote_i, node_i != local_i, node_i != generate_i, other_pmc_id); + try_flush_node_full(node, node_i != remote_i, node_i != local_i, node_i != generate_i, other_pmc_id); return node->main_file_id_; } -void FileManager::try_flush_node(FileNodePtr node, bool new_remote, bool new_local, bool new_generate, - FileDbId other_pmc_id) { +void FileManager::try_flush_node_full(FileNodePtr node, bool new_remote, bool new_local, bool new_generate, + FileDbId other_pmc_id) { if (node->need_pmc_flush()) { if (file_db_) { load_from_pmc(node, true, true, true); @@ -1290,15 +1290,27 @@ void FileManager::try_flush_node(FileNodePtr node, bool new_remote, bool new_loc node->on_pmc_flushed(); } - try_flush_node_info(node); + try_flush_node_info(node, "try_flush_node_full"); } -void FileManager::try_flush_node_info(FileNodePtr node) { +void FileManager::try_flush_node(FileNodePtr node, const char *source) { + if (node->need_pmc_flush()) { + if (file_db_) { + load_from_pmc(node, true, true, true); + flush_to_pmc(node, false, false, false); + } + node->on_pmc_flushed(); + } + + try_flush_node_info(node, source); +} + +void FileManager::try_flush_node_info(FileNodePtr node, const char *source) { if (node->need_info_flush()) { for (auto file_id : vector(node->file_ids_)) { auto *info = get_file_id_info(file_id); if (info->send_updates_flag_) { - VLOG(update_file) << "Send UpdateFile about file " << file_id; + VLOG(update_file) << "Send UpdateFile about file " << file_id << " from " << source; context_->on_file_updated(file_id); } } @@ -1457,7 +1469,7 @@ bool FileManager::set_encryption_key(FileId file_id, FileEncryptionKey key) { return false; } node->set_encryption_key(std::move(key)); - try_flush_node(node); + try_flush_node(node, "set_encryption_key"); return true; } @@ -1529,7 +1541,7 @@ void FileManager::delete_file(FileId file_id, Promise promise, const char unlink(file_view.local_location().path_).ignore(); context_->on_new_file(-file_view.size()); node->drop_local_location(); - try_flush_node(node); + try_flush_node(node, "delete_file 1"); } } else { if (file_view.get_type() == FileType::Encrypted) { @@ -1539,7 +1551,7 @@ void FileManager::delete_file(FileId file_id, Promise promise, const char LOG(INFO) << "Unlink partial file " << file_id << " at " << node->local_.partial().path_; unlink(node->local_.partial().path_).ignore(); node->drop_local_location(); - try_flush_node(node); + try_flush_node(node, "delete_file 2"); } } @@ -1608,7 +1620,7 @@ void FileManager::download(FileId file_id, std::shared_ptr cal run_generate(node); run_download(node); - try_flush_node(node); + try_flush_node(node, "download"); } void FileManager::download_set_offset(FileId file_id, int64 offset) { @@ -1623,7 +1635,7 @@ void FileManager::download_set_offset(FileId file_id, int64 offset) { file_node->set_download_offset(offset); run_generate(file_node); run_download(file_node); - try_flush_node(file_node); + try_flush_node(file_node, "download_set_offset"); } void FileManager::run_download(FileNodePtr node) { @@ -1730,7 +1742,7 @@ void FileManager::resume_upload(FileId file_id, std::vector bad_parts, std: run_generate(node); run_upload(node, std::move(bad_parts)); - try_flush_node(node); + try_flush_node(node, "resume_upload"); } bool FileManager::delete_partial_remote_location(FileId file_id) { @@ -1763,7 +1775,7 @@ bool FileManager::delete_partial_remote_location(FileId file_id) { } run_upload(node, std::vector()); - try_flush_node(node); + try_flush_node(node, "delete_partial_remote_location"); return true; } @@ -2313,7 +2325,7 @@ void FileManager::on_partial_download(QueryId query_id, const PartialLocalFileLo file_node->set_size(size); } file_node->set_local_location(LocalFileLocation(partial_local), ready_size, -1, -1 /* TODO */); - try_flush_node(file_node); + try_flush_node(file_node, "on_partial_download"); } void FileManager::on_hash(QueryId query_id, string hash) { @@ -2358,7 +2370,7 @@ void FileManager::on_partial_upload(QueryId query_id, const PartialRemoteFileLoc } file_node->set_remote_location(RemoteFileLocation(partial_remote), FileLocationSource::None, ready_size); - try_flush_node(file_node); + try_flush_node(file_node, "on_partial_upload"); } void FileManager::on_download_ok(QueryId query_id, const FullLocalFileLocation &local, int64 size) { @@ -2498,7 +2510,7 @@ void FileManager::on_partial_generate(QueryId query_id, const PartialLocalFileLo LocalFileLocation(partial_local)); } - try_flush_node(file_node); + try_flush_node(file_node, "on_partial_generate"); } void FileManager::on_generate_ok(QueryId query_id, const FullLocalFileLocation &local) { @@ -2572,7 +2584,7 @@ void FileManager::on_error(QueryId query_id, Status status) { void FileManager::on_error_impl(FileNodePtr node, FileManager::Query::Type type, bool was_active, Status status) { SCOPE_EXIT { - try_flush_node(node); + try_flush_node(node, "on_error"); }; if (status.code() != 1 && !G()->close_flag()) { LOG(WARNING) << "Failed to upload/download/generate file: " << status << ". Query type = " << type diff --git a/td/telegram/files/FileManager.h b/td/telegram/files/FileManager.h index cb9fb5675..b432a3faa 100644 --- a/td/telegram/files/FileManager.h +++ b/td/telegram/files/FileManager.h @@ -460,9 +460,9 @@ class FileManager : public FileLoadManager::Callback { Status check_local_location(FileNodePtr node); Status check_local_location(FullLocalFileLocation &location, int64 &size); - void try_flush_node(FileNodePtr node, bool new_remote = false, bool new_local = false, bool new_generate = false, - FileDbId other_pmc_id = Auto()); - void try_flush_node_info(FileNodePtr node); + void try_flush_node_full(FileNodePtr node, bool new_remote, bool new_local, bool new_generate, FileDbId other_pmc_id); + void try_flush_node(FileNodePtr node, const char *source); + void try_flush_node_info(FileNodePtr node, const char *source); void clear_from_pmc(FileNodePtr node); void flush_to_pmc(FileNodePtr node, bool new_remote, bool new_local, bool new_generate); void load_from_pmc(FileNodePtr node, bool new_remote, bool new_local, bool new_generate);