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); }
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) { }