in sdk/storage/Azure.Storage.DataMovement.Blobs/stress/src/src/Program.cs [39:323]
private static async Task RunOptions(Options opts)
{
// See if there are environment variables available to use in the .env file
var environment = new Dictionary<string, string>();
var environmentFile = Environment.GetEnvironmentVariable("ENV_FILE");
environment = EnvironmentReader.LoadFromFile(environmentFile);
environment.TryGetValue(DataMovementBlobStressConstants.EnvironmentVariables.ApplicationInsightsKey, out var appInsightsKey);
environment.TryGetValue(DataMovementBlobStressConstants.EnvironmentVariables.StorageSourceBlobEndpoint, out var blobSourceEndpoint);
environment.TryGetValue(DataMovementBlobStressConstants.EnvironmentVariables.StorageDestinationBlobEndpoint, out var blobDestinationEndpoint);
// Check values
// If a job index is provided, a single role is started, otherwise, all specified roles within the
// test scenario runs are run in parallel.
TokenCredential tokenCredential = new DefaultAzureCredential();
using var cancellationSource = new CancellationTokenSource();
var runDuration = TimeSpan.FromHours(1);
cancellationSource.CancelAfter(runDuration);
var metrics = new Metrics(appInsightsKey);
using var azureEventListener = new AzureEventSourceListener((args, level) => metrics.Client.TrackTrace($"EventWritten: {args.ToString()} Level: {level}."), EventLevel.Warning);
try
{
TestScenarioName testScenarioName = StringToTestScenario(opts.Test);
metrics.Client.Context.GlobalProperties["TestName"] = opts.Test;
string guid = Guid.NewGuid().ToString();
metrics.Client.TrackEvent($"Starting a test {testScenarioName} run.");
TestScenarioBase testScenario = null;
TransferManagerOptions transferManagerOptions = new TransferManagerOptions()
{
MaximumConcurrency = opts.Parallel,
};
TransferOptions transferOptions = new()
{
MaximumTransferChunkSize = opts.BlockSize,
InitialTransferSize = opts.InitialTransferSize,
};
switch (testScenarioName)
{
case TestScenarioName.UploadSingleBlockBlob:
testScenario = new UploadBlockBlobSingleScenario(
new Uri(blobSourceEndpoint),
opts.Size,
transferManagerOptions,
transferOptions,
tokenCredential,
metrics,
guid);
break;
case TestScenarioName.UploadDirectoryBlockBlob:
testScenario = new UploadBlockBlobDirectoryScenario(
destinationBlobUri: new Uri(blobSourceEndpoint),
blobSize: opts.Size,
blobCount: opts.Count,
transferManagerOptions: transferManagerOptions,
transferOptions: transferOptions,
tokenCredential: tokenCredential,
metrics: metrics,
testRunId: guid);
break;
case TestScenarioName.DownloadSingleBlockBlob:
testScenario = new DownloadBlockBlobSingleScenario(
new Uri(blobSourceEndpoint),
opts.Size,
transferManagerOptions,
transferOptions,
tokenCredential,
metrics,
guid);
break;
case TestScenarioName.DownloadDirectoryBlockBlob:
testScenario = new DownloadBlockBlobDirectoryScenario(
new Uri(blobSourceEndpoint),
opts.Size,
opts.Count,
transferManagerOptions,
transferOptions,
tokenCredential,
metrics,
guid);
break;
case TestScenarioName.CopySingleBlockBlob:
testScenario = new CopyBlockBlobSingleScenario(
new Uri(blobSourceEndpoint),
new Uri(blobDestinationEndpoint),
opts.Size,
transferManagerOptions,
transferOptions,
tokenCredential,
tokenCredential,
metrics,
guid);
break;
case TestScenarioName.CopyDirectoryBlockBlob:
testScenario = new CopyBlockBlobDirectoryScenario(
new Uri(blobSourceEndpoint),
new Uri(blobDestinationEndpoint),
opts.Size,
opts.Count,
transferManagerOptions,
transferOptions,
tokenCredential,
tokenCredential,
metrics,
guid);
break;
case TestScenarioName.UploadSingleAppendBlob:
testScenario = new UploadAppendBlobSingleScenario(
new Uri(blobSourceEndpoint),
opts.Size,
transferManagerOptions,
transferOptions,
tokenCredential,
metrics,
guid);
break;
case TestScenarioName.UploadDirectoryAppendBlob:
testScenario = new UploadAppendBlobDirectoryScenario(
new Uri(blobSourceEndpoint),
opts.Size,
opts.Count,
transferManagerOptions,
transferOptions,
tokenCredential,
metrics,
guid);
break;
case TestScenarioName.DownloadSingleAppendBlob:
testScenario = new DownloadAppendBlobSingleScenario(
new Uri(blobSourceEndpoint),
opts.Size,
transferManagerOptions,
transferOptions,
tokenCredential,
metrics,
guid);
break;
case TestScenarioName.DownloadDirectoryAppendBlob:
testScenario = new DownloadAppendBlobDirectoryScenario(
new Uri(blobSourceEndpoint),
opts.Size,
opts.Count,
transferManagerOptions,
transferOptions,
tokenCredential,
metrics,
guid);
break;
case TestScenarioName.CopySingleAppendBlob:
testScenario = new CopyAppendBlobSingleScenario(
new Uri(blobSourceEndpoint),
new Uri(blobDestinationEndpoint),
opts.Size,
transferManagerOptions,
transferOptions,
tokenCredential,
tokenCredential,
metrics,
guid);
break;
case TestScenarioName.CopyDirectoryAppendBlob:
testScenario = new CopyAppendBlobDirectoryScenario(
new Uri(blobSourceEndpoint),
new Uri(blobDestinationEndpoint),
opts.Size,
opts.Count,
transferManagerOptions,
transferOptions,
tokenCredential,
tokenCredential,
metrics,
guid);
break;
case TestScenarioName.UploadSinglePageBlob:
testScenario = new UploadPageBlobSingleScenario(
new Uri(blobSourceEndpoint),
opts.Size,
transferManagerOptions,
transferOptions,
tokenCredential,
metrics,
guid);
break;
case TestScenarioName.UploadDirectoryPageBlob:
testScenario = new UploadPageBlobDirectoryScenario(
new Uri(blobSourceEndpoint),
opts.Size,
opts.Count,
transferManagerOptions,
transferOptions,
tokenCredential,
metrics,
guid);
break;
case TestScenarioName.DownloadSinglePageBlob:
testScenario = new DownloadPageBlobSingleScenario(
new Uri(blobSourceEndpoint),
opts.Size,
transferManagerOptions,
transferOptions,
tokenCredential,
metrics,
guid);
break;
case TestScenarioName.DownloadDirectoryPageBlob:
testScenario = new DownloadPageBlobDirectoryScenario(
new Uri(blobSourceEndpoint),
opts.Size,
opts.Count,
transferManagerOptions,
transferOptions,
tokenCredential,
metrics,
guid);
break;
case TestScenarioName.CopySinglePageBlob:
testScenario = new CopyPageBlobSingleScenario(
new Uri(blobSourceEndpoint),
new Uri(blobDestinationEndpoint),
opts.Size,
transferManagerOptions,
transferOptions,
tokenCredential,
tokenCredential,
metrics,
guid);
break;
case TestScenarioName.CopyDirectoryPageBlob:
testScenario = new CopyPageBlobDirectoryScenario(
new Uri(blobSourceEndpoint),
new Uri(blobDestinationEndpoint),
opts.Size,
opts.Count,
transferManagerOptions,
transferOptions,
tokenCredential,
tokenCredential,
metrics,
guid);
break;
default:
throw new Exception("No Scenario or Invalid scenario passed");
}
var testRun = testScenario.RunTestAsync(cancellationSource.Token);
while (!testRun.IsCompleted)
{
metrics.UpdateEnvironmentStatistics();
await Task.Delay(TimeSpan.FromMinutes(5), cancellationSource.Token).ConfigureAwait(false);
}
metrics.Client.TrackEvent("Test run is ending.");
}
catch (TaskCanceledException)
{
// Run is complete
}
catch (Exception ex) when
(ex is OutOfMemoryException
|| ex is StackOverflowException
|| ex is ThreadAbortException)
{
throw;
}
catch (Exception ex)
{
metrics.Client.TrackException(ex);
}
finally
{
// We need to wait one minute after flushing the Application Insights client. The Application
// Insights flush is non-deterministic, so we don't want to let the application close until
// all telemetry has been sent.
metrics.Client.Flush();
await Task.Delay(60000).ConfigureAwait(false);
}
}