Skip to content

Commit 18215fc

Browse files
authored
Merge b44dd91 into b0abac7
2 parents b0abac7 + b44dd91 commit 18215fc

File tree

1 file changed

+22
-0
lines changed

1 file changed

+22
-0
lines changed

ydb/core/kqp/proxy_service/kqp_script_executions.cpp

+22
Original file line numberDiff line numberDiff line change
@@ -1056,6 +1056,8 @@ class TForgetScriptExecutionOperationActor : public TActorBootstrapped<TForgetSc
10561056
};
10571057

10581058
class TGetScriptExecutionOperationQueryActor : public TQueryBase {
1059+
static constexpr i32 MAX_RESPONSE_SIZE_BYTES = 50_MB;
1060+
10591061
public:
10601062
TGetScriptExecutionOperationQueryActor(const TString& database, const TString& executionId)
10611063
: TQueryBase(__func__, executionId)
@@ -1182,6 +1184,7 @@ class TGetScriptExecutionOperationQueryActor : public TQueryBase {
11821184

11831185
const TMaybe<TString> issuesSerialized = result.ColumnParser("issues").GetOptionalJsonDocument();
11841186
if (issuesSerialized) {
1187+
ResponseSizeBytes += issuesSerialized->Size();
11851188
Issues = DeserializeIssues(*issuesSerialized);
11861189
}
11871190

@@ -1231,13 +1234,31 @@ class TGetScriptExecutionOperationQueryActor : public TQueryBase {
12311234
}
12321235

12331236
void OnFinish(Ydb::StatusIds::StatusCode status, NYql::TIssues&& issues) override {
1237+
ResponseSizeBytes += Metadata.ByteSizeLong();
1238+
CheckResponseSize();
1239+
12341240
if (OperationStatus) {
12351241
Send(Owner, new TEvGetScriptExecutionOperationQueryResponse(true, LeaseExpired, FinalizationStatus, RunScriptActorId, ExecutionId, *OperationStatus, std::move(Issues), std::move(Metadata)));
12361242
} else {
12371243
Send(Owner, new TEvGetScriptExecutionOperationQueryResponse(false, LeaseExpired, FinalizationStatus, RunScriptActorId, ExecutionId, status, std::move(issues), std::move(Metadata)));
12381244
}
12391245
}
12401246

1247+
private:
1248+
void CheckResponseSize() {
1249+
if (ResponseSizeBytes <= MAX_RESPONSE_SIZE_BYTES) {
1250+
return;
1251+
}
1252+
1253+
NYql::TIssue astTruncatedIssue(TStringBuilder() << "Query ast was truncated, because get operation response size is too large");
1254+
astTruncatedIssue.SetCode(NYql::DEFAULT_ERROR, NYql::TSeverityIds::S_INFO);
1255+
Issues.AddIssue(astTruncatedIssue);
1256+
1257+
auto* ast = Metadata.mutable_exec_stats()->mutable_query_ast();
1258+
ui64 toRemove = std::min(ResponseSizeBytes - MAX_RESPONSE_SIZE_BYTES, ast->size());
1259+
*ast = ast->substr(0, ast->size() - toRemove) + "...\n(TRUNCATED)";
1260+
}
1261+
12411262
private:
12421263
TString Database;
12431264
TString ExecutionId;
@@ -1248,6 +1269,7 @@ class TGetScriptExecutionOperationQueryActor : public TQueryBase {
12481269
TActorId RunScriptActorId;
12491270
NYql::TIssues Issues;
12501271
Ydb::Query::ExecuteScriptMetadata Metadata;
1272+
ui64 ResponseSizeBytes = 0;
12511273
};
12521274

12531275
class TGetScriptExecutionOperationActor : public TCheckLeaseStatusActorBase {

0 commit comments

Comments
 (0)