Files
PSMinIO/docs/examples/04-Chunked-Operations.ps1
T
PSMinIO Developer 3e4a7e0810 Create comprehensive PowerShell threading documentation and patterns
� PERMANENT THREADING KNOWLEDGE BASE:

 CREATED COMPREHENSIVE DOCUMENTATION:
  • docs/POWERSHELL-THREADING-RULES.md - Complete threading guide
  • Enhanced ThreadSafeProgressCollector with usage examples
  • Added to project structure documentation
  • Saved to AI memory for future reference

� CRITICAL RULES DOCUMENTED:
  • PowerShell cmdlets can ONLY call Write-* methods from main thread
  • Background threads must QUEUE updates, never call Write-* directly
  • ProcessQueuedUpdates() must ONLY be called from main thread
  • Common mistakes and error symptoms clearly identified

� DESIGN PATTERNS PROVIDED:
  • Periodic processing pattern (every 1 second)
  • Completion-based processing pattern
  • Manual processing points pattern
  • Correct Task.WaitAll usage with timeouts

� IMPLEMENTATION CHECKLIST:
  • Pre-implementation checklist for new cmdlets
  • Debugging tips and error identification
  • Code examples for correct and incorrect patterns
  • Testing guidelines for threading compliance

� PREVENTS FUTURE REGRESSIONS:
  • Clear documentation of the 'golden rule'
  • Examples of common threading violations
  • Patterns for all background operation types
  • Reference for all future PowerShell module development

This ensures we never repeat the same threading mistakes!
2025-07-14 22:26:29 -04:00

154 lines
6.9 KiB
PowerShell

