@@ -19,6 +19,8 @@ namespace NKikimr::NKqp {
19
19
namespace {
20
20
21
21
class TScriptFinalizerActor : public TActorBootstrapped <TScriptFinalizerActor> {
22
+ static constexpr size_t MAX_ARTIFACTS_SIZE_BYTES = 40_MB;
23
+
22
24
public:
23
25
TScriptFinalizerActor (TEvScriptFinalizeRequest::TPtr request,
24
26
const NKikimrConfig::TQueryServiceConfig& queryServiceConfig,
@@ -35,6 +37,14 @@ class TScriptFinalizerActor : public TActorBootstrapped<TScriptFinalizerActor> {
35
37
36
38
void CompressScriptArtifacts () const {
37
39
auto & description = Request->Get ()->Description ;
40
+
41
+ TString astTruncateDescription;
42
+ if (size_t planSize = description.QueryPlan .value_or (" " ).size (); description.QueryAst && description.QueryAst ->size () + planSize > MAX_ARTIFACTS_SIZE_BYTES) {
43
+ astTruncateDescription = TStringBuilder () << " Query artifacts size is " << description.QueryAst ->size () + planSize << " bytes (plan + ast), that is larger than allowed limit " << MAX_ARTIFACTS_SIZE_BYTES << " bytes, ast was truncated" ;
44
+ size_t toRemove = std::min (description.QueryAst ->size () + planSize - MAX_ARTIFACTS_SIZE_BYTES, description.QueryAst ->size ());
45
+ description.QueryAst = TruncateString (*description.QueryAst , description.QueryAst ->size () - toRemove);
46
+ }
47
+
38
48
auto ast = description.QueryAst ;
39
49
if (Compressor.IsEnabled () && ast) {
40
50
const auto & [astCompressionMethod, astCompressed] = Compressor.Compress (*ast);
@@ -43,12 +53,15 @@ class TScriptFinalizerActor : public TActorBootstrapped<TScriptFinalizerActor> {
43
53
}
44
54
45
55
if (description.QueryAst && description.QueryAst ->size () > NDataShard::NLimits::MaxWriteValueSize) {
46
- NYql::TIssue astTruncatedIssue (TStringBuilder () << " Query ast size is " << description.QueryAst ->size () << " bytes, that is larger than allowed limit " << NDataShard::NLimits::MaxWriteValueSize << " bytes, ast was truncated" );
56
+ astTruncateDescription = TStringBuilder () << " Query ast size is " << description.QueryAst ->size () << " bytes, that is larger than allowed limit " << NDataShard::NLimits::MaxWriteValueSize << " bytes, ast was truncated" ;
57
+ description.QueryAst = TruncateString (*ast, NDataShard::NLimits::MaxWriteValueSize - 1_KB);
58
+ description.QueryAstCompressionMethod = std::nullopt;
59
+ }
60
+
61
+ if (astTruncateDescription) {
62
+ NYql::TIssue astTruncatedIssue (astTruncateDescription);
47
63
astTruncatedIssue.SetCode (NYql::DEFAULT_ERROR, NYql::TSeverityIds::S_INFO);
48
64
description.Issues .AddIssue (astTruncatedIssue);
49
-
50
- description.QueryAst = ast->substr (0 , NDataShard::NLimits::MaxWriteValueSize - 1_KB) + " ...\n (TRUNCATED)" ;
51
- description.QueryAstCompressionMethod = std::nullopt;
52
65
}
53
66
}
54
67
@@ -221,6 +234,11 @@ class TScriptFinalizerActor : public TActorBootstrapped<TScriptFinalizerActor> {
221
234
PassAway ();
222
235
}
223
236
237
+ private:
238
+ static TString TruncateString (const TString& str, size_t size) {
239
+ return str.substr (0 , std::min (str.size (), size)) + " ...\n (TRUNCATED)" ;
240
+ }
241
+
224
242
private:
225
243
const TActorId ReplyActor;
226
244
const TString ExecutionId;
0 commit comments