Skip to content

Commit 30edde3

Browse files
authored
delete query from compile cache if it is existed during insert (#8506)
1 parent 6fca8c1 commit 30edde3

File tree

4 files changed

+51
-4
lines changed

4 files changed

+51
-4
lines changed

ydb/core/kqp/common/simple/query_id.cpp

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44
#include <google/protobuf/util/message_differencer.h>
55

66
#include <util/generic/yexception.h>
7+
#include <util/string/escape.h>
78

89
#include <memory>
910

@@ -74,4 +75,25 @@ bool TKqpQueryId::operator==(const TKqpQueryId& other) const {
7475
return true;
7576
}
7677

78+
TString TKqpQueryId::SerializeToString() const {
79+
TStringBuilder result = TStringBuilder() << "{"
80+
<< "Cluster: " << Cluster << ", "
81+
<< "Database: " << Database << ", "
82+
<< "UserSid: " << UserSid << ", "
83+
<< "Text: " << EscapeC(Text) << ", "
84+
<< "Settings: " << Settings.SerializeToString() << ", ";
85+
if (QueryParameterTypes) {
86+
result << "QueryParameterTypes: [";
87+
for (const auto& param : *QueryParameterTypes) {
88+
result << "name: " << param.first << ", type: " << param.second.ShortDebugString();
89+
}
90+
result << "], ";
91+
} else {
92+
result << "QueryParameterTypes: <empty>, ";
93+
}
94+
95+
result << "GUCSettings: " << GUCSettings.SerializeToString() << "}";
96+
return result;
97+
}
98+
7799
} // namespace NKikimr::NKqp

ydb/core/kqp/common/simple/query_id.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -44,6 +44,8 @@ struct TKqpQueryId {
4444
GUCSettings.GetHash());
4545
return THash<decltype(tuple)>()(tuple);
4646
}
47+
48+
TString SerializeToString() const;
4749
};
4850
} // namespace NKikimr::NKqp
4951

ydb/core/kqp/common/simple/settings.h

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,9 @@
33
#include <ydb/core/protos/kqp.pb.h>
44
#include <ydb/public/api/protos/ydb_query.pb.h>
55

6+
#include <util/generic/string.h>
67
#include <util/str_stl.h>
8+
#include <util/string/builder.h>
79

810
#include <tuple>
911

@@ -39,6 +41,14 @@ struct TKqpQuerySettings {
3941
auto tuple = std::make_tuple(DocumentApiRestricted, IsInternalCall, QueryType, Syntax);
4042
return THash<decltype(tuple)>()(tuple);
4143
}
44+
45+
TString SerializeToString() const {
46+
TStringBuilder result = TStringBuilder() << "{"
47+
<< "DocumentApiRestricted: " << DocumentApiRestricted << ", "
48+
<< "IsInternalCall: " << IsInternalCall << ", "
49+
<< "QueryType: " << QueryType << "}";
50+
return result;
51+
}
4252
};
4353

4454
} // namespace NKikimr::NKqp

ydb/core/kqp/compile_service/kqp_compile_service.cpp

Lines changed: 17 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -41,6 +41,9 @@ class TKqpQueryCache {
4141
YQL_ENSURE(compileResult->PreparedQuery);
4242

4343
auto queryIt = QueryIndex.emplace(query, compileResult->Uid);
44+
if (!queryIt.second) {
45+
EraseByUid(compileResult->Uid);
46+
}
4447
Y_ENSURE(queryIt.second);
4548
}
4649

@@ -676,6 +679,7 @@ class TKqpCompileService : public TActorBootstrapped<TKqpCompileService> {
676679
Y_ENSURE(query.UserSid == userSid);
677680
}
678681