# PSMinIO Chunked Operations Example
# Demonstrates chunked uploads and downloads for large files with progress tracking
# Import the module
Import-Module ..\..\Module\PSMinIO\PSMinIO.psd1
# Connection details (replace with your actual values)
$endpoint = "https://minio.example.com"
$accessKey = "your-access-key"
$secretKey = "your-secret-key"
try {
# Connect to MinIO
$connection = Connect-MinIO -Endpoint $endpoint -AccessKey $accessKey -SecretKey $secretKey
"Connected to MinIO server for chunked operations demo"
# Create a demo bucket
$bucketName = "chunked-demo-$(Get-Date -Format 'yyyyMMdd-HHmmss')"
New-MinIOBucket -BucketName $bucketName
"Created demo bucket: $bucketName"
"=== 1. Creating Large Test Files ==="
# Create files of different sizes for testing
# Small file (under chunk size)
$smallContent = "Small file content " * 100 # ~2KB
$smallContent | Out-File -FilePath "small-file.txt" -Encoding UTF8 -NoNewline
# Medium file (1-2 chunks)
$mediumContent = "Medium file content " * 30000 # ~600KB
$mediumContent | Out-File -FilePath "medium-file.txt" -Encoding UTF8 -NoNewline
# Large file (multiple chunks)
$largeContent = "Large file content " * 100000 # ~2MB
$largeContent | Out-File -FilePath "large-file.txt" -Encoding UTF8 -NoNewline
# Very large file (many chunks)
$veryLargeContent = "Very large file content " * 250000 # ~6MB
$veryLargeContent | Out-File -FilePath "very-large-file.txt" -Encoding UTF8 -NoNewline
"Created test files of various sizes"
Get-ChildItem "*.txt" | Format-Table Name, @{Name="Size";Expression={"$([math]::Round($_.Length/1KB,2)) KB"}}
""
"=== 2. Chunked Upload with Different Chunk Sizes ==="
# Upload with 1MB chunks (default)
"Uploading medium file with 1MB chunks..."
$result1 = New-MinIOObjectChunked -BucketName $bucketName -Files "medium-file.txt" -ChunkSize 1MB -BucketDirectory "uploads/1mb-chunks"
$result1 | Format-Table Name, @{Name="SizeMB";Expression={[math]::Round($_.Size/1MB,2)}}, @{Name="Duration";Expression={$_.Duration}}, @{Name="Speed";Expression={$_.AverageSpeedFormatted}}
""
# Upload with 512KB chunks
"Uploading large file with 512KB chunks..."
$result2 = New-MinIOObjectChunked -BucketName $bucketName -Files "large-file.txt" -ChunkSize 512KB -BucketDirectory "uploads/512kb-chunks"
$result2 | Format-Table Name, @{Name="SizeMB";Expression={[math]::Round($_.Size/1MB,2)}}, @{Name="Duration";Expression={$_.Duration}}, @{Name="Speed";Expression={$_.AverageSpeedFormatted}}
""
# Upload with 2MB chunks
"Uploading very large file with 2MB chunks..."
$result3 = New-MinIOObjectChunked -BucketName $bucketName -Files "very-large-file.txt" -ChunkSize 2MB -BucketDirectory "uploads/2mb-chunks"
$result3 | Format-Table Name, @{Name="SizeMB";Expression={[math]::Round($_.Size/1MB,2)}}, @{Name="Duration";Expression={$_.Duration}}, @{Name="Speed";Expression={$_.AverageSpeedFormatted}}
""
"=== 3. Multiple File Chunked Upload ==="
# Upload multiple files in one operation
"Uploading multiple files with chunked transfer..."
$multiResult = New-MinIOObjectChunked -BucketName $bucketName -Files @("small-file.txt", "medium-file.txt") -ChunkSize 1MB -BucketDirectory "uploads/multi-file"
$multiResult | Format-Table Name, @{Name="SizeMB";Expression={[math]::Round($_.Size/1MB,2)}}, @{Name="Duration";Expression={$_.Duration}}, @{Name="Speed";Expression={$_.AverageSpeedFormatted}}
""
"=== 4. Chunked Download Operations ==="
# Download with chunked transfer
"Downloading large file with chunked transfer..."
$downloadResult = Get-MinIOObjectContentChunked -BucketName $bucketName -ObjectName "uploads/2mb-chunks/very-large-file.txt" -FilePath "downloaded-very-large.txt" -ChunkSize 1MB
$downloadResult | Format-Table @{Name="LocalFile";Expression={$_.FilePath.Name}}, @{Name="SizeMB";Expression={[math]::Round($_.FilePath.Length/1MB,2)}}, @{Name="Duration";Expression={$_.Duration}}, @{Name="Speed";Expression={$_.AverageSpeedFormatted}}
""
# Verify download integrity
if (Test-Path "downloaded-very-large.txt") {
$originalSize = (Get-Item "very-large-file.txt").Length
$downloadedSize = (Get-Item "downloaded-very-large.txt").Length
if ($originalSize -eq $downloadedSize) {
"✅ Download integrity verified - sizes match ($originalSize bytes)"
} else {
"❌ Download integrity check failed - size mismatch"
}
}
""
"=== 5. Performance Comparison ==="
# Compare regular vs chunked upload for the same file
"Comparing regular vs chunked upload performance..."
# Regular upload
$regularStart = Get-Date
$regularResult = New-MinIOObject -BucketName $bucketName -Files "large-file.txt" -BucketDirectory "comparison/regular"
$regularEnd = Get-Date
$regularDuration = $regularEnd - $regularStart
# Chunked upload
$chunkedStart = Get-Date
$chunkedResult = New-MinIOObjectChunked -BucketName $bucketName -Files "large-file.txt" -ChunkSize 1MB -BucketDirectory "comparison/chunked"
$chunkedEnd = Get-Date
$chunkedDuration = $chunkedEnd - $chunkedStart
"Performance Comparison for large-file.txt:"
[PSCustomObject]@{
Method = "Regular"
Duration = $regularDuration.ToString("mm\:ss\.fff")
Speed = $regularResult.AverageSpeedFormatted
} | Format-Table
[PSCustomObject]@{
Method = "Chunked"
Duration = $chunkedDuration.ToString("mm\:ss\.fff")
Speed = $chunkedResult.AverageSpeedFormatted
} | Format-Table
""
"=== 6. Listing Uploaded Files ==="
# Show all uploaded files with their details
$allUploads = Get-MinIOObject -BucketName $bucketName -Prefix "uploads/" -ObjectsOnly -SortBy "Size" -Descending
"All uploaded files (sorted by size):"
$allUploads | Format-Table Name, @{Name="SizeMB";Expression={[math]::Round($_.Size/1MB,2)}}, LastModified -AutoSize
""
"=== 7. Chunk Size Recommendations ==="
"Chunk Size Recommendations:"
"• Files < 10MB: Use regular upload (New-MinIOObject)"
"• Files 10MB - 100MB: Use 1-5MB chunks"
"• Files 100MB - 1GB: Use 5-10MB chunks"
"• Files > 1GB: Use 10-50MB chunks"
"• Network considerations: Smaller chunks for unstable connections"
""
# Clean up
"Cleaning up demo files..."
$allObjects = Get-MinIOObject -BucketName $bucketName
foreach ($obj in $allObjects) {
if (-not $obj.IsDirectory) {
Remove-MinIOObject -BucketName $bucketName -ObjectName $obj.Name -Force
}
}
Remove-MinIOBucket -BucketName $bucketName -Force
Remove-Item "small-file.txt", "medium-file.txt", "large-file.txt", "very-large-file.txt", "downloaded-very-large.txt" -Force -ErrorAction SilentlyContinue
"✅ Chunked operations demo completed"
} catch {
"❌ Error: $($_.Exception.Message)"
}