public async Task<CloudAppendBlob> GetBlobReference(String shardingKey, String containerName, String streamId, CancellationToken token, StreamOptions streamOptions)
{
var client = _hydra.CreateBlobClient(shardingKey);
var account = client.Credentials.AccountName;
var container = client.GetContainerReference(containerName);
var semaphore = GetSemaphore(account, containerName, streamId);
if (await semaphore.WaitAsync(TimeSpan.FromSeconds(5), token))
{
try
{
if (streamOptions.CreateContainer && !GetContainerExists(account, containerName))
{
await container.CreateIfNotExistsAsync(token);
SetContainerExists(account, containerName);
}
var blob = container.GetAppendBlobReference(streamId);
if (streamOptions.CreateBlob && !GetStreamExists(account, containerName, streamId) && !await blob.ExistsAsync(token))
{
await blob.CreateOrReplaceAsync(token);
SetStreamExists(account, containerName, streamId);
}
return blob;
}
finally
{
semaphore.Release();
}
}
throw new TimeoutException("Unable to get blob reference");
}