682+
LOG_DEBUG_S(ctx, NKikimrServices::KQP_COMPILE_SERVICE, "Try to find query by queryId, queryId: " << query.SerializeToString());
679683
auto compileResult = QueryCache.FindByQuery(query, request.KeepInCache);
680684
if (HasTempTablesNameClashes(compileResult, request.TempTablesState)) {
681685
compileResult = nullptr;
@@ -857,7 +861,7 @@ class TKqpCompileService : public TActorBootstrapped<TKqpCompileService> {
857861
try {
858862
if (compileResult->Status == Ydb::StatusIds::SUCCESS) {
859863
if (!hasTempTablesNameClashes) {
860-
UpdateQueryCache(compileResult, keepInCache, compileRequest.CompileSettings.IsQueryActionPrepare, isPerStatementExecution);
864+
UpdateQueryCache(ctx, compileResult, keepInCache, compileRequest.CompileSettings.IsQueryActionPrepare, isPerStatementExecution);
861865
}
862866

863867
if (ev->Get()->ReplayMessage && !QueryReplayBackend->IsNull()) {
@@ -939,15 +943,21 @@ class TKqpCompileService : public TActorBootstrapped<TKqpCompileService> {
939943
return compileResult->PreparedQuery->HasTempTables(tempTablesState, withSessionId);
940944
}
941945

942-
void UpdateQueryCache(TKqpCompileResult::TConstPtr compileResult, bool keepInCache, bool isQueryActionPrepare, bool isPerStatementExecution) {
946+
void UpdateQueryCache(const TActorContext& ctx, TKqpCompileResult::TConstPtr compileResult, bool keepInCache, bool isQueryActionPrepare, bool isPerStatementExecution) {
943947
if (QueryCache.FindByUid(compileResult->Uid, false)) {
944948
QueryCache.Replace(compileResult);
945949
} else if (keepInCache) {
950+
if (compileResult->Query) {
951+
LOG_DEBUG_S(ctx, NKikimrServices::KQP_COMPILE_SERVICE, "Insert query into compile cache, queryId: " << compileResult->Query->SerializeToString());
952+
if (QueryCache.FindByQuery(*compileResult->Query, keepInCache)) {
953+
LOG_ERROR_S(ctx, NKikimrServices::KQP_COMPILE_SERVICE, "Trying to insert query into compile cache when it is already there");
954+
}
955+
}
946956
if (QueryCache.Insert(compileResult, TableServiceConfig.GetEnableAstCache(), isPerStatementExecution)) {
947957
Counters->CompileQueryCacheEvicted->Inc();
948958
}
949959
if (compileResult->Query && isQueryActionPrepare) {
950-
if (InsertPreparingQuery(compileResult, true, isPerStatementExecution)) {
960+
if (InsertPreparingQuery(ctx, compileResult, true, isPerStatementExecution)) {
951961
Counters->CompileQueryCacheEvicted->Inc();
952962
};
953963
}
@@ -958,6 +968,8 @@ class TKqpCompileService : public TActorBootstrapped<TKqpCompileService> {
958968
YQL_ENSURE(queryAst.Ast);
959969
YQL_ENSURE(queryAst.Ast->IsOk());
960970
YQL_ENSURE(queryAst.Ast->Root);
971+
LOG_DEBUG_S(ctx, NKikimrServices::KQP_COMPILE_SERVICE, "Try to find query by ast, queryId: " << compileRequest.Query.SerializeToString()
972+
<< ", ast: " << queryAst.Ast->Root->ToString());
961973
auto compileResult = QueryCache.FindByAst(compileRequest.Query, *queryAst.Ast, compileRequest.CompileSettings.KeepInCache);
962974

963975
if (HasTempTablesNameClashes(compileResult, compileRequest.TempTablesState)) {
@@ -1026,7 +1038,7 @@ class TKqpCompileService : public TActorBootstrapped<TKqpCompileService> {
10261038
}
10271039

10281040
private:
1029-
bool InsertPreparingQuery(const TKqpCompileResult::TConstPtr& compileResult, bool keepInCache, bool isPerStatementExecution) {
1041+
bool InsertPreparingQuery(const TActorContext& ctx, const TKqpCompileResult::TConstPtr& compileResult, bool keepInCache, bool isPerStatementExecution) {
10301042
YQL_ENSURE(compileResult->Query);
10311043
auto query = *compileResult->Query;
10321044

@@ -1051,6 +1063,7 @@ class TKqpCompileService : public TActorBootstrapped<TKqpCompileService> {
10511063
auto newCompileResult = TKqpCompileResult::Make(CreateGuidAsString(), compileResult->Status, compileResult->Issues, compileResult->MaxReadType, std::move(query), compileResult->Ast);
10521064
newCompileResult->AllowCache = compileResult->AllowCache;
10531065
newCompileResult->PreparedQuery = compileResult->PreparedQuery;
1066+
LOG_DEBUG_S(ctx, NKikimrServices::KQP_COMPILE_SERVICE, "Insert preparing query with params, queryId: " << query.SerializeToString());
10541067
return QueryCache.Insert(newCompileResult, TableServiceConfig.GetEnableAstCache(), isPerStatementExecution);
10551068
}
10561069

0 commit comments

Comments
 (0)