diff --git a/Module/PSMinIO/bin/PSMinIO.dll b/Module/PSMinIO/bin/PSMinIO.dll index ee00d05..21a7f81 100644 Binary files a/Module/PSMinIO/bin/PSMinIO.dll and b/Module/PSMinIO/bin/PSMinIO.dll differ diff --git a/src/Core/S3/MultipartUploadManager.cs b/src/Core/S3/MultipartUploadManager.cs index 5afebc9..242db13 100644 --- a/src/Core/S3/MultipartUploadManager.cs +++ b/src/Core/S3/MultipartUploadManager.cs @@ -147,7 +147,7 @@ namespace PSMinIO.Core.S3 partInfo.Status = PartStatus.Transferring; var uploadedPart = UploadPart(bucketName, objectName, uploadId!, fileInfo, - partNum, partOffset, partSize); + partNum, partOffset, partSize, totalParts); // Update with completed info partInfo.ETag = uploadedPart.ETag; @@ -308,7 +308,7 @@ namespace PSMinIO.Core.S3 /// Uploads a single part /// private PartInfo UploadPart(string bucketName, string objectName, string uploadId, - FileInfo fileInfo, int partNumber, long offset, long size) + FileInfo fileInfo, int partNumber, long offset, long size, int totalParts) { var queryParams = new Dictionary { @@ -327,7 +327,7 @@ namespace PSMinIO.Core.S3 { var chunkProgress = (double)bytesRead / totalBytes * 100; _progressCollector.QueueProgressUpdate(chunkActivityId, "Uploading Chunk", - $"Part {partNumber}: {SizeFormatter.FormatBytes(bytesRead)}/{SizeFormatter.FormatBytes(totalBytes)}", + $"Part {partNumber} of {totalParts} - {SizeFormatter.FormatBytes(bytesRead)}/{SizeFormatter.FormatBytes(totalBytes)}", (int)chunkProgress, 2); // Parent: File Upload (Layer 2) }); diff --git a/src/Utils/ProgressTrackingStream.cs b/src/Utils/ProgressTrackingStream.cs index f813a78..a06c4ab 100644 --- a/src/Utils/ProgressTrackingStream.cs +++ b/src/Utils/ProgressTrackingStream.cs @@ -12,6 +12,8 @@ namespace PSMinIO.Utils private readonly long _totalBytes; private readonly Action _progressCallback; private long _bytesRead = 0; + private long _lastReportedBytes; + private readonly long _reportingThreshold; private readonly long _startPosition; public ProgressTrackingStream(Stream baseStream, long totalBytes, Action progressCallback) @@ -20,6 +22,10 @@ namespace PSMinIO.Utils _totalBytes = totalBytes; _progressCallback = progressCallback ?? throw new ArgumentNullException(nameof(progressCallback)); _startPosition = baseStream.Position; + + // Only report progress every 1% or 1MB, whichever is smaller (reduces overhead) + _reportingThreshold = Math.Min(totalBytes / 100, 1024 * 1024); + if (_reportingThreshold < 8192) _reportingThreshold = 8192; // Minimum 8KB threshold } public override bool CanRead => _baseStream.CanRead; @@ -44,8 +50,12 @@ namespace PSMinIO.Utils var bytesRead = _baseStream.Read(buffer, offset, bytesToRead); _bytesRead += bytesRead; - // Report progress - _progressCallback(_bytesRead, _totalBytes); + // Report progress only when threshold is reached or at completion (reduces overhead) + if (_bytesRead - _lastReportedBytes >= _reportingThreshold || _bytesRead >= _totalBytes) + { + _progressCallback(_bytesRead, _totalBytes); + _lastReportedBytes = _bytesRead; + } return bytesRead; }