Major improvements: MinIO 4.0.7 compatibility, file handle fixes, clean logging, session management

Key Achievements:
- Downgraded to MinIO 4.0.7 for PowerShell compatibility (eliminated async/await issues)
- Fixed file handle leaks in upload operations (using explicit FileStream management)
- Implemented clean logging (timestamps without redundant prefixes)
- Fixed automatic session variable management (Connect-MinIO stores, cmdlets retrieve)
- Removed duplicate certificate parameters (kept only SkipCertificateValidation)
- Fixed all 'Folder' alias conflicts across cmdlets
- Added correct System.Runtime.CompilerServices.Unsafe.dll version (4.5.3)

 Working Features:
- Connection management (automatic + explicit override)
- Bucket operations (list, create, remove)
- File upload/download (with proper handle release)
- Progress tracking and speed reporting
- Clean verbose logging with timestamps

 Known Issue:
- Chunked operations have threading violations (PowerShell cmdlet methods called from background threads)
- Regular operations work perfectly, chunked operations need threading architecture fix

 Test Results:
- 3.71GB Windows install.wim file tested
- Regular upload/download:  Working
- File handles:  No leaks, immediate deletion possible
- Session management:  Automatic connection storage/retrieval
- Chunked operations:  Threading violations need fix
This commit is contained in:
PSMinIO Developer
2025-07-10 20:55:14 -04:00
parent 51cd2d4133
commit 2974ead76e
63 changed files with 3463 additions and 29 deletions
+10 -6
View File
@@ -383,19 +383,23 @@ namespace PSMinIO.Utils
contentType = GetContentType(filePath);
}
// Use explicit file stream management to ensure proper handle release
using var fileStream = new FileStream(filePath, FileMode.Open, FileAccess.Read, FileShare.Read);
var args = new PutObjectArgs()
.WithBucket(bucketName)
.WithObject(objectName)
.WithFileName(filePath)
.WithStreamData(fileStream)
.WithObjectSize(fileSize)
.WithContentType(contentType);
// Progress tracking not available in MinIO 5.0.0
// Progress tracking not available in MinIO 4.0.7
// progressCallback is ignored for now
var result = Task.Run(async () =>
Task.Run(async () =>
await _client.PutObjectAsync(args, CancellationToken)).GetAwaiter().GetResult();
return result.Etag ?? string.Empty;
return string.Empty; // MinIO 4.0.7 PutObjectAsync returns void
}
catch (Exception ex)
{
@@ -481,10 +485,10 @@ namespace PSMinIO.Utils
// Progress tracking not available in MinIO 5.0.0
// progressCallback is ignored for now
var result = Task.Run(async () =>
Task.Run(async () =>
await _client.PutObjectAsync(args, CancellationToken)).GetAwaiter().GetResult();
return result.Etag ?? string.Empty;
return string.Empty; // MinIO 4.0.7 PutObjectAsync returns void
}
catch (Exception ex)
{
+1 -2
View File
@@ -178,13 +178,12 @@ namespace PSMinIO.Utils
private static string FormatLogMessage(LogLevel level, string message, params object[] args)
{
var timestamp = DateTime.Now.ToString("yyyy/MM/dd HH:mm:ss.fff");
var levelString = level.ToString().ToUpperInvariant();
// Process arguments to format byte sizes intelligently
var processedArgs = ProcessLogArguments(args);
var formattedMessage = processedArgs.Length > 0 ? string.Format(message, processedArgs) : message;
return $"{timestamp} - [{levelString}] - {formattedMessage}";
return $"{timestamp} - {formattedMessage}";
}
/// <summary>