Skip to content

Commit 44ec312

Browse files
authored
Merge e8b15c2 into d470edd
2 parents d470edd + e8b15c2 commit 44ec312

File tree

2 files changed

+54
-12
lines changed

2 files changed

+54
-12
lines changed

ydb/core/kqp/finalize_script_service/kqp_finalize_script_actor.cpp

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -179,7 +179,11 @@ class TScriptFinalizerActor : public TActorBootstrapped<TScriptFinalizerActor> {
179179

180180
void Handle(NFq::TEvents::TEvEffectApplicationResult::TPtr& ev) {
181181
if (ev->Get()->FatalError) {
182-
FinishScriptFinalization(Ydb::StatusIds::BAD_REQUEST, std::move(ev->Get()->Issues));
182+
NYql::TIssue rootIssue("Failed to commit/abort s3 multipart uploads");
183+
for (const NYql::TIssue& issue : ev->Get()->Issues) {
184+
rootIssue.AddSubIssue(MakeIntrusive<NYql::TIssue>(issue));
185+
}
186+
FinishScriptFinalization(Ydb::StatusIds::BAD_REQUEST, {rootIssue});
183187
} else {
184188
FinishScriptFinalization();
185189
}

ydb/library/yql/providers/s3/actors/yql_s3_applicator_actor.cpp

Lines changed: 49 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -273,16 +273,43 @@ class TS3ApplicatorActor : public NActors::TActorBootstrapped<TS3ApplicatorActor
273273
hFunc(TEvPrivate::TEvListParts, Handle);
274274
)
275275

276-
bool RetryOperation(CURLcode curlResponseCode, ui32 httpResponseCode, const TString& url, const TString& operationName) {
277-
auto result = RetryCount && RetryPolicy->CreateRetryState()->GetNextRetryDelay(curlResponseCode, httpResponseCode);
278-
Issues.AddIssue(TStringBuilder() << "Retry operation " << operationName << ", curl error: " << curl_easy_strerror(curlResponseCode) << ", http code: " << httpResponseCode << ", url: " << url);
276+
bool RetryOperation(IHTTPGateway::TResult&& operationResult, const TString& url, const TString& operationName) {
277+
const auto curlResponseCode = operationResult.CurlResponseCode;
278+
const auto httpResponseCode = operationResult.Content.HttpResponseCode;
279+
const auto result = RetryCount && GetRetryState(operationName)->GetNextRetryDelay(curlResponseCode, httpResponseCode);
280+
281+
NYql::TIssues issues = std::move(operationResult.Issues);
282+
TStringBuilder errorMessage = TStringBuilder() << "Retry operation " << operationName << ", curl error: " << curl_easy_strerror(curlResponseCode) << ", url: " << url;
283+
if (const TString errorText = operationResult.Content.Extract()) {
284+
TString errorCode;
285+
TString message;
286+
if (!ParseS3ErrorResponse(errorText, errorCode, message)) {
287+
message = errorText;
288+
}
289+
issues.AddIssues(BuildIssues(httpResponseCode, errorCode, message));
290+
} else {
291+
errorMessage << ", HTTP code: " << httpResponseCode;
292+
}
293+
294+
if (issues) {
295+
RetryIssues.AddIssues(NS3Util::AddParentIssue(errorMessage, std::move(issues)));
296+
} else {
297+
RetryIssues.AddIssue(errorMessage);
298+
}
299+
279300
if (result) {
280301
RetryCount--;
281302
} else {
282-
Finish(true, RetryCount
283-
? TString("Number of retries exceeded limit per operation")
284-
: TStringBuilder() << "Number of retries exceeded global limit in " << GLOBAL_RETRY_LIMIT << " retries");
303+
Issues.AddIssues(NS3Util::AddParentIssue(
304+
RetryCount
305+
? TStringBuilder() << "Number of retries exceeded limit for operation " << operationName
306+
: TStringBuilder() << "Number of retries exceeded global limit in " << GLOBAL_RETRY_LIMIT << " retries",
307+
NYql::TIssues(RetryIssues)
308+
));
309+
RetryIssues.Clear();
310+
Finish(true);
285311
}
312+
286313
return result;
287314
}
288315

@@ -377,7 +404,7 @@ class TS3ApplicatorActor : public NActors::TActorBootstrapped<TS3ApplicatorActor
377404
}
378405
const TString& url = ev->Get()->State->BuildUrl();
379406
LOG_D("CommitMultipartUpload ERROR " << url);
380-
if (RetryOperation(result.CurlResponseCode, result.Content.HttpResponseCode, url, "CommitMultipartUpload")) {
407+
if (RetryOperation(std::move(result), url, "CommitMultipartUpload")) {
381408
PushCommitMultipartUpload(ev->Get()->State);
382409
}
383410
}
@@ -422,7 +449,9 @@ class TS3ApplicatorActor : public NActors::TActorBootstrapped<TS3ApplicatorActor
422449
auto prefix = ev->Get()->State->Url + ev->Get()->State->Prefix;
423450
if (!UnknownPrefixes.contains(prefix)) {
424451
UnknownPrefixes.insert(prefix);
425-
Issues.AddIssue(TIssue("Unknown uncommitted upload with prefix: " + prefix));
452+
TIssue issue(TStringBuilder() << "Unknown uncommitted upload with prefix: " << prefix);
453+
issue.SetCode(NYql::DEFAULT_ERROR, NYql::TSeverityIds::S_INFO);
454+
Issues.AddIssue(std::move(issue));
426455
}
427456
} else {
428457
pos += KeyPrefix.size();
@@ -452,7 +481,7 @@ class TS3ApplicatorActor : public NActors::TActorBootstrapped<TS3ApplicatorActor
452481
}
453482
const TString& url = ev->Get()->State->BuildUrl();
454483
LOG_D("ListMultipartUploads ERROR " << url);
455-
if (RetryOperation(result.CurlResponseCode, result.Content.HttpResponseCode, url, "ListMultipartUploads")) {
484+
if (RetryOperation(std::move(result), url, "ListMultipartUploads")) {
456485
PushListMultipartUploads(ev->Get()->State);
457486
}
458487
}
@@ -476,7 +505,7 @@ class TS3ApplicatorActor : public NActors::TActorBootstrapped<TS3ApplicatorActor
476505
}
477506
const TString& url = ev->Get()->State->BuildUrl();
478507
LOG_D("AbortMultipartUpload ERROR " << url);
479-
if (RetryOperation(result.CurlResponseCode, result.Content.HttpResponseCode, url, "AbortMultipartUpload")) {
508+
if (RetryOperation(std::move(result), url, "AbortMultipartUpload")) {
480509
PushAbortMultipartUpload(ev->Get()->State);
481510
}
482511
}
@@ -527,7 +556,7 @@ class TS3ApplicatorActor : public NActors::TActorBootstrapped<TS3ApplicatorActor
527556
}
528557
const TString& url = ev->Get()->State->BuildUrl();
529558
LOG_D("ListParts ERROR " << url);
530-
if (RetryOperation(result.CurlResponseCode, result.Content.HttpResponseCode, url, "ListParts")) {
559+
if (RetryOperation(std::move(result), url, "ListParts")) {
531560
PushListParts(ev->Get()->State);
532561
}
533562
}
@@ -597,6 +626,13 @@ class TS3ApplicatorActor : public NActors::TActorBootstrapped<TS3ApplicatorActor
597626
actorSystem->Send(new NActors::IEventHandle(selfId, {}, new TEvPrivate::TEvListParts(state, std::move(result))));
598627
}
599628

