Не удалось загрузить BLOB-объект Azure через 15 минут - PullRequest
0 голосов
/ 10 июля 2019

Я использую библиотеку DataMovement для загрузки файла в учетную запись хранилища Azure.Размер большого двоичного объекта составляет 96 МБ.

Если через 15 минут подключение происходит медленно, загрузка не удалась с ошибкой: Произошла одна или несколько ошибок.(Ошибка передачи.)

Мой код:

CloudBlockBlob blockBlob = new CloudBlockBlob(new Uri(sConnString));
ServicePointManager.Expect100Continue = false;
TransferManager.Configurations.ParallelOperations = 10;
...
var task = TransferManager.UploadAsync(pathFile, blockBlob, null, context, CancellationToken.None);                
task.Wait();

Как я могу это решить?Почему 15 минут?

Ошибка StackTrace:

   at System.Threading.Tasks.Task.Wait(Int32 millisecondsTimeout, CancellationToken cancellationToken)
   at System.Threading.Tasks.Task.Wait()
   at TeamSystem.Enterprise.Cloud.Migrator.Engine.CloudServices.UploadFile(String pathFile, String blobName, Boolean testMode) in C:\EnterpriseCloud\Migrator\TeamSystem.Enterprise.Cloud.Migrator.Engine\Code\CloudServices.cs:line 86

Большое спасибо.

Ответы [ 2 ]

0 голосов
/ 12 июля 2019

Я нашел решение!Проблема была в свойстве «TransferManager.Configurations.ParallelOperations».

При попытке уменьшить это значение с 64 до 2 в случае медленного соединения у меня нет проблемы.

Так что ясоздала функцию, подобную этой, для преобразования «ParallelOperations» из скорости соединения:

private int GetParallelOperations(double transfertSpeed)
        {
            int retval = 0;
            switch (transfertSpeed)
            {
                case double n when (n >= 1):
                    retval = Environment.ProcessorCount * 8;
                    break;
                case double n when (n < 1 && n>=0.1):
                    retval = 10;
                    break;                
                default:
                    retval = 2;
                    break;
            }

            return retval;
        }

А затем:

TransferManager.Configurations.ParallelOperations = GetParallelOperations(Utilities.TransferSpeed);

, где скорость передачи определяется простым файлом размером 5 МБ.Для теста скорости я оставил для «ParallelOperations» значение «Environment.ProcessorCount * 8» (работает также в случае медленного соединения).

0 голосов
/ 11 июля 2019

Я пытался добавить логику повторения, но, похоже, она не работает.

В исключении catch я добавил вызов метода для возобновления передачи:

...
catch (Exception e) {
ResumeTransfert(context, pathFile, blockBlob);
}

private void ResumeTransfert(SingleTransferContext context, string pathFile, CloudBlockBlob blockBlob)
{
    SingleTransferContext retryContext = context;
    SingleTransferContext resumeContext = null;

    while (true)
    {
        try
        {
            // Store the transfer checkpoint
            TransferCheckpoint checkpoint = retryContext.LastCheckpoint;                    

            // Create a new TransferContext with the store checkpoint
            resumeContext = new SingleTransferContext(checkpoint);
            resumeContext.ProgressHandler = new Progress<TransferStatus>((progress) => {                    
                if (progress.BytesTransferred > 0)
                {
                    double byteTransferred = Math.Truncate(ByteSize.FromBytes(progress.BytesTransferred).MegaBytes);
                    Log.WriteLog(String.Format("Uploaded: {0} MB", byteTransferred));                            
                }                    
            });

            // Record the overall progress
            ProgressRecorder recorder = new ProgressRecorder();
            resumeContext.ProgressHandler = recorder;

            // Resume transfer from the stored checkpoint
            Console.WriteLine("Resume the cancelled transfer.");
            var task = TransferManager.UploadAsync(pathFile, blockBlob, null, resumeContext);
            task.Wait();

            return;
        }
        catch (Exception e)
        {
            Log.WriteLog("ResumeTransfert: " + e.Message, LogType.Error, LogLevel.Standard);
            retryContext = resumeContext;

            continue;
        }
    }          
}

Каждый раз, когда я ловлю исключение и перезагружаюсь с последней контрольной точкой, но это не работает.Где я не прав?

Спасибо.

...