From f92f4c38c693f611c30c31ea19796013d980ccd2 Mon Sep 17 00:00:00 2001 From: Ali <> Date: Mon, 20 Mar 2023 16:33:54 +0400 Subject: [PATCH] Fetch improvements --- .../Sources/MediaBoxFileContextV2Impl.swift | 12 ++++--- .../Sources/Network/FetchV2.swift | 34 +++++++++++++++++-- 2 files changed, 40 insertions(+), 6 deletions(-) diff --git a/submodules/Postbox/Sources/MediaBoxFileContextV2Impl.swift b/submodules/Postbox/Sources/MediaBoxFileContextV2Impl.swift index b06a54d9fb..560920279c 100644 --- a/submodules/Postbox/Sources/MediaBoxFileContextV2Impl.swift +++ b/submodules/Postbox/Sources/MediaBoxFileContextV2Impl.swift @@ -360,13 +360,17 @@ final class MediaBoxFileContextV2Impl: MediaBoxFileContext { if complete { if let maxOffset = self.fileMap.ranges.ranges.reversed().first?.upperBound { let maxValue = max(resourceOffset + Int64(dataRange.count), Int64(maxOffset)) - self.fileMap.truncate(maxValue) - self.fileMap.serialize(manager: self.manager, to: self.metaPath) + if self.fileMap.truncationSize != maxValue { + self.fileMap.truncate(maxValue) + self.fileMap.serialize(manager: self.manager, to: self.metaPath) + } } } case let .resourceSizeUpdated(size): - self.fileMap.truncate(size) - self.fileMap.serialize(manager: self.manager, to: self.metaPath) + if self.fileMap.truncationSize != size { + self.fileMap.truncate(size) + self.fileMap.serialize(manager: self.manager, to: self.metaPath) + } case let .progressUpdated(progress): let _ = progress case let .replaceHeader(data, range): diff --git a/submodules/TelegramCore/Sources/Network/FetchV2.swift b/submodules/TelegramCore/Sources/Network/FetchV2.swift index 3cd53c9bf4..37136a08d9 100644 --- a/submodules/TelegramCore/Sources/Network/FetchV2.swift +++ b/submodules/TelegramCore/Sources/Network/FetchV2.swift @@ -208,6 +208,7 @@ private final class FetchImpl { private let consumerId: Int64 private var knownSize: Int64? + private var didReportKnownSize: Bool = false private var updatedFileReference: Data? private var requiredRangesDisposable: Disposable? @@ -307,6 +308,11 @@ private final class FetchImpl { switch state { case let .fetching(state): + if let knownSize = self.knownSize, !self.didReportKnownSize { + self.didReportKnownSize = true + self.onNext(.resourceSizeUpdated(knownSize)) + } + var filteredRequiredRanges: [RangeSet] = [] for _ in 0 ..< 3 { filteredRequiredRanges.append(RangeSet()) @@ -349,8 +355,32 @@ private final class FetchImpl { }*/ if state.pendingParts.count < state.maxPendingParts { - //let debugRanges = filteredRequiredRanges.ranges.map { "\($0.lowerBound)..<\($0.upperBound)" } - //Logger.shared.log("FetchV2", "\(self.loggingIdentifier): will fetch \(debugRanges)") + var debugRangesString = "" + for priorityIndex in 0 ..< 3 { + if filteredRequiredRanges[priorityIndex].isEmpty { + continue + } + + if !debugRangesString.isEmpty { + debugRangesString.append(", ") + } + debugRangesString.append("priority: \(priorityIndex): [") + + var isFirst = true + for range in filteredRequiredRanges[priorityIndex].ranges { + if isFirst { + isFirst = false + } else { + debugRangesString.append(", ") + } + debugRangesString.append("\(range.lowerBound)..<\(range.upperBound)") + } + debugRangesString.append("]") + } + + if !debugRangesString.isEmpty { + Logger.shared.log("FetchV2", "\(self.loggingIdentifier): will fetch \(debugRangesString)") + } while state.pendingParts.count < state.maxPendingParts { var found = false