@@ -1056,6 +1056,8 @@ class TForgetScriptExecutionOperationActor : public TActorBootstrapped<TForgetSc
1056
1056
};
1057
1057
1058
1058
class TGetScriptExecutionOperationQueryActor : public TQueryBase {
1059
+ static constexpr i32 MAX_RESPONSE_SIZE_BYTES = 50_MB;
1060
+
1059
1061
public:
1060
1062
TGetScriptExecutionOperationQueryActor (const TString& database, const TString& executionId)
1061
1063
: TQueryBase(__func__, executionId)
@@ -1182,6 +1184,7 @@ class TGetScriptExecutionOperationQueryActor : public TQueryBase {
1182
1184
1183
1185
const TMaybe<TString> issuesSerialized = result.ColumnParser (" issues" ).GetOptionalJsonDocument ();
1184
1186
if (issuesSerialized) {
1187
+ ResponseSizeBytes += issuesSerialized->Size ();
1185
1188
Issues = DeserializeIssues (*issuesSerialized);
1186
1189
}
1187
1190
@@ -1231,13 +1234,31 @@ class TGetScriptExecutionOperationQueryActor : public TQueryBase {
1231
1234
}
1232
1235
1233
1236
void OnFinish (Ydb::StatusIds::StatusCode status, NYql::TIssues&& issues) override {
1237
+ ResponseSizeBytes += Metadata.ByteSizeLong ();
1238
+ CheckResponseSize ();
1239
+
1234
1240
if (OperationStatus) {
1235
1241
Send (Owner, new TEvGetScriptExecutionOperationQueryResponse (true , LeaseExpired, FinalizationStatus, RunScriptActorId, ExecutionId, *OperationStatus, std::move (Issues), std::move (Metadata)));
1236
1242
} else {
1237
1243
Send (Owner, new TEvGetScriptExecutionOperationQueryResponse (false , LeaseExpired, FinalizationStatus, RunScriptActorId, ExecutionId, status, std::move (issues), std::move (Metadata)));
1238
1244
}
1239
1245
}
1240
1246
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
+
1241
1262
private:
1242
1263
TString Database;
1243
1264
TString ExecutionId;
@@ -1248,6 +1269,7 @@ class TGetScriptExecutionOperationQueryActor : public TQueryBase {
1248
1269
TActorId RunScriptActorId;
1249
1270
NYql::TIssues Issues;
1250
1271
Ydb::Query::ExecuteScriptMetadata Metadata;
1272
+ ui64 ResponseSizeBytes = 0 ;
1251
1273
};
1252
1274
1253
1275
class TGetScriptExecutionOperationActor : public TCheckLeaseStatusActorBase {
0 commit comments