From fd1ecbbee8c7fa8fdf888c2f593f12d21b58b24c Mon Sep 17 00:00:00 2001 From: drive Date: Thu, 7 May 2026 21:54:24 +0000 Subject: [PATCH] Fix upload failing to resume when blocks were uploaded out of order --- .../Proton.Drive.Sdk/Nodes/TransferQueue.cs | 21 ++++++++++--------- .../Nodes/Upload/RevisionWriter.cs | 2 +- 2 files changed, 12 insertions(+), 11 deletions(-) diff --git a/cs/sdk/src/Proton.Drive.Sdk/Nodes/TransferQueue.cs b/cs/sdk/src/Proton.Drive.Sdk/Nodes/TransferQueue.cs index ead6b27c..f1b2e853 100644 --- a/cs/sdk/src/Proton.Drive.Sdk/Nodes/TransferQueue.cs +++ b/cs/sdk/src/Proton.Drive.Sdk/Nodes/TransferQueue.cs @@ -86,7 +86,10 @@ internal sealed partial class TransferQueue(int maxDegreeOfParallelism, ILogger return queuePosition; } - public void SetFileTotalBlockCount(long queueToken, int total) + /// + /// Increases the total and remaining block counts for a file if the given total is greater than the current one. + /// + public void ApplyFileMinimumTotalBlockCount(long queueToken, int total) { lock (_fileBlocksLock) { @@ -95,16 +98,14 @@ internal sealed partial class TransferQueue(int maxDegreeOfParallelism, ILogger : throw new InvalidOperationException($"Queue token {queueToken} not found in transfer queue."); var delta = total - currentTotal; + if (delta <= 0) + { + return; + } - if (delta > 0) - { - FileQueueSemaphore.DecreaseCount(delta); - LogDecreasedFileQueueSemaphoreCount(delta, FileQueueSemaphore.CurrentCount); - } - else - { - RemoveBlocksFromFileQueue(-delta); - } + FileQueueSemaphore.DecreaseCount(delta); + + LogDecreasedFileQueueSemaphoreCount(delta, FileQueueSemaphore.CurrentCount); _fileBlocks[queueToken] = (currentRemaining + delta, total); } diff --git a/cs/sdk/src/Proton.Drive.Sdk/Nodes/Upload/RevisionWriter.cs b/cs/sdk/src/Proton.Drive.Sdk/Nodes/Upload/RevisionWriter.cs index b5df09b2..e36bdba6 100644 --- a/cs/sdk/src/Proton.Drive.Sdk/Nodes/Upload/RevisionWriter.cs +++ b/cs/sdk/src/Proton.Drive.Sdk/Nodes/Upload/RevisionWriter.cs @@ -399,7 +399,7 @@ internal sealed partial class RevisionWriter currentBlockNumber = newBlockNumber; - _client.UploadQueue.SetFileTotalBlockCount(_queueToken, currentBlockNumber.Value + expectedThumbnailBlockCount); + _client.UploadQueue.ApplyFileMinimumTotalBlockCount(_queueToken, currentBlockNumber.Value + expectedThumbnailBlockCount); // ReSharper disable once PossiblyMistakenUseOfCancellationToken await WaitForBlockUploaderAsync(uploadTasks, cancellationToken).ConfigureAwait(false);