public static async Task <long> CopyFileToBlobAsync(
            [ActivityTrigger] DirectoryInfo folderInfo,
            [Inject] ILog log,
            [Inject] BlobRequestOptionsHelper blobRequestOptionsHelper,
            [Inject] BackupFolderBlobRepository backupFolderBlobRepository,
            [Inject] BackupFolderTableStorageRepository backupFolderTableStorageRepository)
        {
            log.Info($"Start copying files from '{folderInfo.FullName}'");

            log.Info("Initializing repositories");
            backupFolderBlobRepository.Initialize();
            backupFolderTableStorageRepository.Initialize();

            log.Info($"Deleting all records from '{backupFolderBlobRepository.Config.ContainerName}'");
            await backupFolderBlobRepository.DeleteContainerAsync();

            backupFolderBlobRepository.Initialize();

            var folderFiles = await backupFolderTableStorageRepository.GetAllAsync();

            log.Info($"Retrieved {folderFiles.Count} records from '{backupFolderTableStorageRepository.Config.TableName}'");

            var tasks = new List <Task <long> >();

            foreach (var file in folderFiles)
            {
                tasks.Add(CopyFileAsync(file.FileName, log, backupFolderBlobRepository, blobRequestOptionsHelper));
            }
            await Task.WhenAll(tasks);

            var totalBytes = tasks.Sum(t => t.Result);

            return(totalBytes);
        }
示例#2
0
 public BlobStorageProviderBase(ILog log,
                                ValidateStorage validateStorage,
                                CloudBlockBlobMd5Helper cloudBlockBlobMd5Helper,
                                BlobRequestOptionsHelper blobRequestOptionsHelper)
 {
     // inspired by:
     // https://docs.particular.net/nservicebus/azure-storage-persistence/performance-tuning
     // http://blogs.msmvps.com/nunogodinho/2013/11/20/windows-azure-storage-performance-best-practices/
     // https://blogs.msdn.microsoft.com/windowsazurestorage/2010/06/25/nagles-algorithm-is-not-friendly-towards-small-requests/
     // https://alexandrebrisebois.wordpress.com/2013/03/24/why-are-webrequests-throttled-i-want-more-throughput/
     log.Debug();
     ServicePointManager.UseNagleAlgorithm      = false;
     ServicePointManager.Expect100Continue      = false;
     ServicePointManager.DefaultConnectionLimit = 1000;
     _validateStorage          = validateStorage;
     _cloudBlockBlobMd5Helper  = cloudBlockBlobMd5Helper;
     _blobRequestOptionsHelper = blobRequestOptionsHelper;
 }
        private static async Task <long> CopyFileAsync(string filePath, ILog log, BackupFolderBlobRepository backupFolderBlobRepository, BlobRequestOptionsHelper blobRequestOptionsHelper)
        {
            var fileBytes          = new FileInfo(filePath).Length;
            var blobOutputLocation = GetBlobName(filePath);

            log.Info($"Copying {filePath} to {blobOutputLocation}, size: {fileBytes.ToPrettySize()}");
            var cloudBlockBlob = backupFolderBlobRepository.CreateBlockBlob(blobOutputLocation, "image/jpg");

            try
            {
                using (Stream source = File.Open(filePath, FileMode.Open, FileAccess.Read, FileShare.Read))
                {
                    source.Seek(0, SeekOrigin.Begin);
                    await cloudBlockBlob.UploadFromStreamAsync(source, null, blobRequestOptionsHelper.Get(), null);
                }
            }
            catch (Exception ex)
            {
                log.Error(ex.Message);
            }

            return(fileBytes);
        }
 public BackupFolderBlobRepository(ILog log, ValidateStorage validateStorage,
                                   CloudBlockBlobMd5Helper cloudBlockBlobMd5Helper, BlobRequestOptionsHelper blobRequestOptionsHelper, BackupFolderBlobRepositoryConfig backupFolderBlobRepositoryConfig)
     : base(log, validateStorage, cloudBlockBlobMd5Helper, blobRequestOptionsHelper, backupFolderBlobRepositoryConfig)
 {
 }