diff --git a/generator/.DevConfigs/c49077d9-90b3-437f-b316-6d8d8833ae65.json b/generator/.DevConfigs/c49077d9-90b3-437f-b316-6d8d8833ae65.json new file mode 100644 index 000000000000..1e2e348d0f87 --- /dev/null +++ b/generator/.DevConfigs/c49077d9-90b3-437f-b316-6d8d8833ae65.json @@ -0,0 +1,11 @@ +{ + "services": [ + { + "serviceName": "S3", + "type": "patch", + "changeLogMessages": [ + "Fix Transfer Utility internal Logger recursive property definition" + ] + } + ] +} diff --git a/sdk/src/Services/S3/Custom/Transfer/Internal/BufferedMultipartStream.cs b/sdk/src/Services/S3/Custom/Transfer/Internal/BufferedMultipartStream.cs index 991793112657..7093c2aa6a7b 100644 --- a/sdk/src/Services/S3/Custom/Transfer/Internal/BufferedMultipartStream.cs +++ b/sdk/src/Services/S3/Custom/Transfer/Internal/BufferedMultipartStream.cs @@ -46,10 +46,7 @@ internal class BufferedMultipartStream : Stream private DownloadDiscoveryResult _discoveryResult; private long _totalBytesRead = 0; - private Logger Logger - { - get { return Logger.GetLogger(typeof(TransferUtility)); } - } + private readonly Logger _logger = Logger.GetLogger(typeof(BufferedMultipartStream)); /// /// Gets the containing metadata from the initial GetObject response. @@ -113,12 +110,12 @@ public async Task InitializeAsync(CancellationToken cancellationToken) if (_initialized) throw new InvalidOperationException("Stream has already been initialized"); - Logger.DebugFormat("BufferedMultipartStream: Starting initialization"); + _logger.DebugFormat("BufferedMultipartStream: Starting initialization"); _discoveryResult = await _downloadCoordinator.DiscoverDownloadStrategyAsync(cancellationToken) .ConfigureAwait(false); - Logger.DebugFormat("BufferedMultipartStream: Discovery completed - ObjectSize={0}, TotalParts={1}, IsSinglePart={2}", + _logger.DebugFormat("BufferedMultipartStream: Discovery completed - ObjectSize={0}, TotalParts={1}, IsSinglePart={2}", _discoveryResult.ObjectSize, _discoveryResult.TotalParts, _discoveryResult.IsSinglePart); @@ -127,7 +124,7 @@ await _downloadCoordinator.StartDownloadsAsync(_discoveryResult, null, cancellat .ConfigureAwait(false); _initialized = true; - Logger.DebugFormat("BufferedMultipartStream: Initialization completed successfully"); + _logger.DebugFormat("BufferedMultipartStream: Initialization completed successfully"); } /// @@ -168,7 +165,7 @@ public override async Task ReadAsync(byte[] buffer, int offset, int count, throw new ArgumentException("Offset and count exceed buffer bounds"); var currentPosition = Interlocked.Read(ref _totalBytesRead); - Logger.DebugFormat("BufferedMultipartStream: ReadAsync called - Position={0}, RequestedBytes={1}", + _logger.DebugFormat("BufferedMultipartStream: ReadAsync called - Position={0}, RequestedBytes={1}", currentPosition, count); var bytesRead = await _partBufferManager.ReadAsync(buffer, offset, count, cancellationToken) @@ -178,12 +175,12 @@ public override async Task ReadAsync(byte[] buffer, int offset, int count, if (bytesRead > 0) { Interlocked.Add(ref _totalBytesRead, bytesRead); - Logger.DebugFormat("BufferedMultipartStream: ReadAsync completed - BytesRead={0}, NewPosition={1}", + _logger.DebugFormat("BufferedMultipartStream: ReadAsync completed - BytesRead={0}, NewPosition={1}", bytesRead, currentPosition + bytesRead); } else { - Logger.DebugFormat("BufferedMultipartStream: ReadAsync returned EOF (0 bytes)"); + _logger.DebugFormat("BufferedMultipartStream: ReadAsync returned EOF (0 bytes)"); } return bytesRead; diff --git a/sdk/src/Services/S3/Custom/Transfer/Internal/BufferedPartDataHandler.cs b/sdk/src/Services/S3/Custom/Transfer/Internal/BufferedPartDataHandler.cs index 33e8a7f9816d..a52e5a159758 100644 --- a/sdk/src/Services/S3/Custom/Transfer/Internal/BufferedPartDataHandler.cs +++ b/sdk/src/Services/S3/Custom/Transfer/Internal/BufferedPartDataHandler.cs @@ -55,10 +55,7 @@ internal class BufferedPartDataHandler : IPartDataHandler private readonly IPartBufferManager _partBufferManager; private readonly BufferedDownloadConfiguration _config; - private Logger Logger - { - get { return Logger.GetLogger(typeof(TransferUtility)); } - } + private readonly Logger _logger = Logger.GetLogger(typeof(BufferedPartDataHandler)); /// /// Initializes a new instance of the class. @@ -137,7 +134,7 @@ private async Task ProcessStreamingPartAsync( GetObjectResponse response, CancellationToken cancellationToken) { - Logger.DebugFormat("BufferedPartDataHandler: [Part {0}] Matches NextExpectedPartNumber - streaming directly without buffering", + _logger.DebugFormat("BufferedPartDataHandler: [Part {0}] Matches NextExpectedPartNumber - streaming directly without buffering", partNumber); StreamingDataSource streamingDataSource = null; @@ -161,12 +158,12 @@ private async Task ProcessStreamingPartAsync( // Release capacity immediately since we're not holding anything in memory _partBufferManager.ReleaseBufferSpace(); - Logger.DebugFormat("BufferedPartDataHandler: [Part {0}] StreamingDataSource added and capacity released", + _logger.DebugFormat("BufferedPartDataHandler: [Part {0}] StreamingDataSource added and capacity released", partNumber); } catch (Exception ex) { - Logger.Error(ex, "BufferedPartDataHandler: [Part {0}] Failed to process streaming part", partNumber); + _logger.Error(ex, "BufferedPartDataHandler: [Part {0}] Failed to process streaming part", partNumber); // Dispose response if we still own it (constructor failed before taking ownership) if (ownsResponse) @@ -206,7 +203,7 @@ private async Task ProcessBufferedPartAsync( GetObjectResponse response, CancellationToken cancellationToken) { - Logger.DebugFormat("BufferedPartDataHandler: [Part {0}] Out of order (NextExpected={1}) - buffering to memory", + _logger.DebugFormat("BufferedPartDataHandler: [Part {0}] Out of order (NextExpected={1}) - buffering to memory", partNumber, _partBufferManager.NextExpectedPartNumber); try @@ -220,18 +217,18 @@ private async Task ProcessBufferedPartAsync( // Response has been fully read and buffered - dispose it now response?.Dispose(); - Logger.DebugFormat("BufferedPartDataHandler: [Part {0}] Buffered {1} bytes into memory", + _logger.DebugFormat("BufferedPartDataHandler: [Part {0}] Buffered {1} bytes into memory", partNumber, buffer.Length); // Add the buffered part to the buffer manager _partBufferManager.AddBuffer(buffer); - Logger.DebugFormat("BufferedPartDataHandler: [Part {0}] Added to buffer manager (capacity will be released after consumption)", + _logger.DebugFormat("BufferedPartDataHandler: [Part {0}] Added to buffer manager (capacity will be released after consumption)", partNumber); } catch (Exception ex) { - Logger.Error(ex, "BufferedPartDataHandler: [Part {0}] Failed to process buffered part", partNumber); + _logger.Error(ex, "BufferedPartDataHandler: [Part {0}] Failed to process buffered part", partNumber); // We own the response throughout this method, so dispose it on error response?.Dispose(); @@ -286,7 +283,7 @@ private async Task BufferPartFromResponseAsync( long expectedBytes = response.ContentLength; int initialBufferSize = (int)expectedBytes; - Logger.DebugFormat("BufferedPartDataHandler: [Part {0}] Allocating buffer of size {1} bytes from ArrayPool", + _logger.DebugFormat("BufferedPartDataHandler: [Part {0}] Allocating buffer of size {1} bytes from ArrayPool", partNumber, initialBufferSize); downloadedPart = StreamPartBuffer.Create(partNumber, initialBufferSize); @@ -299,7 +296,7 @@ private async Task BufferPartFromResponseAsync( // The MemoryStream starts at position 0 and can grow up to initialBufferSize using (var memoryStream = new MemoryStream(partBuffer, 0, initialBufferSize, writable: true)) { - Logger.DebugFormat("BufferedPartDataHandler: [Part {0}] Reading response stream into buffer", + _logger.DebugFormat("BufferedPartDataHandler: [Part {0}] Reading response stream into buffer", partNumber); // Use GetObjectResponse's stream copy logic which includes: @@ -316,7 +313,7 @@ await response.WriteResponseStreamAsync( int totalRead = (int)memoryStream.Position; - Logger.DebugFormat("BufferedPartDataHandler: [Part {0}] Read {1} bytes from response stream", + _logger.DebugFormat("BufferedPartDataHandler: [Part {0}] Read {1} bytes from response stream", partNumber, totalRead); // Set the length to reflect actual bytes read @@ -324,7 +321,7 @@ await response.WriteResponseStreamAsync( if (totalRead != expectedBytes) { - Logger.Error(null, "BufferedPartDataHandler: [Part {0}] Size mismatch - Expected {1} bytes, read {2} bytes", + _logger.Error(null, "BufferedPartDataHandler: [Part {0}] Size mismatch - Expected {1} bytes, read {2} bytes", partNumber, expectedBytes, totalRead); } } @@ -333,7 +330,7 @@ await response.WriteResponseStreamAsync( } catch (Exception ex) { - Logger.Error(ex, "BufferedPartDataHandler: [Part {0}] Failed to buffer part from response stream", partNumber); + _logger.Error(ex, "BufferedPartDataHandler: [Part {0}] Failed to buffer part from response stream", partNumber); // If something goes wrong, StreamPartBuffer.Dispose() will handle cleanup downloadedPart?.Dispose(); throw; diff --git a/sdk/src/Services/S3/Custom/Transfer/Internal/FilePartDataHandler.cs b/sdk/src/Services/S3/Custom/Transfer/Internal/FilePartDataHandler.cs index 1d1e4452b311..da9210465fde 100644 --- a/sdk/src/Services/S3/Custom/Transfer/Internal/FilePartDataHandler.cs +++ b/sdk/src/Services/S3/Custom/Transfer/Internal/FilePartDataHandler.cs @@ -42,10 +42,7 @@ internal class FilePartDataHandler : IPartDataHandler private string _tempFilePath; private bool _disposed = false; - private Logger Logger - { - get { return Logger.GetLogger(typeof(TransferUtility)); } - } + private readonly Logger _logger = Logger.GetLogger(typeof(FilePartDataHandler)); /// /// Initializes a new instance for file downloads. @@ -63,7 +60,7 @@ public Task PrepareAsync(DownloadDiscoveryResult discoveryResult, CancellationTo // Create temporary file once during preparation phase _tempFilePath = _fileHandler.CreateTemporaryFile(_config.DestinationFilePath); - Logger.DebugFormat("FilePartDataHandler: Created temporary file for download"); + _logger.DebugFormat("FilePartDataHandler: Created temporary file for download"); return Task.CompletedTask; } @@ -83,20 +80,20 @@ public async Task ProcessPartAsync( { try { - Logger.DebugFormat("FilePartDataHandler: [Part {0}] Starting to process part - ContentLength={1}", + _logger.DebugFormat("FilePartDataHandler: [Part {0}] Starting to process part - ContentLength={1}", partNumber, response.ContentLength); // Calculate offset for this part based on ContentRange or part number long offset = GetPartOffset(response, partNumber); - Logger.DebugFormat("FilePartDataHandler: [Part {0}] Calculated file offset={1}", + _logger.DebugFormat("FilePartDataHandler: [Part {0}] Calculated file offset={1}", partNumber, offset); // Write part data to file at the calculated offset await WritePartToFileAsync(offset, response, cancellationToken) .ConfigureAwait(false); - Logger.DebugFormat("FilePartDataHandler: [Part {0}] File write completed successfully", + _logger.DebugFormat("FilePartDataHandler: [Part {0}] File write completed successfully", partNumber); } finally @@ -128,17 +125,17 @@ public void OnDownloadComplete(Exception exception) if (exception == null) { // Success - commit temp file to final destination - Logger.DebugFormat("FilePartDataHandler: Download complete, committing temporary file to destination"); + _logger.DebugFormat("FilePartDataHandler: Download complete, committing temporary file to destination"); try { _fileHandler.CommitFile(_tempFilePath, _config.DestinationFilePath); - Logger.DebugFormat("FilePartDataHandler: Successfully committed file to destination"); + _logger.DebugFormat("FilePartDataHandler: Successfully committed file to destination"); } catch (Exception commitException) { - Logger.Error(commitException, "FilePartDataHandler: Failed to commit file to destination"); + _logger.Error(commitException, "FilePartDataHandler: Failed to commit file to destination"); // Cleanup on commit failure _fileHandler.CleanupOnFailure(); @@ -149,7 +146,7 @@ public void OnDownloadComplete(Exception exception) else { // Failure - cleanup temp file - Logger.Error(exception, "FilePartDataHandler: Download failed, cleaning up temporary file"); + _logger.Error(exception, "FilePartDataHandler: Download failed, cleaning up temporary file"); _fileHandler.CleanupOnFailure(); } @@ -202,7 +199,7 @@ private async Task WritePartToFileAsync( if (string.IsNullOrEmpty(_tempFilePath)) throw new InvalidOperationException("Temporary file has not been created"); - Logger.DebugFormat("FilePartDataHandler: Opening file for writing at offset {0} with BufferSize={1}", + _logger.DebugFormat("FilePartDataHandler: Opening file for writing at offset {0} with BufferSize={1}", offset, _config.BufferSize); // Open file with FileShare.Write to allow concurrent writes from other threads @@ -216,7 +213,7 @@ private async Task WritePartToFileAsync( // Seek to the correct offset for this part fileStream.Seek(offset, SeekOrigin.Begin); - Logger.DebugFormat("FilePartDataHandler: Writing {0} bytes to file at offset {1}", + _logger.DebugFormat("FilePartDataHandler: Writing {0} bytes to file at offset {1}", response.ContentLength, offset); // Use GetObjectResponse's stream copy logic which includes: @@ -235,7 +232,7 @@ await response.WriteResponseStreamAsync( await fileStream.FlushAsync(cancellationToken) .ConfigureAwait(false); - Logger.DebugFormat("FilePartDataHandler: Successfully wrote {0} bytes at offset {1}", + _logger.DebugFormat("FilePartDataHandler: Successfully wrote {0} bytes at offset {1}", response.ContentLength, offset); } } diff --git a/sdk/src/Services/S3/Custom/Transfer/Internal/MultipartDownloadCommand.cs b/sdk/src/Services/S3/Custom/Transfer/Internal/MultipartDownloadCommand.cs index 809c00c2d3dc..e282decfbc18 100644 --- a/sdk/src/Services/S3/Custom/Transfer/Internal/MultipartDownloadCommand.cs +++ b/sdk/src/Services/S3/Custom/Transfer/Internal/MultipartDownloadCommand.cs @@ -42,13 +42,7 @@ internal partial class MultipartDownloadCommand : BaseCommand /// Initializes a new instance of the MultipartDownloadCommand class for single file downloads. @@ -118,7 +112,7 @@ private FileDownloadConfiguration CreateConfiguration() // Use S3 client buffer size for I/O operations int bufferSize = _s3Client.Config.BufferSize; - Logger.DebugFormat("MultipartDownloadCommand: Creating configuration - PartSizeFromRequest={0}, UsingDefaultPartSize={1}", + _logger.DebugFormat("MultipartDownloadCommand: Creating configuration - PartSizeFromRequest={0}, UsingDefaultPartSize={1}", _request.IsSetPartSize() ? _request.PartSize.ToString() : "Not Set", !_request.IsSetPartSize()); diff --git a/sdk/src/Services/S3/Custom/Transfer/Internal/MultipartDownloadManager.cs b/sdk/src/Services/S3/Custom/Transfer/Internal/MultipartDownloadManager.cs index 7ccab05cafe0..0208ae789823 100644 --- a/sdk/src/Services/S3/Custom/Transfer/Internal/MultipartDownloadManager.cs +++ b/sdk/src/Services/S3/Custom/Transfer/Internal/MultipartDownloadManager.cs @@ -66,10 +66,7 @@ internal class MultipartDownloadManager : IDownloadManager // Uses int instead of bool because Interlocked.CompareExchange requires reference types private int _completionEventFired = 0; // 0 = false, 1 = true - private Logger Logger - { - get { return Logger.GetLogger(typeof(TransferUtility)); } - } + private readonly Logger _logger = Logger.GetLogger(typeof(MultipartDownloadManager)); /// /// Task that completes when all downloads finish (successfully or with error). @@ -184,7 +181,7 @@ public async Task DiscoverDownloadStrategyAsync(Cancell if (_discoveryCompleted) throw new InvalidOperationException("Discovery has already been performed"); - Logger.DebugFormat("MultipartDownloadManager: Starting discovery with strategy={0}", + _logger.DebugFormat("MultipartDownloadManager: Starting discovery with strategy={0}", _request.MultipartDownloadType); try @@ -196,7 +193,7 @@ public async Task DiscoverDownloadStrategyAsync(Cancell _discoveryCompleted = true; - Logger.InfoFormat("MultipartDownloadManager: Discovery complete - ObjectSize={0}, TotalParts={1}, Strategy={2}, ETagPresent={3}", + _logger.InfoFormat("MultipartDownloadManager: Discovery complete - ObjectSize={0}, TotalParts={1}, Strategy={2}, ETagPresent={3}", result.ObjectSize, result.TotalParts, _request.MultipartDownloadType, @@ -207,7 +204,7 @@ public async Task DiscoverDownloadStrategyAsync(Cancell catch (Exception ex) { _downloadException = ex; - Logger.Error(ex, "MultipartDownloadManager: Discovery failed"); + _logger.Error(ex, "MultipartDownloadManager: Discovery failed"); throw; } } @@ -224,7 +221,7 @@ public async Task StartDownloadsAsync(DownloadDiscoveryResult discoveryResult, E _userProgressCallback = progressCallback; _totalObjectSize = discoveryResult.ObjectSize; - Logger.DebugFormat("MultipartDownloadManager: Starting downloads - TotalParts={0}, IsSinglePart={1}", + _logger.DebugFormat("MultipartDownloadManager: Starting downloads - TotalParts={0}, IsSinglePart={1}", discoveryResult.TotalParts, discoveryResult.IsSinglePart); var downloadTasks = new List(); @@ -249,7 +246,7 @@ public async Task StartDownloadsAsync(DownloadDiscoveryResult discoveryResult, E } // Process Part 1 from InitialResponse (applies to both single-part and multipart) - Logger.DebugFormat("MultipartDownloadManager: Buffering Part 1 from discovery response"); + _logger.DebugFormat("MultipartDownloadManager: Buffering Part 1 from discovery response"); await _dataHandler.ProcessPartAsync(1, discoveryResult.InitialResponse, cancellationToken).ConfigureAwait(false); } finally @@ -265,7 +262,7 @@ public async Task StartDownloadsAsync(DownloadDiscoveryResult discoveryResult, E if (discoveryResult.IsSinglePart) { // Single-part: Part 1 is the entire object - Logger.DebugFormat("MultipartDownloadManager: Single-part download complete"); + _logger.DebugFormat("MultipartDownloadManager: Single-part download complete"); _dataHandler.OnDownloadComplete(null); return; } @@ -280,10 +277,10 @@ public async Task StartDownloadsAsync(DownloadDiscoveryResult discoveryResult, E { try { - Logger.DebugFormat("MultipartDownloadManager: Background task starting capacity acquisition and downloads"); + _logger.DebugFormat("MultipartDownloadManager: Background task starting capacity acquisition and downloads"); // Multipart: Start concurrent downloads for remaining parts (Part 2 onwards) - Logger.InfoFormat("MultipartDownloadManager: Starting concurrent downloads for parts 2-{0}", + _logger.InfoFormat("MultipartDownloadManager: Starting concurrent downloads for parts 2-{0}", discoveryResult.TotalParts); // Pre-acquire capacity in sequential order to prevent race condition deadlock @@ -291,24 +288,24 @@ public async Task StartDownloadsAsync(DownloadDiscoveryResult discoveryResult, E // parts from consuming all buffer slots and blocking the next expected part for (int partNum = 2; partNum <= discoveryResult.TotalParts; partNum++) { - Logger.DebugFormat("MultipartDownloadManager: [Part {0}] Waiting for buffer space", partNum); + _logger.DebugFormat("MultipartDownloadManager: [Part {0}] Waiting for buffer space", partNum); // Acquire capacity sequentially - guarantees Part 2 before Part 3, etc. await _dataHandler.WaitForCapacityAsync(cancellationToken).ConfigureAwait(false); - Logger.DebugFormat("MultipartDownloadManager: [Part {0}] Buffer space acquired", partNum); + _logger.DebugFormat("MultipartDownloadManager: [Part {0}] Buffer space acquired", partNum); var task = CreateDownloadTaskAsync(partNum, discoveryResult.ObjectSize, wrappedCallback, internalCts.Token); downloadTasks.Add(task); } var expectedTaskCount = downloadTasks.Count; - Logger.DebugFormat("MultipartDownloadManager: Background task waiting for {0} download tasks", expectedTaskCount); + _logger.DebugFormat("MultipartDownloadManager: Background task waiting for {0} download tasks", expectedTaskCount); // Wait for all downloads to complete (fails fast on first exception) await TaskHelpers.WhenAllOrFirstExceptionAsync(downloadTasks, cancellationToken).ConfigureAwait(false); - Logger.DebugFormat("MultipartDownloadManager: All download tasks completed successfully"); + _logger.DebugFormat("MultipartDownloadManager: All download tasks completed successfully"); // SEP Part GET Step 6 / Ranged GET Step 8: // "validate that the total number of part GET requests sent matches with the expected PartsCount" @@ -324,7 +321,7 @@ public async Task StartDownloadsAsync(DownloadDiscoveryResult discoveryResult, E } // Mark successful completion - Logger.InfoFormat("MultipartDownloadManager: Download completed successfully - TotalParts={0}", + _logger.InfoFormat("MultipartDownloadManager: Download completed successfully - TotalParts={0}", discoveryResult.TotalParts); _dataHandler.OnDownloadComplete(null); } @@ -333,7 +330,7 @@ public async Task StartDownloadsAsync(DownloadDiscoveryResult discoveryResult, E catch (Exception ex) { _downloadException = ex; - Logger.Error(ex, "MultipartDownloadManager: Background download task failed"); + _logger.Error(ex, "MultipartDownloadManager: Background download task failed"); _dataHandler.OnDownloadComplete(ex); throw; } @@ -348,12 +345,12 @@ public async Task StartDownloadsAsync(DownloadDiscoveryResult discoveryResult, E // Return immediately to allow consumer to start reading // This prevents deadlock when buffer fills up before consumer begins reading - Logger.DebugFormat("MultipartDownloadManager: Returning to allow consumer to start reading"); + _logger.DebugFormat("MultipartDownloadManager: Returning to allow consumer to start reading"); } catch (Exception ex) { _downloadException = ex; - Logger.Error(ex, "MultipartDownloadManager: Download failed"); + _logger.Error(ex, "MultipartDownloadManager: Download failed"); _dataHandler.OnDownloadComplete(ex); @@ -374,13 +371,13 @@ private async Task CreateDownloadTaskAsync(int partNumber, long objectSize, Even try { - Logger.DebugFormat("MultipartDownloadManager: [Part {0}] Waiting for HTTP concurrency slot (Available: {1}/{2})", + _logger.DebugFormat("MultipartDownloadManager: [Part {0}] Waiting for HTTP concurrency slot (Available: {1}/{2})", partNumber, _httpConcurrencySlots.CurrentCount, _config.ConcurrentServiceRequests); // Limit HTTP concurrency await _httpConcurrencySlots.WaitAsync(cancellationToken).ConfigureAwait(false); - Logger.DebugFormat("MultipartDownloadManager: [Part {0}] HTTP concurrency slot acquired", partNumber); + _logger.DebugFormat("MultipartDownloadManager: [Part {0}] HTTP concurrency slot acquired", partNumber); try { @@ -397,7 +394,7 @@ private async Task CreateDownloadTaskAsync(int partNumber, long objectSize, Even // for each request to the Etag value saved from Step 3" getObjectRequest.EtagToMatch = _savedETag; - Logger.DebugFormat("MultipartDownloadManager: [Part {0}] Sending GetObject request with PartNumber={1}, IfMatchPresent={2}", + _logger.DebugFormat("MultipartDownloadManager: [Part {0}] Sending GetObject request with PartNumber={1}, IfMatchPresent={2}", partNumber, partNumber, !string.IsNullOrEmpty(_savedETag)); } else @@ -412,7 +409,7 @@ private async Task CreateDownloadTaskAsync(int partNumber, long objectSize, Even // for each request to the value saved from Step 5" getObjectRequest.EtagToMatch = _savedETag; - Logger.DebugFormat("MultipartDownloadManager: [Part {0}] Sending GetObject request with ByteRange={1}-{2}, IfMatchPresent={3}", + _logger.DebugFormat("MultipartDownloadManager: [Part {0}] Sending GetObject request with ByteRange={1}-{2}, IfMatchPresent={3}", partNumber, startByte, endByte, !string.IsNullOrEmpty(_savedETag)); } @@ -425,31 +422,31 @@ private async Task CreateDownloadTaskAsync(int partNumber, long objectSize, Even response.WriteObjectProgressEvent += progressCallback; } - Logger.DebugFormat("MultipartDownloadManager: [Part {0}] GetObject response received - ContentLength={1}", + _logger.DebugFormat("MultipartDownloadManager: [Part {0}] GetObject response received - ContentLength={1}", partNumber, response.ContentLength); // SEP Part GET Step 5 / Ranged GET Step 7: Validate ContentRange matches request ValidateContentRange(response, partNumber, objectSize); - Logger.DebugFormat("MultipartDownloadManager: [Part {0}] ContentRange validation passed", partNumber); + _logger.DebugFormat("MultipartDownloadManager: [Part {0}] ContentRange validation passed", partNumber); // Validate ETag consistency for SEP compliance if (!string.IsNullOrEmpty(_savedETag) && !string.Equals(_savedETag, response.ETag, StringComparison.OrdinalIgnoreCase)) { - Logger.Error(null, "MultipartDownloadManager: [Part {0}] ETag mismatch detected - object modified during download", partNumber); + _logger.Error(null, "MultipartDownloadManager: [Part {0}] ETag mismatch detected - object modified during download", partNumber); throw new InvalidOperationException($"ETag mismatch detected for part {partNumber} - object may have been modified during download"); } - Logger.DebugFormat("MultipartDownloadManager: [Part {0}] ETag validation passed", partNumber); + _logger.DebugFormat("MultipartDownloadManager: [Part {0}] ETag validation passed", partNumber); } finally { _httpConcurrencySlots.Release(); - Logger.DebugFormat("MultipartDownloadManager: [Part {0}] HTTP concurrency slot released (Available: {1}/{2})", + _logger.DebugFormat("MultipartDownloadManager: [Part {0}] HTTP concurrency slot released (Available: {1}/{2})", partNumber, _httpConcurrencySlots.CurrentCount, _config.ConcurrentServiceRequests); } - Logger.DebugFormat("MultipartDownloadManager: [Part {0}] Processing part (handler will decide: stream or buffer)", partNumber); + _logger.DebugFormat("MultipartDownloadManager: [Part {0}] Processing part (handler will decide: stream or buffer)", partNumber); // Delegate data handling to the handler // IMPORTANT: Handler takes ownership of response and is responsible for disposing it in ALL cases: @@ -459,11 +456,11 @@ private async Task CreateDownloadTaskAsync(int partNumber, long objectSize, Even await _dataHandler.ProcessPartAsync(partNumber, response, cancellationToken).ConfigureAwait(false); ownsResponse = false; // Ownership transferred to handler - Logger.DebugFormat("MultipartDownloadManager: [Part {0}] Processing completed successfully", partNumber); + _logger.DebugFormat("MultipartDownloadManager: [Part {0}] Processing completed successfully", partNumber); } catch (Exception ex) { - Logger.Error(ex, "MultipartDownloadManager: [Part {0}] Download failed", partNumber); + _logger.Error(ex, "MultipartDownloadManager: [Part {0}] Download failed", partNumber); // Dispose response if we still own it (error occurred before handler took ownership) if (ownsResponse) @@ -487,10 +484,10 @@ private async Task DiscoverUsingPartStrategyAsync(Cance firstPartRequest.PartNumber = 1; // Wait for both capacity types before making HTTP request (consistent with background parts) - Logger.DebugFormat("MultipartDownloadManager: [Part 1 Discovery] Waiting for buffer capacity"); + _logger.DebugFormat("MultipartDownloadManager: [Part 1 Discovery] Waiting for buffer capacity"); await _dataHandler.WaitForCapacityAsync(cancellationToken).ConfigureAwait(false); - Logger.DebugFormat("MultipartDownloadManager: [Part 1 Discovery] Waiting for HTTP concurrency slot"); + _logger.DebugFormat("MultipartDownloadManager: [Part 1 Discovery] Waiting for HTTP concurrency slot"); await _httpConcurrencySlots.WaitAsync(cancellationToken).ConfigureAwait(false); GetObjectResponse firstPartResponse = null; @@ -502,7 +499,7 @@ private async Task DiscoverUsingPartStrategyAsync(Cance finally { _httpConcurrencySlots.Release(); - Logger.DebugFormat("MultipartDownloadManager: [Part 1 Discovery] HTTP concurrency slot released"); + _logger.DebugFormat("MultipartDownloadManager: [Part 1 Discovery] HTTP concurrency slot released"); } if (firstPartResponse == null) @@ -564,10 +561,10 @@ private async Task DiscoverUsingRangeStrategyAsync(Canc firstRangeRequest.ByteRange = new ByteRange(0, targetPartSize - 1); // Wait for both capacity types before making HTTP request (consistent with background parts) - Logger.DebugFormat("MultipartDownloadManager: [Part 1 Discovery] Waiting for buffer capacity"); + _logger.DebugFormat("MultipartDownloadManager: [Part 1 Discovery] Waiting for buffer capacity"); await _dataHandler.WaitForCapacityAsync(cancellationToken).ConfigureAwait(false); - Logger.DebugFormat("MultipartDownloadManager: [Part 1 Discovery] Waiting for HTTP concurrency slot"); + _logger.DebugFormat("MultipartDownloadManager: [Part 1 Discovery] Waiting for HTTP concurrency slot"); await _httpConcurrencySlots.WaitAsync(cancellationToken).ConfigureAwait(false); GetObjectResponse firstRangeResponse = null; @@ -579,7 +576,7 @@ private async Task DiscoverUsingRangeStrategyAsync(Canc finally { _httpConcurrencySlots.Release(); - Logger.DebugFormat("MultipartDownloadManager: [Part 1 Discovery] HTTP concurrency slot released"); + _logger.DebugFormat("MultipartDownloadManager: [Part 1 Discovery] HTTP concurrency slot released"); } // Defensive null check diff --git a/sdk/src/Services/S3/Custom/Transfer/Internal/MultipartUploadCommand.cs b/sdk/src/Services/S3/Custom/Transfer/Internal/MultipartUploadCommand.cs index 9c6374502885..c9d7041aa987 100644 --- a/sdk/src/Services/S3/Custom/Transfer/Internal/MultipartUploadCommand.cs +++ b/sdk/src/Services/S3/Custom/Transfer/Internal/MultipartUploadCommand.cs @@ -50,13 +50,7 @@ internal partial class MultipartUploadCommand : BaseCommand _partsToUpload = new Queue(); long _contentLength; - private static Logger Logger - { - get - { - return Logger.GetLogger(typeof(TransferUtility)); - } - } + private readonly Logger _logger = Logger.GetLogger(typeof(MultipartUploadCommand)); /// /// Initializes a new instance of the class. @@ -70,11 +64,11 @@ internal MultipartUploadCommand(IAmazonS3 s3Client, TransferUtilityConfig config if (fileTransporterRequest.IsSetFilePath()) { - Logger.DebugFormat("Beginning upload of file {0}.", fileTransporterRequest.FilePath); + _logger.DebugFormat("Beginning upload of file {0}.", fileTransporterRequest.FilePath); } else { - Logger.DebugFormat("Beginning upload of stream."); + _logger.DebugFormat("Beginning upload of stream."); } this._s3Client = s3Client; @@ -95,7 +89,7 @@ internal MultipartUploadCommand(IAmazonS3 s3Client, TransferUtilityConfig config } } - Logger.DebugFormat("Upload part size {0}.", this._partSize); + _logger.DebugFormat("Upload part size {0}.", this._partSize); } private static long calculatePartSize(long contentLength, long targetPartSize) diff --git a/sdk/src/Services/S3/Custom/Transfer/Internal/TaskHelpers.cs b/sdk/src/Services/S3/Custom/Transfer/Internal/TaskHelpers.cs index 02f233462222..4ca8db0c4fea 100644 --- a/sdk/src/Services/S3/Custom/Transfer/Internal/TaskHelpers.cs +++ b/sdk/src/Services/S3/Custom/Transfer/Internal/TaskHelpers.cs @@ -27,11 +27,6 @@ namespace Amazon.S3.Transfer.Internal /// internal static class TaskHelpers { - private static Logger Logger - { - get { return Logger.GetLogger(typeof(TaskHelpers)); } - } - /// /// Waits for all tasks to complete or till any task fails or is canceled. /// @@ -43,7 +38,7 @@ internal static async Task WhenAllOrFirstExceptionAsync(List pendingTasks, int processed = 0; int total = pendingTasks.Count; - Logger.DebugFormat("TaskHelpers.WhenAllOrFirstExceptionAsync: Starting with TotalTasks={0}", total); + Logger.GetLogger(typeof(TaskHelpers)).DebugFormat("TaskHelpers.WhenAllOrFirstExceptionAsync: Starting with TotalTasks={0}", total); while (processed < total) { @@ -60,11 +55,11 @@ await completedTask pendingTasks.Remove(completedTask); processed++; - Logger.DebugFormat("TaskHelpers.WhenAllOrFirstExceptionAsync: Task completed (Processed={0}/{1}, Remaining={2})", + Logger.GetLogger(typeof(TaskHelpers)).DebugFormat("TaskHelpers.WhenAllOrFirstExceptionAsync: Task completed (Processed={0}/{1}, Remaining={2})", processed, total, pendingTasks.Count); } - Logger.DebugFormat("TaskHelpers.WhenAllOrFirstExceptionAsync: All tasks completed (Total={0})", total); + Logger.GetLogger(typeof(TaskHelpers)).DebugFormat("TaskHelpers.WhenAllOrFirstExceptionAsync: All tasks completed (Total={0})", total); } /// @@ -81,7 +76,7 @@ internal static async Task> WhenAllOrFirstExceptionAsync(List int total = pendingTasks.Count; var responses = new List(); - Logger.DebugFormat("TaskHelpers.WhenAllOrFirstExceptionAsync: Starting with TotalTasks={0}", total); + Logger.GetLogger(typeof(TaskHelpers)).DebugFormat("TaskHelpers.WhenAllOrFirstExceptionAsync: Starting with TotalTasks={0}", total); while (processed < total) { @@ -99,11 +94,11 @@ internal static async Task> WhenAllOrFirstExceptionAsync(List pendingTasks.Remove(completedTask); processed++; - Logger.DebugFormat("TaskHelpers.WhenAllOrFirstExceptionAsync: Task completed (Processed={0}/{1}, Remaining={2})", + Logger.GetLogger(typeof(TaskHelpers)).DebugFormat("TaskHelpers.WhenAllOrFirstExceptionAsync: Task completed (Processed={0}/{1}, Remaining={2})", processed, total, pendingTasks.Count); } - Logger.DebugFormat("TaskHelpers.WhenAllOrFirstExceptionAsync: All tasks completed (Total={0})", total); + Logger.GetLogger(typeof(TaskHelpers)).DebugFormat("TaskHelpers.WhenAllOrFirstExceptionAsync: All tasks completed (Total={0})", total); return responses; } @@ -134,11 +129,11 @@ internal static async Task ForEachWithConcurrencyAsync( var itemList = items as IList ?? items.ToList(); if (itemList.Count == 0) { - Logger.DebugFormat("TaskHelpers.ForEachWithConcurrencyAsync: No items to process"); + Logger.GetLogger(typeof(TaskHelpers)).DebugFormat("TaskHelpers.ForEachWithConcurrencyAsync: No items to process"); return; } - Logger.DebugFormat("TaskHelpers.ForEachWithConcurrencyAsync: Starting with TotalItems={0}, MaxConcurrency={1}", + Logger.GetLogger(typeof(TaskHelpers)).DebugFormat("TaskHelpers.ForEachWithConcurrencyAsync: Starting with TotalItems={0}, MaxConcurrency={1}", itemList.Count, maxConcurrency); int nextIndex = 0; @@ -146,7 +141,7 @@ internal static async Task ForEachWithConcurrencyAsync( // Start initial batch up to concurrency limit int initialBatchSize = Math.Min(maxConcurrency, itemList.Count); - Logger.DebugFormat("TaskHelpers.ForEachWithConcurrencyAsync: Starting initial batch of {0} tasks", initialBatchSize); + Logger.GetLogger(typeof(TaskHelpers)).DebugFormat("TaskHelpers.ForEachWithConcurrencyAsync: Starting initial batch of {0} tasks", initialBatchSize); for (int i = 0; i < initialBatchSize; i++) { @@ -170,20 +165,20 @@ await completedTask activeTasks.Remove(completedTask); int itemsCompleted = nextIndex - activeTasks.Count; - Logger.DebugFormat("TaskHelpers.ForEachWithConcurrencyAsync: Task completed (Active={0}, Completed={1}/{2}, Remaining={3})", + Logger.GetLogger(typeof(TaskHelpers)).DebugFormat("TaskHelpers.ForEachWithConcurrencyAsync: Task completed (Active={0}, Completed={1}/{2}, Remaining={3})", activeTasks.Count, itemsCompleted, itemList.Count, itemList.Count - itemsCompleted); // Start next task if more work remains if (nextIndex < itemList.Count) { - Logger.DebugFormat("TaskHelpers.ForEachWithConcurrencyAsync: Starting next task (Index={0}/{1}, Active={2})", + Logger.GetLogger(typeof(TaskHelpers)).DebugFormat("TaskHelpers.ForEachWithConcurrencyAsync: Starting next task (Index={0}/{1}, Active={2})", nextIndex + 1, itemList.Count, activeTasks.Count + 1); var nextTask = processAsync(itemList[nextIndex++], cancellationToken); activeTasks.Add(nextTask); } } - Logger.DebugFormat("TaskHelpers.ForEachWithConcurrencyAsync: All items processed (Total={0})", itemList.Count); + Logger.GetLogger(typeof(TaskHelpers)).DebugFormat("TaskHelpers.ForEachWithConcurrencyAsync: All items processed (Total={0})", itemList.Count); } } } diff --git a/sdk/src/Services/S3/Custom/Transfer/Internal/_async/MultipartDownloadCommand.async.cs b/sdk/src/Services/S3/Custom/Transfer/Internal/_async/MultipartDownloadCommand.async.cs index 11a4e8ad8f45..cc58ffbbadac 100644 --- a/sdk/src/Services/S3/Custom/Transfer/Internal/_async/MultipartDownloadCommand.async.cs +++ b/sdk/src/Services/S3/Custom/Transfer/Internal/_async/MultipartDownloadCommand.async.cs @@ -40,7 +40,7 @@ public override async Task ExecuteAsync(Cancell // Create configuration from request settings var config = CreateConfiguration(); - Logger.DebugFormat("MultipartDownloadCommand: Configuration - ConcurrentServiceRequests={0}, BufferSize={1}, TargetPartSize={2}", + _logger.DebugFormat("MultipartDownloadCommand: Configuration - ConcurrentServiceRequests={0}, BufferSize={1}, TargetPartSize={2}", config.ConcurrentServiceRequests, config.BufferSize, config.TargetPartSizeBytes @@ -63,28 +63,28 @@ public override async Task ExecuteAsync(Cancell try { // Step 1: Discover download strategy (PART or RANGE) and get metadata - Logger.DebugFormat("MultipartDownloadCommand: Discovering download strategy"); + _logger.DebugFormat("MultipartDownloadCommand: Discovering download strategy"); var discoveryResult = await coordinator.DiscoverDownloadStrategyAsync(cancellationToken) .ConfigureAwait(false); totalBytes = discoveryResult.ObjectSize; - Logger.DebugFormat("MultipartDownloadCommand: Discovered {0} part(s), total size: {1} bytes, IsSinglePart={2}", + _logger.DebugFormat("MultipartDownloadCommand: Discovered {0} part(s), total size: {1} bytes, IsSinglePart={2}", discoveryResult.TotalParts, discoveryResult.ObjectSize, discoveryResult.IsSinglePart); // Step 2: Start concurrent downloads for all parts - Logger.DebugFormat("Starting downloads for {0} part(s)", discoveryResult.TotalParts); + _logger.DebugFormat("Starting downloads for {0} part(s)", discoveryResult.TotalParts); await coordinator.StartDownloadsAsync(discoveryResult, DownloadPartProgressEventCallback, cancellationToken) .ConfigureAwait(false); // Step 2b: Wait for all downloads to complete before returning // This ensures file is fully written and committed for file-based downloads // For stream-based downloads, this task completes immediately (no-op) - Logger.DebugFormat("MultipartDownloadCommand: Waiting for download completion"); + _logger.DebugFormat("MultipartDownloadCommand: Waiting for download completion"); await coordinator.DownloadCompletionTask.ConfigureAwait(false); - Logger.DebugFormat("MultipartDownloadCommand: Completed multipart download"); + _logger.DebugFormat("MultipartDownloadCommand: Completed multipart download"); // Step 3: Map the response from the initial GetObject response // The initial response contains all the metadata we need @@ -126,7 +126,7 @@ await coordinator.StartDownloadsAsync(discoveryResult, DownloadPartProgressEvent } catch (Exception ex) { - Logger.Error(ex, "Exception during multipart download"); + _logger.Error(ex, "Exception during multipart download"); // Fire failed event FireTransferFailedEvent(totalBytes); diff --git a/sdk/src/Services/S3/Custom/Transfer/Internal/_async/MultipartUploadCommand.async.cs b/sdk/src/Services/S3/Custom/Transfer/Internal/_async/MultipartUploadCommand.async.cs index 0ea2f205258a..9c6983f9bdc0 100644 --- a/sdk/src/Services/S3/Custom/Transfer/Internal/_async/MultipartUploadCommand.async.cs +++ b/sdk/src/Services/S3/Custom/Transfer/Internal/_async/MultipartUploadCommand.async.cs @@ -50,7 +50,7 @@ public override async Task ExecuteAsync(Cancellat var initRequest = ConstructInitiateMultipartUploadRequest(); initResponse = await _s3Client.InitiateMultipartUploadAsync(initRequest, cancellationToken) .ConfigureAwait(continueOnCapturedContext: false); - Logger.DebugFormat("Initiated upload: {0}", initResponse.UploadId); + _logger.DebugFormat("Initiated upload: {0}", initResponse.UploadId); } catch (Exception) { @@ -64,7 +64,7 @@ public override async Task ExecuteAsync(Cancellat try { - Logger.DebugFormat("Queue up the UploadPartRequests to be executed"); + _logger.DebugFormat("Queue up the UploadPartRequests to be executed"); long filePosition = 0; for (int i = 1; filePosition < this._contentLength; i++) { @@ -100,7 +100,7 @@ public override async Task ExecuteAsync(Cancellat this._totalNumberOfParts = this._partsToUpload.Count; - Logger.DebugFormat("Scheduling the {0} UploadPartRequests in the queue", this._totalNumberOfParts); + _logger.DebugFormat("Scheduling the {0} UploadPartRequests in the queue", this._totalNumberOfParts); internalCts = CancellationTokenSource.CreateLinkedTokenSource(cancellationToken); var concurrencyLevel = CalculateConcurrentServiceRequests(); @@ -132,15 +132,15 @@ await localThrottler.WaitAsync(cancellationToken) pendingUploadPartTasks.Add(task); } - Logger.DebugFormat("Waiting for upload part requests to complete. ({0})", initResponse.UploadId); + _logger.DebugFormat("Waiting for upload part requests to complete. ({0})", initResponse.UploadId); _uploadResponses = await TaskHelpers.WhenAllOrFirstExceptionAsync(pendingUploadPartTasks, cancellationToken) .ConfigureAwait(continueOnCapturedContext: false); - Logger.DebugFormat("Beginning completing multipart. ({0})", initResponse.UploadId); + _logger.DebugFormat("Beginning completing multipart. ({0})", initResponse.UploadId); var compRequest = ConstructCompleteMultipartUploadRequest(initResponse); var completeResponse = await this._s3Client.CompleteMultipartUploadAsync(compRequest, cancellationToken) .ConfigureAwait(continueOnCapturedContext: false); - Logger.DebugFormat("Done completing multipart. ({0})", initResponse.UploadId); + _logger.DebugFormat("Done completing multipart. ({0})", initResponse.UploadId); var mappedResponse = ResponseMapper.MapCompleteMultipartUploadResponse(completeResponse); FireTransferCompletedEvent(mappedResponse); @@ -148,7 +148,7 @@ await localThrottler.WaitAsync(cancellationToken) } catch (Exception e) { - Logger.Error(e, "Exception while uploading. ({0})", initResponse?.UploadId ?? "unknown"); + _logger.Error(e, "Exception while uploading. ({0})", initResponse?.UploadId ?? "unknown"); FireTransferFailedEvent(); @@ -246,7 +246,7 @@ private void Cleanup(string uploadId, List> tasks) } catch(Exception exception) { - Logger.InfoFormat( + _logger.InfoFormat( "A timeout occured while waiting for all upload part request to complete as part of aborting the multipart upload : {0}", exception.Message); } @@ -273,7 +273,7 @@ private void AbortMultipartUpload(string uploadId) } catch (Exception e) { - Logger.InfoFormat("Error attempting to abort multipart for key {0}: {1}", this._fileTransporterRequest.Key, e.Message); + _logger.InfoFormat("Error attempting to abort multipart for key {0}: {1}", this._fileTransporterRequest.Key, e.Message); } } private async Task UploadUnseekableStreamAsync(TransferUtilityUploadRequest request, CancellationToken cancellationToken = default(CancellationToken)) @@ -302,7 +302,7 @@ private void AbortMultipartUpload(string uploadId) catch (Exception ex) { FireTransferFailedEvent(); - Logger.Error(ex, "Failed to initiate multipart upload for unseekable stream"); + _logger.Error(ex, "Failed to initiate multipart upload for unseekable stream"); throw; } @@ -351,7 +351,7 @@ private void AbortMultipartUpload(string uploadId) UploadPartRequest uploadPartRequest = ConstructUploadPartRequestForNonSeekableStream(nextUploadBuffer, partNumber, partSize, isLastPart, initiateResponse); var partResponse = await _s3Client.UploadPartAsync(uploadPartRequest, cancellationToken).ConfigureAwait(false); - Logger.DebugFormat("Uploaded part {0}. (Last part = {1}, Part size = {2}, Upload Id: {3})", partNumber, isLastPart, partSize, initiateResponse.UploadId); + _logger.DebugFormat("Uploaded part {0}. (Last part = {1}, Part size = {2}, Upload Id: {3})", partNumber, isLastPart, partSize, initiateResponse.UploadId); uploadPartResponses.Add(partResponse); partNumber++; @@ -373,7 +373,7 @@ private void AbortMultipartUpload(string uploadId) this._uploadResponses = uploadPartResponses; CompleteMultipartUploadRequest compRequest = ConstructCompleteMultipartUploadRequest(initiateResponse, true, requestEventHandler); var completeResponse = await _s3Client.CompleteMultipartUploadAsync(compRequest, cancellationToken).ConfigureAwait(false); - Logger.DebugFormat("Completed multi part upload. (Part count: {0}, Upload Id: {1})", uploadPartResponses.Count, initiateResponse.UploadId); + _logger.DebugFormat("Completed multi part upload. (Part count: {0}, Upload Id: {1})", uploadPartResponses.Count, initiateResponse.UploadId); var mappedResponse = ResponseMapper.MapCompleteMultipartUploadResponse(completeResponse); FireTransferCompletedEvent(mappedResponse); @@ -391,7 +391,7 @@ await _s3Client.AbortMultipartUploadAsync(new AbortMultipartUploadRequest() RequestPayer = request.RequestPayer, UploadId = initiateResponse.UploadId }).ConfigureAwait(false); - Logger.Error(ex, ex.Message); + _logger.Error(ex, ex.Message); throw; } } diff --git a/sdk/src/Services/S3/Custom/Transfer/Internal/_async/OpenStreamWithResponseCommand.async.cs b/sdk/src/Services/S3/Custom/Transfer/Internal/_async/OpenStreamWithResponseCommand.async.cs index 8a72d6b87164..3d4d3e197acc 100644 --- a/sdk/src/Services/S3/Custom/Transfer/Internal/_async/OpenStreamWithResponseCommand.async.cs +++ b/sdk/src/Services/S3/Custom/Transfer/Internal/_async/OpenStreamWithResponseCommand.async.cs @@ -27,17 +27,14 @@ namespace Amazon.S3.Transfer.Internal { internal partial class OpenStreamWithResponseCommand : BaseCommand { - private Logger Logger - { - get { return Logger.GetLogger(typeof(TransferUtility)); } - } + private readonly Logger _logger = Logger.GetLogger(typeof(OpenStreamWithResponseCommand)); public override async Task ExecuteAsync(CancellationToken cancellationToken) { - Logger.DebugFormat("OpenStreamWithResponseCommand: Creating BufferedMultipartStream with MultipartDownloadType={0}", + _logger.DebugFormat("OpenStreamWithResponseCommand: Creating BufferedMultipartStream with MultipartDownloadType={0}", _request.MultipartDownloadType); - Logger.DebugFormat("OpenStreamWithResponseCommand: Configuration - ConcurrentServiceRequests={0}, MaxInMemoryParts={1}, BufferSize={2}", + _logger.DebugFormat("OpenStreamWithResponseCommand: Configuration - ConcurrentServiceRequests={0}, MaxInMemoryParts={1}, BufferSize={2}", _config.ConcurrentServiceRequests, _request.MaxInMemoryParts, _s3Client.Config.BufferSize @@ -49,7 +46,7 @@ public override async Task ExecuteAsync(Cance // Populate metadata from the initial GetObject response (from discovery phase) var discoveryResult = bufferedStream.DiscoveryResult; - Logger.DebugFormat("OpenStreamWithResponseCommand: Stream initialized successfully - ObjectSize={0}, TotalParts={1}, IsSinglePart={2}", + _logger.DebugFormat("OpenStreamWithResponseCommand: Stream initialized successfully - ObjectSize={0}, TotalParts={1}, IsSinglePart={2}", discoveryResult.ObjectSize, discoveryResult.TotalParts, discoveryResult.IsSinglePart); diff --git a/sdk/src/Services/S3/Custom/Transfer/Internal/_bcl+netstandard/DownloadDirectoryCommand.cs b/sdk/src/Services/S3/Custom/Transfer/Internal/_bcl+netstandard/DownloadDirectoryCommand.cs index 3e426198ff0a..85cb94ac4662 100644 --- a/sdk/src/Services/S3/Custom/Transfer/Internal/_bcl+netstandard/DownloadDirectoryCommand.cs +++ b/sdk/src/Services/S3/Custom/Transfer/Internal/_bcl+netstandard/DownloadDirectoryCommand.cs @@ -35,10 +35,7 @@ internal partial class DownloadDirectoryCommand : BaseCommand ExecuteAsyn { FireTransferInitiatedEvent(); - Logger.DebugFormat("DownloadDirectoryCommand.ExecuteAsync: Starting - DownloadFilesConcurrently={0}, UseMultipartDownload={1}, ConcurrentServiceRequests={2}", + _logger.DebugFormat("DownloadDirectoryCommand.ExecuteAsync: Starting - DownloadFilesConcurrently={0}, UseMultipartDownload={1}, ConcurrentServiceRequests={2}", DownloadFilesConcurrently, this._useMultipartDownload, this._config.ConcurrentServiceRequests); // Step 1: Validate and setup @@ -64,7 +61,7 @@ public override async Task ExecuteAsyn .ConfigureAwait(false); this._totalNumberOfFilesToDownload = s3Objects.Count; - Logger.DebugFormat("DownloadDirectoryCommand.ExecuteAsync: Found {0} total objects, TotalBytes={1}", + _logger.DebugFormat("DownloadDirectoryCommand.ExecuteAsync: Found {0} total objects, TotalBytes={1}", s3Objects.Count, this._totalBytes); // Step 3: Filter to actual files (exclude directory markers) @@ -82,7 +79,7 @@ await ExecuteParallelDownloadsAsync( } // Step 5: Build response - Logger.DebugFormat("DownloadDirectoryCommand.ExecuteAsync: Completed - ObjectsDownloaded={0}, ObjectsFailed={1}", + _logger.DebugFormat("DownloadDirectoryCommand.ExecuteAsync: Completed - ObjectsDownloaded={0}, ObjectsFailed={1}", _numberOfFilesDownloaded, _errors.Count); var response = BuildResponse(); @@ -162,7 +159,7 @@ private List FilterObjectsToDownload(List s3Objects) .Where(s3o => !s3o.Key.EndsWith("/", StringComparison.Ordinal)) .ToList(); - Logger.DebugFormat("DownloadDirectoryCommand.FilterObjectsToDownload: Filtered to {0} files to download (excluded {1} directory markers)", + _logger.DebugFormat("DownloadDirectoryCommand.FilterObjectsToDownload: Filtered to {0} files to download (excluded {1} directory markers)", filtered.Count, s3Objects.Count - filtered.Count); return filtered; @@ -191,7 +188,7 @@ private DownloadResources CreateDownloadResources(CancellationToken cancellation if (this._useMultipartDownload) { httpRequestThrottler = new SemaphoreSlim(this._config.ConcurrentServiceRequests); - Logger.DebugFormat("DownloadDirectoryCommand.CreateDownloadResources: Created HTTP throttler with MaxConcurrentRequests={0}", + _logger.DebugFormat("DownloadDirectoryCommand.CreateDownloadResources: Created HTTP throttler with MaxConcurrentRequests={0}", this._config.ConcurrentServiceRequests); } @@ -214,7 +211,7 @@ private async Task ExecuteParallelDownloadsAsync( ? this._config.ConcurrentServiceRequests : 1; - Logger.DebugFormat("DownloadDirectoryCommand.ExecuteParallelDownloadsAsync: Starting task pool with ConcurrencyLevel={0}, TotalFiles={1}", + _logger.DebugFormat("DownloadDirectoryCommand.ExecuteParallelDownloadsAsync: Starting task pool with ConcurrencyLevel={0}, TotalFiles={1}", concurrencyLevel, objectsToDownload.Count); await TaskHelpers.ForEachWithConcurrencyAsync( @@ -234,7 +231,7 @@ await DownloadSingleFileAsync( cancellationToken) .ConfigureAwait(false); - Logger.DebugFormat("DownloadDirectoryCommand.ExecuteParallelDownloadsAsync: Task pool completed - ObjectsDownloaded={0}, ObjectsFailed={1}", + _logger.DebugFormat("DownloadDirectoryCommand.ExecuteParallelDownloadsAsync: Task pool completed - ObjectsDownloaded={0}, ObjectsFailed={1}", _numberOfFilesDownloaded, _errors.Count); } @@ -341,7 +338,7 @@ private TransferUtilityDownloadDirectoryResponse BuildResponse() private async Task> GetS3ObjectsToDownloadAsync(ListObjectsRequest listRequest, CancellationToken cancellationToken) { - Logger.DebugFormat("DownloadDirectoryCommand.GetS3ObjectsToDownloadAsync: Starting object listing"); + _logger.DebugFormat("DownloadDirectoryCommand.GetS3ObjectsToDownloadAsync: Starting object listing"); List objs = new List(); int pageCount = 0; @@ -364,11 +361,11 @@ private async Task> GetS3ObjectsToDownloadAsync(ListObjectsReques listRequest.Marker = listResponse.NextMarker; pageCount++; - Logger.DebugFormat("DownloadDirectoryCommand.GetS3ObjectsToDownloadAsync: Page {0} completed - ObjectsInPage={1}, TotalObjectsSoFar={2}", + _logger.DebugFormat("DownloadDirectoryCommand.GetS3ObjectsToDownloadAsync: Page {0} completed - ObjectsInPage={1}, TotalObjectsSoFar={2}", pageCount, listResponse.S3Objects?.Count ?? 0, objs.Count); } while (!string.IsNullOrEmpty(listRequest.Marker)); - Logger.DebugFormat("DownloadDirectoryCommand.GetS3ObjectsToDownloadAsync: Listing completed - TotalPages={0}, TotalObjects={1}", + _logger.DebugFormat("DownloadDirectoryCommand.GetS3ObjectsToDownloadAsync: Listing completed - TotalPages={0}, TotalObjects={1}", pageCount, objs.Count); return objs; @@ -376,7 +373,7 @@ private async Task> GetS3ObjectsToDownloadAsync(ListObjectsReques private async Task> GetS3ObjectsToDownloadV2Async(ListObjectsV2Request listRequestV2, CancellationToken cancellationToken) { - Logger.DebugFormat("DownloadDirectoryCommand.GetS3ObjectsToDownloadV2Async: Starting object listing (V2 API)"); + _logger.DebugFormat("DownloadDirectoryCommand.GetS3ObjectsToDownloadV2Async: Starting object listing (V2 API)"); List objs = new List(); int pageCount = 0; @@ -399,11 +396,11 @@ private async Task> GetS3ObjectsToDownloadV2Async(ListObjectsV2Re listRequestV2.ContinuationToken = listResponse.NextContinuationToken; pageCount++; - Logger.DebugFormat("DownloadDirectoryCommand.GetS3ObjectsToDownloadV2Async: Page {0} completed - ObjectsInPage={1}, TotalObjectsSoFar={2}", + _logger.DebugFormat("DownloadDirectoryCommand.GetS3ObjectsToDownloadV2Async: Page {0} completed - ObjectsInPage={1}, TotalObjectsSoFar={2}", pageCount, listResponse.S3Objects?.Count ?? 0, objs.Count); } while (!string.IsNullOrEmpty(listRequestV2.ContinuationToken)); - Logger.DebugFormat("DownloadDirectoryCommand.GetS3ObjectsToDownloadV2Async: Listing completed - TotalPages={0}, TotalObjects={1}", + _logger.DebugFormat("DownloadDirectoryCommand.GetS3ObjectsToDownloadV2Async: Listing completed - TotalPages={0}, TotalObjects={1}", pageCount, objs.Count); return objs; diff --git a/sdk/src/Services/S3/Custom/Transfer/TransferUtility.cs b/sdk/src/Services/S3/Custom/Transfer/TransferUtility.cs index f4dde2c232e2..d9cf6863e791 100644 --- a/sdk/src/Services/S3/Custom/Transfer/TransferUtility.cs +++ b/sdk/src/Services/S3/Custom/Transfer/TransferUtility.cs @@ -71,14 +71,7 @@ public partial class TransferUtility : ITransferUtility { "s3-object-lambda" }; - private static Logger Logger - { - get - { - - return Logger.GetLogger(typeof(ITransferUtility)); - } - } + private readonly Logger _logger = Logger.GetLogger(typeof(TransferUtility)); #region Constructors ///