629+
IHTTPGateway::TRetryPolicy::IRetryState::TPtr& GetRetryState(const TString& operationName) {
630+
if (const auto it = RetryStates.find(operationName); it != RetryStates.end()) {
631+
return it->second;
632+
}
633+
return RetryStates.insert({operationName, RetryPolicy->CreateRetryState()}).first->second;
634+
}
635+
600636
private:
601637
NActors::TActorId ParentId;
602638
IHTTPGateway::TPtr Gateway;
@@ -609,11 +645,13 @@ class TS3ApplicatorActor : public NActors::TActorBootstrapped<TS3ApplicatorActor
609645
NYql::NDqProto::TExternalEffect ExternalEffect;
610646
NActors::TActorSystem* const ActorSystem;
611647
const IHTTPGateway::TRetryPolicy::TPtr RetryPolicy;
648+
std::unordered_map<TString, IHTTPGateway::TRetryPolicy::IRetryState::TPtr> RetryStates;
612649
ui64 HttpRequestInflight = 0;
613650
ui64 RetryCount;
614651
THashSet<TString> UnknownPrefixes;
615652
THashSet<TString> CommitUploads;
616653
NYql::TIssues Issues;
654+
NYql::TIssues RetryIssues;
617655
std::queue<TObjectStorageRequest> RequestQueue;
618656
bool ApplicationFinished = false;
619657
};

0 commit comments

Comments
 (0)