@@ -488,32 +488,38 @@ class TS3ApplicatorActor : public NActors::TActorBootstrapped<TS3ApplicatorActor
488488
489489 void Process (TEvPrivate::TEvListParts::TPtr& ev) {
490490 auto & result = ev->Get ()->Result ;
491- if (!result.Issues && result.Content .HttpResponseCode >= 200 && result.Content .HttpResponseCode < 300 ) {
492- TS3Result s3Result (result.Content .Extract ());
493- if (s3Result.IsError ) {
494- Finish (true , s3Result.S3ErrorCode + " : " + s3Result.ErrorMessage );
495- } else {
496- LOG_D (" ListParts SUCCESS " << ev->Get ()->State ->BuildUrl ());
497- const auto & root = s3Result.GetRootNode ();
498- if (root.Name () == " ListPartsResult" ) {
499- const NXml::TNamespacesForXPath nss (1U , {" s3" , " http://s3.amazonaws.com/doc/2006-03-01/" });
500- auto state = ev->Get ()->State ->CompleteState ;
501- state->Tags .reserve (state->Tags .size () + root.Node (" s3:MaxParts" , false , nss).Value <ui32>());
502- const auto & parts = root.XPath (" s3:Part" , true , nss);
503- for (const auto & part : parts) {
504- state->Tags .push_back (part.Node (" s3:ETag" , false , nss).Value <TString>());
505- }
506- if (root.Node (" s3:IsTruncated" , false , nss).Value <bool >()) {
507- ev->Get ()->State ->PartNumberMarker = root.Node (" s3:NextPartNumberMarker" , false , nss).Value <TString>();
508- PushListParts (ev->Get ()->State );
491+ if (!result.Issues ) {
492+ if (result.Content .HttpResponseCode == 404 ) {
493+ LOG_W (" ListParts NOT FOUND " << ev->Get ()->State ->BuildUrl () << " (multipart upload may be completed already)" );
494+ return ;
495+ }
496+ if (result.Content .HttpResponseCode >= 200 && result.Content .HttpResponseCode < 300 ) {
497+ TS3Result s3Result (result.Content .Extract ());
498+ if (s3Result.IsError ) {
499+ Finish (true , s3Result.S3ErrorCode + " : " + s3Result.ErrorMessage );
500+ } else {
501+ LOG_D (" ListParts SUCCESS " << ev->Get ()->State ->BuildUrl ());
502+ const auto & root = s3Result.GetRootNode ();
503+ if (root.Name () == " ListPartsResult" ) {
504+ const NXml::TNamespacesForXPath nss (1U , {" s3" , " http://s3.amazonaws.com/doc/2006-03-01/" });
505+ auto state = ev->Get ()->State ->CompleteState ;
506+ state->Tags .reserve (state->Tags .size () + root.Node (" s3:MaxParts" , false , nss).Value <ui32>());
507+ const auto & parts = root.XPath (" s3:Part" , true , nss);
508+ for (const auto & part : parts) {
509+ state->Tags .push_back (part.Node (" s3:ETag" , false , nss).Value <TString>());
510+ }
511+ if (root.Node (" s3:IsTruncated" , false , nss).Value <bool >()) {
512+ ev->Get ()->State ->PartNumberMarker = root.Node (" s3:NextPartNumberMarker" , false , nss).Value <TString>();
513+ PushListParts (ev->Get ()->State );
514+ } else {
515+ PushCommitMultipartUpload (state);
516+ }
509517 } else {
510- PushCommitMultipartUpload (state );
518+ Finish ( true , " ListParts reply: " + root. Name () );
511519 }
512- } else {
513- Finish (true , " ListParts reply: " + root.Name ());
514520 }
521+ return ;
515522 }
516- return ;
517523 }
518524 const TString& url = ev->Get ()->State ->BuildUrl ();
519525 LOG_D (" ListParts ERROR " << url);
0 commit comments