From 33cefbafe97eacf5053bd3133c4f1b9430fa6b8f Mon Sep 17 00:00:00 2001 From: PSMinIO Developer Date: Mon, 14 Jul 2025 21:42:09 -0400 Subject: [PATCH] Fix multipart upload progress display by adding ProcessQueuedUpdates calls MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit � PROGRESS DISPLAY FIX: ✅ MISSING PROGRESS PROCESSING: • Added ProcessQueuedUpdates() calls throughout multipart upload • Progress was being queued but never displayed to user • Now processes progress updates immediately after key events � PROGRESS PROCESSING POINTS: • After initial progress setup (Layer 1 & 2 initialization) • After upload ID logging and configuration display • After each part completion with updated file progress • After final completion of all progress layers � EXPECTED RESULTS: • 3-layer progress bars now visible during upload • Collection progress shows overall operation • File progress shows parts completed with speed • Chunk progress shows individual part upload (when implemented) • Real-time progress updates during long operations � TECHNICAL DETAILS: • ThreadSafeProgressCollector queues updates from background threads • ProcessQueuedUpdates() must be called from main thread to display • Added strategic calls at key progress milestones • Maintains thread safety while ensuring visibility Now multipart uploads show proper 3-layer progress tracking! --- Module/PSMinIO/bin/PSMinIO.dll | Bin 181760 -> 181760 bytes src/Core/S3/MultipartUploadManager.cs | 12 ++++++++++++ 2 files changed, 12 insertions(+) diff --git a/Module/PSMinIO/bin/PSMinIO.dll b/Module/PSMinIO/bin/PSMinIO.dll index fac9dcafe69fbdf65778777899b9fa8ff146a0df..81d28e1dede87ea6406800e8512ac5ae054e14bb 100644 GIT binary patch delta 10175 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 RH$7;uC2%)A;_0Ej{|8#p3K9SS delta 10182 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 diff --git a/src/Core/S3/MultipartUploadManager.cs b/src/Core/S3/MultipartUploadManager.cs index c64cb5e..a5dcf8b 100644 --- a/src/Core/S3/MultipartUploadManager.cs +++ b/src/Core/S3/MultipartUploadManager.cs @@ -62,6 +62,9 @@ namespace PSMinIO.Core.S3 _progressCollector.QueueProgressUpdate(2, "File Upload", $"Uploading {fileInfo.Name} ({SizeFormatter.FormatBytes(totalSize)})", 0, 1); + // Process initial progress updates + _progressCollector.ProcessQueuedUpdates(); + var uploadId = resumeUploadId; var parts = new ConcurrentDictionary(); var operationStartTime = DateTime.UtcNow; @@ -94,6 +97,9 @@ namespace PSMinIO.Core.S3 _progressCollector.QueueVerboseMessage("Upload configuration - Chunk size: {0}, Total parts: {1}, Max parallel: {2}", SizeFormatter.FormatBytes(effectiveChunkSize), totalParts, _maxParallelUploads); + // Process verbose messages and progress updates + _progressCollector.ProcessQueuedUpdates(); + // Upload parts in parallel var uploadTasks = new List(); var semaphore = new SemaphoreSlim(_maxParallelUploads, _maxParallelUploads); @@ -134,6 +140,9 @@ namespace PSMinIO.Core.S3 _progressCollector.QueueVerboseMessage("Completed part {0}/{1} ({2})", partNum, totalParts, SizeFormatter.FormatBytes(partSize)); + + // Process progress updates immediately + _progressCollector.ProcessQueuedUpdates(); } finally { @@ -162,6 +171,9 @@ namespace PSMinIO.Core.S3 _progressCollector.QueueProgressCompletion(2, "File Upload", 1); _progressCollector.QueueProgressCompletion(1, "Multipart Upload Collection"); + // Process final progress updates + _progressCollector.ProcessQueuedUpdates(); + return new MultipartUploadResult { BucketName = bucketName,