Skip to content

Commit 04a8101

Browse files
committed
Add Progress listeners for initiated, complete, and failed for simple upload
stack-info: PR: #4059, branch: GarrettBeatty/stacked/1
1 parent 083d27b commit 04a8101

File tree

6 files changed

+561
-8
lines changed

6 files changed

+561
-8
lines changed
Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
{
2+
"services": [
3+
{
4+
"serviceName": "S3",
5+
"type": "minor",
6+
"changeLogMessages": [
7+
"Added UploadInitiatedEvent, UploadCompletedEvent, and UploadFailedEvent for non multipart uploads."
8+
]
9+
}
10+
]
11+
}

sdk/src/Services/S3/Custom/Transfer/Internal/SimpleUploadCommand.cs

Lines changed: 44 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -41,12 +41,18 @@ internal partial class SimpleUploadCommand : BaseCommand
4141
IAmazonS3 _s3Client;
4242
TransferUtilityConfig _config;
4343
TransferUtilityUploadRequest _fileTransporterRequest;
44+
long _totalTransferredBytes;
45+
private readonly long _contentLength;
4446

4547
internal SimpleUploadCommand(IAmazonS3 s3Client, TransferUtilityConfig config, TransferUtilityUploadRequest fileTransporterRequest)
4648
{
4749
this._s3Client = s3Client;
4850
this._config = config;
4951
this._fileTransporterRequest = fileTransporterRequest;
52+
53+
// Cache content length immediately while stream is accessible to avoid ObjectDisposedException in failure scenarios
54+
this._contentLength = this._fileTransporterRequest.ContentLength;
55+
5056
var fileName = fileTransporterRequest.FilePath;
5157
}
5258

@@ -108,9 +114,45 @@ internal PutObjectRequest ConstructRequest()
108114

109115
private void PutObjectProgressEventCallback(object sender, UploadProgressArgs e)
110116
{
111-
var progressArgs = new UploadProgressArgs(e.IncrementTransferred, e.TransferredBytes, e.TotalBytes,
112-
e.CompensationForRetry, _fileTransporterRequest.FilePath);
117+
// Keep track of the total transferred bytes so that we can also return this value in case of failure
118+
long transferredBytes = Interlocked.Add(ref _totalTransferredBytes, e.IncrementTransferred - e.CompensationForRetry);
119+
120+
var progressArgs = new UploadProgressArgs(e.IncrementTransferred, transferredBytes, _contentLength,
121+
e.CompensationForRetry, _fileTransporterRequest.FilePath, _fileTransporterRequest);
113122
this._fileTransporterRequest.OnRaiseProgressEvent(progressArgs);
114123
}
124+
125+
private void FireTransferInitiatedEvent()
126+
{
127+
var initiatedArgs = new UploadInitiatedEventArgs(
128+
request: _fileTransporterRequest,
129+
totalBytes: _contentLength
130+
);
131+
132+
_fileTransporterRequest.OnRaiseTransferInitiatedEvent(initiatedArgs);
133+
}
134+
135+
private void FireTransferCompletedEvent(TransferUtilityUploadResponse response)
136+
{
137+
var completedArgs = new UploadCompletedEventArgs(
138+
request: _fileTransporterRequest,
139+
response: response,
140+
transferredBytes: Interlocked.Read(ref _totalTransferredBytes),
141+
totalBytes: _contentLength
142+
);
143+
144+
_fileTransporterRequest.OnRaiseTransferCompletedEvent(completedArgs);
145+
}
146+
147+
private void FireTransferFailedEvent()
148+
{
149+
var failedArgs = new UploadFailedEventArgs(
150+
request: _fileTransporterRequest,
151+
transferredBytes: Interlocked.Read(ref _totalTransferredBytes),
152+
totalBytes: _contentLength
153+
);
154+
155+
_fileTransporterRequest.OnRaiseTransferFailedEvent(failedArgs);
156+
}
115157
}
116158
}

sdk/src/Services/S3/Custom/Transfer/Internal/_async/SimpleUploadCommand.async.cs

Lines changed: 12 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -38,9 +38,20 @@ await this.AsyncThrottler.WaitAsync(cancellationToken)
3838
.ConfigureAwait(continueOnCapturedContext: false);
3939
}
4040

41+
FireTransferInitiatedEvent();
42+
4143
var putRequest = ConstructRequest();
42-
await _s3Client.PutObjectAsync(putRequest, cancellationToken)
44+
var response = await _s3Client.PutObjectAsync(putRequest, cancellationToken)
4345
.ConfigureAwait(continueOnCapturedContext: false);
46+
47+
var mappedResponse = ResponseMapper.MapPutObjectResponse(response);
48+
49+
FireTransferCompletedEvent(mappedResponse);
50+
}
51+
catch (Exception)
52+
{
53+
FireTransferFailedEvent();
54+
throw;
4455
}
4556
finally
4657
{

0 commit comments

Comments
 (0)