//exception boundary: chunk upload exceptions should be propagated to here but no farther
        private Task <PartUploadResult> AttemptPartUploadWithRetry(Func <FilePart, Task> attemptUpload, FilePart part, int retryCount)
        {
            if (retryCount < 0)
            {
                return(TaskFromResult(PartUploadResult.Error));
            }

            return(attemptUpload(part).ContinueWith(uploadTask =>
            {
                if (uploadTask.Exception != null)
                {
                    // Always back out progress if part fails
                    updateProgress(part.Length * -1);

                    if (retryCount > 0)
                    {
                        return AttemptPartUploadWithRetry(attemptUpload, part, retryCount - 1).Result;
                    }
                    else
                    {
                        return PartUploadResult.Exception(uploadTask.Exception.Unwrap());
                    }
                }
                else
                {
                    return PartUploadResult.Success;
                }
            }));
        }
Пример #2
0
        public async Task <PartUploadResult> UploadPartAsync(string bucketName, string objectKey, string uploadId, uint partNumber, byte[] partBytes)
        {
            using (var partUploadResult = await Task.Run(() => SWIG.storj_uplink.uplink_upload_part(_access._project, bucketName, objectKey, uploadId, partNumber)).ConfigureAwait(false))
            {
                PartUploadResult result = new PartUploadResult(partUploadResult.part_upload);

                if (partUploadResult.error != null && !string.IsNullOrEmpty(partUploadResult.error.message))
                {
                    result.Error = partUploadResult.error.message;
                }
                else
                {
                    try
                    {
                        result.BytesWritten = await Task.Run(() => DoUnsafeUpload(partUploadResult.part_upload, objectKey, partBytes)).ConfigureAwait(false);
                    }
                    catch (Exception ex)
                    {
                        result.Error = ex.Message;
                    }
                }
                return(result);
            }
        }