in sdk/Common/ResumableUploadManager.cs [613:697]
private void UploadPart(object state)
{
UploadTask taskParam = state as UploadTask;
if (taskParam == null)
{
throw new ClientException("Internal error. The state object should be an instance of class UploadTaskParam");
}
try
{
ResumablePartContext part = taskParam.ResumableUploadPartContext;
if (part.IsCompleted)
{
return;
}
const int retryCount = 3;
Stream stream = taskParam.InputStream;
for (int i = 0; i < retryCount; i++)
{
if (stream is FileStream)
{
stream.Seek(part.Position, SeekOrigin.Begin);
}
else
{
stream.Seek(0, SeekOrigin.Begin);
}
Stream progressCallbackStream = null;
try
{
if (taskParam.UploadProgressCallback != null)
{
progressCallbackStream = _ossClient.SetupProgressListeners(stream,
taskParam.UploadFileStream.Length, // does not matter
_uploadedBytes, // does not matter
Math.Min(taskParam.ProgressUpdateInterval, 1024 * 4),
this.ProcessCallbackInternal);
}
var request = new UploadPartRequest(taskParam.ResumableUploadContext.BucketName, taskParam.ResumableUploadContext.Key, taskParam.ResumableUploadContext.UploadId)
{
InputStream = progressCallbackStream ?? stream,
PartSize = part.Length,
PartNumber = part.PartId,
RequestPayer = _request.RequestPayer,
TrafficLimit = _request.TrafficLimit
};
var partResult = _ossClient.UploadPart(request);
part.PartETag = partResult.PartETag;
if (partResult.ResponseMetadata.ContainsKey(HttpHeaders.HashCrc64Ecma))
{
part.Crc64 = ulong.Parse(partResult.ResponseMetadata[HttpHeaders.HashCrc64Ecma]);
}
part.IsCompleted = true;
break;
}
catch (Exception ex) // when the connection is closed while sending the data, it will run into ObjectDisposedException.
{
if (!(ex is ObjectDisposedException || ex is WebException) || i == retryCount - 1)
{
throw;
}
}
finally
{
if (progressCallbackStream != null)
{
progressCallbackStream.Dispose();
}
}
}
}
catch(Exception e)
{
taskParam.Error = e;
}
finally
{
taskParam.Finished.Set();
}
}