From c77cca3f9c1d2ce2b553f9aefc69f83b8227e3ac Mon Sep 17 00:00:00 2001 From: PSMinIO Developer Date: Mon, 14 Jul 2025 22:19:13 -0400 Subject: [PATCH] Fix PowerShell threading issue in multipart upload progress MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit � CRITICAL POWERSHELL THREADING FIX: ✅ ROOT CAUSE IDENTIFIED: • ProcessQueuedUpdates() was called from background threads (Task.Run) • PowerShell cmdlets can only call Write-Progress/Write-Verbose from main thread • Error: 'WriteObject and WriteError methods cannot be called from outside...' • Background thread progress updates caused cmdlet failures � SOLUTION IMPLEMENTED: • Removed ProcessQueuedUpdates() calls from background threads • Added periodic progress processing from main thread • Wait with 1-second intervals to process queued updates • Maintains real-time progress while respecting PowerShell threading ⚡ TECHNICAL APPROACH: • Background threads queue progress updates (thread-safe) • Main thread processes updates every 1 second during Task.WaitAll • Final processing after all tasks complete • Preserves chunk status tracking without threading violations ✅ PRESERVED FEATURES: • Chunk status tracking (Queued, Transferring, Completed, Failed) • Enhanced PartInfo with timing and error details • Chunk generation logging • Real-time progress updates (every 1 second) � RESULT: • Multipart uploads work reliably again • Progress updates every second from main thread • No PowerShell threading violations • Maintains all enhanced features safely Critical fix for PowerShell cmdlet threading compliance! --- Module/PSMinIO/bin/PSMinIO.dll | Bin 183296 -> 183296 bytes src/Core/S3/MultipartUploadManager.cs | 16 +++++++++++----- 2 files changed, 11 insertions(+), 5 deletions(-) diff --git a/Module/PSMinIO/bin/PSMinIO.dll b/Module/PSMinIO/bin/PSMinIO.dll index 4ea69ec44eb010280e47d97c8fd8bf76231e1796..4e7190bda9abeea8fa7d4dfb97f89cc1a6145381 100644 GIT binary patch delta 36510 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 QAbMO)@+q-b*qCDY2cN?v-2eap delta 36593 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 diff --git a/src/Core/S3/MultipartUploadManager.cs b/src/Core/S3/MultipartUploadManager.cs index 6c4dee3..d4f475d 100644 --- a/src/Core/S3/MultipartUploadManager.cs +++ b/src/Core/S3/MultipartUploadManager.cs @@ -174,8 +174,7 @@ namespace PSMinIO.Core.S3 SizeFormatter.FormatDuration(partInfo.Duration ?? TimeSpan.Zero)); } - // Process progress updates immediately for real-time display - _progressCollector.ProcessQueuedUpdates(); + // Don't call ProcessQueuedUpdates from background thread - PowerShell threading issue } catch (Exception ex) { @@ -189,7 +188,6 @@ namespace PSMinIO.Core.S3 _progressCollector.QueueVerboseMessage("Failed to upload part {0}/{1}: {2}", partNum, totalParts, ex.Message); - _progressCollector.ProcessQueuedUpdates(); throw new InvalidOperationException($"Failed to upload part {partNum}: {ex.Message}", ex); } @@ -202,8 +200,16 @@ namespace PSMinIO.Core.S3 uploadTasks.Add(uploadTask); } - // Wait for all uploads to complete - Task.WaitAll(uploadTasks.ToArray()); + // Wait for all uploads to complete with periodic progress updates + var allTasks = uploadTasks.ToArray(); + while (!Task.WaitAll(allTasks, 1000)) // Wait 1 second at a time + { + // Process progress updates from main thread every second + _progressCollector.ProcessQueuedUpdates(); + } + + // Process final updates + _progressCollector.ProcessQueuedUpdates(); // Complete multipart upload var sortedParts = parts.Values.OrderBy(p => p.PartNumber).ToList();