From 655add2ec0678b6544707c8c95b1bdc04222f34f Mon Sep 17 00:00:00 2001 From: Arseny Smirnov Date: Tue, 30 Jul 2019 21:27:39 +0300 Subject: [PATCH] PartsManager: some fixes GitOrigin-RevId: fedd9458f18179cdabef579cdc251f8006a3f61e --- td/telegram/files/FileLoader.cpp | 14 ++++++++++---- td/telegram/files/FileUploader.cpp | 6 +++++- td/telegram/files/PartsManager.cpp | 9 ++++++++- td/telegram/files/PartsManager.h | 1 + 4 files changed, 24 insertions(+), 6 deletions(-) diff --git a/td/telegram/files/FileLoader.cpp b/td/telegram/files/FileLoader.cpp index f9850c39..7f880a95 100644 --- a/td/telegram/files/FileLoader.cpp +++ b/td/telegram/files/FileLoader.cpp @@ -66,10 +66,12 @@ void FileLoader::update_local_file_location(const LocalFileLocation &local) { } void FileLoader::update_download_offset(int64 offset) { - parts_manager_.set_streaming_offset(offset); - //TODO: cancel only some queries - for (auto &it : part_map_) { - it.second.second.reset(); // cancel_query(it.second.second); + if (parts_manager_.get_streaming_offset() != offset) { + parts_manager_.set_streaming_offset(offset); + //TODO: cancel only some queries + for (auto &it : part_map_) { + it.second.second.reset(); // cancel_query(it.second.second); + } } update_estimated_limit(); loop(); @@ -279,6 +281,10 @@ void FileLoader::on_result(NetQueryPtr query) { } void FileLoader::on_part_query(Part part, NetQueryPtr query) { + if (stop_flag_) { + // important for secret chats + return; + } auto status = try_on_part_query(part, std::move(query)); if (status.is_error()) { on_error(std::move(status)); diff --git a/td/telegram/files/FileUploader.cpp b/td/telegram/files/FileUploader.cpp index ccc27cb8..95987599 100644 --- a/td/telegram/files/FileUploader.cpp +++ b/td/telegram/files/FileUploader.cpp @@ -119,6 +119,9 @@ Result FileUploader::on_update_local_location(const Loca file_type = location.partial().file_type_; } else { path = location.full().path_; + if (path.empty()) { + return Status::Error("FullLocalFileLocation whith empty path"); + } local_is_ready = true; file_type = location.full().file_type_; } @@ -160,8 +163,9 @@ Result FileUploader::on_update_local_location(const Loca fd_ = res_fd.move_as_ok(); fd_path_ = path; is_temp_ = is_temp; + } else if (!fd_path_.empty()) { + TRY_STATUS(acquire_fd()); } - if (local_is_ready) { CHECK(!fd_.empty()); TRY_RESULT(local_file_size, fd_.get_size()); diff --git a/td/telegram/files/PartsManager.cpp b/td/telegram/files/PartsManager.cpp index 95b4e3ee..9161e3f0 100644 --- a/td/telegram/files/PartsManager.cpp +++ b/td/telegram/files/PartsManager.cpp @@ -206,6 +206,9 @@ int32 PartsManager::get_ready_prefix_count() { } return res; } +int64 PartsManager::get_streaming_offset() const { + return streaming_offset_; +} string PartsManager::get_bitmask() { int32 prefix_count = -1; if (need_check_) { @@ -452,7 +455,11 @@ void PartsManager::init_common(const std::vector &ready_parts) { part_status_ = vector(part_count_); for (auto i : ready_parts) { - LOG_CHECK(0 <= i && i < part_count_) << tag("i", i) << tag("part_count", part_count_); + LOG_CHECK(0 <= i && i < part_count_) << tag("i", i) << tag("part_count", part_count_) << tag("size", size_) + << tag("part_size", part_size_) << tag("known_prefix_flag", known_prefix_flag_) + << tag("real part_count", + std::accumulate(ready_parts.begin(), ready_parts.end(), 0, + [](auto a, auto b) { return max(a, b + 1); })); part_status_[i] = PartStatus::Ready; bitmask_.set(i); auto part = get_part(i); diff --git a/td/telegram/files/PartsManager.h b/td/telegram/files/PartsManager.h index 3c8a814b..d902fa0e 100644 --- a/td/telegram/files/PartsManager.h +++ b/td/telegram/files/PartsManager.h @@ -50,6 +50,7 @@ class PartsManager { int32 get_part_count() const; int32 get_unchecked_ready_prefix_count(); int32 get_ready_prefix_count(); + int64 get_streaming_offset() const; string get_bitmask(); private: