@@ -33,21 +33,33 @@ internal partial class MultipartUploadCommand : BaseCommand
3333
3434 public override async Task ExecuteAsync ( CancellationToken cancellationToken )
3535 {
36+ // Fire transfer initiated event FIRST, before choosing path
37+ FireTransferInitiatedEvent ( ) ;
38+
3639 if ( ( this . _fileTransporterRequest . InputStream != null && ! this . _fileTransporterRequest . InputStream . CanSeek ) || this . _fileTransporterRequest . ContentLength == - 1 )
3740 {
3841 await UploadUnseekableStreamAsync ( this . _fileTransporterRequest , cancellationToken ) . ConfigureAwait ( false ) ;
3942 }
4043 else
4144 {
42- var initRequest = ConstructInitiateMultipartUploadRequest ( ) ;
43- var initResponse = await _s3Client . InitiateMultipartUploadAsync ( initRequest , cancellationToken )
45+ InitiateMultipartUploadResponse initResponse = null ;
46+ try
47+ {
48+ var initRequest = ConstructInitiateMultipartUploadRequest ( ) ;
49+ initResponse = await _s3Client . InitiateMultipartUploadAsync ( initRequest , cancellationToken )
4450 . ConfigureAwait ( continueOnCapturedContext : false ) ;
45- Logger . DebugFormat ( "Initiated upload: {0}" , initResponse . UploadId ) ;
51+ Logger . DebugFormat ( "Initiated upload: {0}" , initResponse . UploadId ) ;
52+ }
53+ catch ( Exception )
54+ {
55+ FireTransferFailedEvent ( ) ;
56+ throw ;
57+ }
4658
4759 var pendingUploadPartTasks = new List < Task < UploadPartResponse > > ( ) ;
48-
4960 SemaphoreSlim localThrottler = null ;
5061 CancellationTokenSource internalCts = null ;
62+
5163 try
5264 {
5365 Logger . DebugFormat ( "Queue up the UploadPartRequests to be executed" ) ;
@@ -101,14 +113,19 @@ await localThrottler.WaitAsync(cancellationToken)
101113
102114 Logger . DebugFormat ( "Beginning completing multipart. ({0})" , initResponse . UploadId ) ;
103115 var compRequest = ConstructCompleteMultipartUploadRequest ( initResponse ) ;
104- await this . _s3Client . CompleteMultipartUploadAsync ( compRequest , cancellationToken )
116+ var completeResponse = await this . _s3Client . CompleteMultipartUploadAsync ( compRequest , cancellationToken )
105117 . ConfigureAwait ( continueOnCapturedContext : false ) ;
106118 Logger . DebugFormat ( "Done completing multipart. ({0})" , initResponse . UploadId ) ;
107119
120+ var mappedResponse = ResponseMapper . MapCompleteMultipartUploadResponse ( completeResponse ) ;
121+ FireTransferCompletedEvent ( mappedResponse ) ;
108122 }
109123 catch ( Exception e )
110124 {
111- Logger . Error ( e , "Exception while uploading. ({0})" , initResponse . UploadId ) ;
125+ Logger . Error ( e , "Exception while uploading. ({0})" , initResponse ? . UploadId ?? "unknown" ) ;
126+
127+ FireTransferFailedEvent ( ) ;
128+
112129 // Can't do async invocation in the catch block, doing cleanup synchronously.
113130 Cleanup ( initResponse . UploadId , pendingUploadPartTasks ) ;
114131 throw ;
@@ -201,8 +218,19 @@ private void AbortMultipartUpload(string uploadId)
201218 }
202219 } ;
203220
204- var initiateRequest = ConstructInitiateMultipartUploadRequest ( requestEventHandler ) ;
205- var initiateResponse = await _s3Client . InitiateMultipartUploadAsync ( initiateRequest , cancellationToken ) . ConfigureAwait ( false ) ;
221+ InitiateMultipartUploadResponse initiateResponse = null ;
222+
223+ try
224+ {
225+ var initiateRequest = ConstructInitiateMultipartUploadRequest ( requestEventHandler ) ;
226+ initiateResponse = await _s3Client . InitiateMultipartUploadAsync ( initiateRequest , cancellationToken ) . ConfigureAwait ( false ) ;
227+ }
228+ catch ( Exception ex )
229+ {
230+ FireTransferFailedEvent ( ) ;
231+ Logger . Error ( ex , "Failed to initiate multipart upload for unseekable stream" ) ;
232+ throw ;
233+ }
206234
207235 try
208236 {
@@ -270,12 +298,17 @@ private void AbortMultipartUpload(string uploadId)
270298
271299 this . _uploadResponses = uploadPartResponses ;
272300 CompleteMultipartUploadRequest compRequest = ConstructCompleteMultipartUploadRequest ( initiateResponse , true , requestEventHandler ) ;
273- await _s3Client . CompleteMultipartUploadAsync ( compRequest , cancellationToken ) . ConfigureAwait ( false ) ;
301+ var completeResponse = await _s3Client . CompleteMultipartUploadAsync ( compRequest , cancellationToken ) . ConfigureAwait ( false ) ;
274302 Logger . DebugFormat ( "Completed multi part upload. (Part count: {0}, Upload Id: {1})" , uploadPartResponses . Count , initiateResponse . UploadId ) ;
303+
304+ var mappedResponse = ResponseMapper . MapCompleteMultipartUploadResponse ( completeResponse ) ;
305+ FireTransferCompletedEvent ( mappedResponse ) ;
275306 }
276307 }
277308 catch ( Exception ex )
278309 {
310+ FireTransferFailedEvent ( ) ;
311+
279312 await _s3Client . AbortMultipartUploadAsync ( new AbortMultipartUploadRequest ( )
280313 {
281314 BucketName = request . BucketName ,
0 commit comments