From 32dcdcffc5d0b5491dfad7a8d1b6c32fcf452151 Mon Sep 17 00:00:00 2001 From: Arseny Smirnov Date: Tue, 27 Feb 2018 22:47:14 +0300 Subject: [PATCH] FileLoadManager: separate resource manager for each datacenter GitOrigin-RevId: c61103110d8f4d245e784c7f0e047c349c8840ae --- td/telegram/files/FileLoadManager.cpp | 16 +++++++++++----- td/telegram/files/FileLoadManager.h | 5 +++-- 2 files changed, 14 insertions(+), 7 deletions(-) diff --git a/td/telegram/files/FileLoadManager.cpp b/td/telegram/files/FileLoadManager.cpp index 10246d7f8..d4c570982 100644 --- a/td/telegram/files/FileLoadManager.cpp +++ b/td/telegram/files/FileLoadManager.cpp @@ -22,10 +22,16 @@ void FileLoadManager::start_up() { create_actor("UploadResourceManager", !G()->parameters().use_file_db /*tdlib_engine*/ ? ResourceManager::Mode::Greedy : ResourceManager::Mode::Baseline); - download_resource_manager_ = - create_actor("DownloadResourceManager", ResourceManager::Mode::Baseline); - download_small_resource_manager_ = - create_actor("DownloadSmallResourceManager", ResourceManager::Mode::Baseline); +} + +ActorOwn &FileLoadManager::get_download_resource_manager(bool is_small, DcId dc_id) { + auto &actor = is_small ? download_small_resource_manager_map_[dc_id] : download_resource_manager_map_[dc_id]; + if (actor.empty()) { + actor = create_actor( + PSLICE() << "DownloadResourceManager " << tag("is_small", is_small) << tag("dc_id", dc_id), + ResourceManager::Mode::Baseline); + } + return actor; } void FileLoadManager::download(QueryId id, const FullRemoteFileLocation &remote_location, @@ -43,7 +49,7 @@ void FileLoadManager::download(QueryId id, const FullRemoteFileLocation &remote_ bool is_small = size < 20 * 1024; node->loader_ = create_actor("Downloader", remote_location, local, size, std::move(name), encryption_key, is_small, search_file, std::move(callback)); - auto &resource_manager = is_small ? download_small_resource_manager_ : download_resource_manager_; + auto &resource_manager = get_download_resource_manager(is_small, remote_location.get_dc_id()); send_closure(resource_manager, &ResourceManager::register_worker, ActorShared(node->loader_.get(), static_cast(-1)), priority); query_id_to_node_id_[id] = node_id; diff --git a/td/telegram/files/FileLoadManager.h b/td/telegram/files/FileLoadManager.h index e6f892ba2..d61df5d08 100644 --- a/td/telegram/files/FileLoadManager.h +++ b/td/telegram/files/FileLoadManager.h @@ -65,8 +65,8 @@ class FileLoadManager final : public Actor { }; using NodeId = uint64; - ActorOwn download_resource_manager_; - ActorOwn download_small_resource_manager_; + std::map> download_resource_manager_map_; + std::map> download_small_resource_manager_map_; ActorOwn upload_resource_manager_; Container nodes_container_; @@ -80,6 +80,7 @@ class FileLoadManager final : public Actor { void hangup_shared() override; void close_node(NodeId node_id); + ActorOwn &get_download_resource_manager(bool is_small, DcId dc_id); void on_start_download(); void on_partial_download(const PartialLocalFileLocation &partial_local, int64 ready_size);