in Source/NuGetGallery.Operations/Tasks/CopyBlobsTask.cs [49:111]
public override void ExecuteCommand()
{
var sourceClient = SourceStorage.CreateCloudBlobClient();
var sourceContainer = sourceClient.GetContainerReference(SourceContainer);
if (!sourceContainer.Exists())
{
Log.Warn("No blobs in container!");
return;
}
var destClient = DestinationStorage.CreateCloudBlobClient();
var destContainer = destClient.GetContainerReference(DestinationContainer);
destContainer.CreateIfNotExists();
Log.Info("Collecting blob names in {0} to copy to {1}", SourceStorage.Credentials.AccountName, DestinationStorage.Credentials.AccountName);
var blobs = Util.CollectBlobs(
Log,
sourceContainer,
Prefix ?? String.Empty,
condition: b => (!PackageBlobsOnly || (!b.Name.StartsWith("/") && String.Equals(b.Name.ToLowerInvariant(), b.Name, StringComparison.Ordinal))),
countEstimate: 140000);
var count = blobs.Count;
int index = 0;
Parallel.ForEach(blobs, new ParallelOptions { MaxDegreeOfParallelism = 10 }, blob =>
{
int currentIndex = Interlocked.Increment(ref index);
var percentage = (((double)currentIndex / (double)count) * 100);
var destBlob = destContainer.GetBlockBlobReference(blob.Name);
try
{
if (!destBlob.Exists() || Overwrite)
{
Log.Info("[{1:000000}/{2:000000}] ({3:000.00}%) Started Async Copy of {0}.", blob.Name, currentIndex, count, percentage);
if (!WhatIf)
{
destBlob.StartCopyFromBlob(blob);
}
}
else
{
Log.Info("[{1:000000}/{2:000000}] ({3:000.00}%) Skipped {0}. Blob already Exists", blob.Name, index, count, percentage);
}
}
catch (StorageException stex)
{
if (stex.RequestInformation.HttpStatusCode == (int)HttpStatusCode.Conflict &&
stex.RequestInformation.ExtendedErrorInformation.ErrorCode == BlobErrorCodeStrings.PendingCopyOperation)
{
Log.Info("[{1:000000}/{2:000000}] ({3:000.00}%) Skipped {0}. Already being copied", blob.Name, index, count, percentage);
}
}
catch (Exception ex)
{
Log.Error("Error processing {0}: {1}", blob.Name, ex.ToString());
throw;
}
});
Log.Info("Copies started. Run checkblobcopies with similar parameters to wait on blob copy completion");
}