@@ -155,9 +155,16 @@ class TS3FileWriteActor : public TActorBootstrapped<TS3FileWriteActor> {
155
155
void Bootstrap (const TActorId& parentId) {
156
156
ParentId = parentId;
157
157
LOG_D (" TS3FileWriteActor" , " Bootstrap by " << ParentId << " for Key: [" << Key << " ], Url: [" << Url << " ], request id: [" << RequestId << " ]" );
158
- auto authInfo = Credentials.GetAuthInfo ();
158
+ try {
159
+ BeginPartsUpload (Credentials.GetAuthInfo ());
160
+ } catch (...) {
161
+ FailOnException ();
162
+ }
163
+ }
164
+
165
+ void BeginPartsUpload (const TS3Credentials::TAuthInfo& authInfo) {
159
166
if (DirtyWrite && Parts->IsSealed () && Parts->Size () <= 1 ) {
160
- Become (&TS3FileWriteActor::SinglepartWorkingStateFunc);
167
+ Become (&TS3FileWriteActor::StateFuncWrapper<&TS3FileWriteActor:: SinglepartWorkingStateFunc> );
161
168
const size_t size = Max<size_t >(Parts->Volume (), 1 );
162
169
InFlight += size;
163
170
SentSize += size;
@@ -168,7 +175,7 @@ class TS3FileWriteActor : public TActorBootstrapped<TS3FileWriteActor> {
168
175
true ,
169
176
RetryPolicy);
170
177
} else {
171
- Become (&TS3FileWriteActor::MultipartInitialStateFunc);
178
+ Become (&TS3FileWriteActor::StateFuncWrapper<&TS3FileWriteActor:: MultipartInitialStateFunc> );
172
179
Gateway->Upload (Url + " ?uploads" ,
173
180
IHTTPGateway::MakeYcHeaders (RequestId, authInfo.GetToken (), {}, authInfo.GetAwsUserPwd (), authInfo.GetAwsSigV4 ()),
174
181
0 ,
@@ -186,7 +193,7 @@ class TS3FileWriteActor : public TActorBootstrapped<TS3FileWriteActor> {
186
193
187
194
void PassAway () override {
188
195
if (InFlight || !Parts->Empty ()) {
189
- AbortMultipartUpload ();
196
+ SafeAbortMultipartUpload ();
190
197
LOG_W (" TS3FileWriteActor" , " PassAway: but NOT finished, InFlight: " << InFlight << " , Parts: " << Parts->Size () << " , Sealed: " << Parts->IsSealed () << " , request id: [" << RequestId << " ]" );
191
198
} else {
192
199
LOG_D (" TS3FileWriteActor" , " PassAway: request id: [" << RequestId << " ]" );
@@ -236,6 +243,15 @@ class TS3FileWriteActor : public TActorBootstrapped<TS3FileWriteActor> {
236
243
return InFlight + Parts->Volume ();
237
244
}
238
245
private:
246
+ template <void (TS3FileWriteActor::* DelegatedStateFunc)(STFUNC_SIG)>
247
+ STFUNC (StateFuncWrapper) {
248
+ try {
249
+ (this ->*DelegatedStateFunc)(ev);
250
+ } catch (...) {
251
+ FailOnException ();
252
+ }
253
+ }
254
+
239
255
STRICT_STFUNC (MultipartInitialStateFunc,
240
256
hFunc (TEvPrivate::TEvUploadStarted, Handle );
241
257
)
@@ -347,7 +363,7 @@ class TS3FileWriteActor : public TActorBootstrapped<TS3FileWriteActor> {
347
363
348
364
void Handle (TEvPrivate::TEvUploadStarted::TPtr& result) {
349
365
UploadId = result->Get ()->UploadId ;
350
- Become (&TS3FileWriteActor::MultipartWorkingStateFunc);
366
+ Become (&TS3FileWriteActor::StateFuncWrapper<&TS3FileWriteActor:: MultipartWorkingStateFunc> );
351
367
StartUploadParts ();
352
368
}
353
369
@@ -404,22 +420,34 @@ class TS3FileWriteActor : public TActorBootstrapped<TS3FileWriteActor> {
404
420
RetryPolicy);
405
421
}
406
422
407
- void AbortMultipartUpload () {
423
+ void SafeAbortMultipartUpload () {
424
+ try {
425
+ AbortMultipartUpload (Credentials.GetAuthInfo ());
426
+ } catch (...) {
427
+ LOG_W (" TS3FileWriteActor" , " Failed to abort multipart upload, error: " << CurrentExceptionMessage ());
428
+ }
429
+ }
430
+
431
+ void AbortMultipartUpload (const TS3Credentials::TAuthInfo& authInfo) {
408
432
// Try to abort multipart upload in case of unexpected termination.
409
433
// In case of error just logs warning.
410
434
411
435
if (!UploadId) {
412
436
return ;
413
437
}
414
438
415
- auto authInfo = Credentials.GetAuthInfo ();
416
439
Gateway->Delete (Url + " ?uploadId=" + UploadId,
417
440
IHTTPGateway::MakeYcHeaders (RequestId, authInfo.GetToken (), " application/xml" , authInfo.GetAwsUserPwd (), authInfo.GetAwsSigV4 ()),
418
441
std::bind (&TS3FileWriteActor::OnMultipartUploadAbort, ActorSystem, SelfId (), TxId, RequestId, std::placeholders::_1),
419
442
RetryPolicy);
420
443
UploadId.clear ();
421
444
}
422
445
446
+ void FailOnException () {
447
+ Send (ParentId, new TEvPrivate::TEvUploadError (NYql::NDqProto::StatusIds::BAD_REQUEST, CurrentExceptionMessage ()));
448
+ SafeAbortMultipartUpload ();
449
+ }
450
+
423
451
size_t InFlight = 0ULL ;
424
452
size_t SentSize = 0ULL ;
425
453
0 commit comments