Skip to content

Commit ccaee58

Browse files
committed
Fail early if tmp dir exists (#25707)
1 parent 1869602 commit ccaee58

File tree

6 files changed

+19
-11
lines changed

6 files changed

+19
-11
lines changed

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,7 @@ struct TKqpTempTablesState {
2020
TString SessionId;
2121
TString Database;
2222
THashMap<TString, TTempTableInfo> TempTables;
23-
bool HasCreateTableAs = false;
23+
bool NeedCleaning = false;
2424

2525
using TConstPtr = std::shared_ptr<const TKqpTempTablesState>;
2626

ydb/core/kqp/executer_actor/kqp_executer.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -160,7 +160,7 @@ IActor* CreateKqpSchemeExecuter(
160160
TKqpPhyTxHolder::TConstPtr phyTx, NKikimrKqp::EQueryType queryType, const TActorId& target,
161161
const TMaybe<TString>& requestType, const TString& database,
162162
TIntrusiveConstPtr<NACLib::TUserToken> userToken, const TString& clientAddress,
163-
bool temporary, bool isCreateTableAs, TString SessionId, TIntrusivePtr<TUserRequestContext> ctx,
163+
bool temporary, bool createTmpDir, bool isCreateTableAs, TString SessionId, TIntrusivePtr<TUserRequestContext> ctx,
164164
const TActorId& kqpTempTablesAgentActor = TActorId());
165165

166166
std::unique_ptr<TEvKqpExecuter::TEvTxResponse> ExecuteLiteral(

ydb/core/kqp/executer_actor/kqp_scheme_executer.cpp

Lines changed: 8 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -76,7 +76,7 @@ class TKqpSchemeExecuter : public TActorBootstrapped<TKqpSchemeExecuter> {
7676
TKqpSchemeExecuter(
7777
TKqpPhyTxHolder::TConstPtr phyTx, NKikimrKqp::EQueryType queryType, const TActorId& target, const TMaybe<TString>& requestType,
7878
const TString& database, TIntrusiveConstPtr<NACLib::TUserToken> userToken, const TString& clientAddress,
79-
bool temporary, bool isCreateTableAs, TString sessionId, TIntrusivePtr<TUserRequestContext> ctx,
79+
bool temporary, bool createTmpDir, bool isCreateTableAs, TString sessionId, TIntrusivePtr<TUserRequestContext> ctx,
8080
const TActorId& kqpTempTablesAgentActor)
8181
: PhyTx(phyTx)
8282
, QueryType(queryType)
@@ -85,6 +85,7 @@ class TKqpSchemeExecuter : public TActorBootstrapped<TKqpSchemeExecuter> {
8585
, UserToken(userToken)
8686
, ClientAddress(clientAddress)
8787
, Temporary(temporary)
88+
, CreateTmpDir(createTmpDir)
8889
, IsCreateTableAs(isCreateTableAs)
8990
, SessionId(sessionId)
9091
, RequestContext(std::move(ctx))
@@ -153,6 +154,7 @@ class TKqpSchemeExecuter : public TActorBootstrapped<TKqpSchemeExecuter> {
153154
modifyScheme->SetWorkingDir(GetSessionDirsBasePath(Database));
154155
modifyScheme->SetOperationType(NKikimrSchemeOp::EOperationType::ESchemeOpMkDir);
155156
modifyScheme->SetAllowCreateInTempDir(false);
157+
modifyScheme->SetFailOnExist(true);
156158

157159
auto* makeDir = modifyScheme->MutableMkDir();
158160
makeDir->SetName(SessionId);
@@ -741,7 +743,8 @@ class TKqpSchemeExecuter : public TActorBootstrapped<TKqpSchemeExecuter> {
741743
} else if (IsCreateTableAs && schemeOp.GetOperationCase() == NKqpProto::TKqpSchemeOperation::kAlterTable) {
742744
FindWorkingDirForCTAS();
743745
} else {
744-
if (Temporary) {
746+
if (CreateTmpDir) {
747+
AFL_ENSURE(Temporary);
745748
CreateTmpDirectory();
746749
} else {
747750
MakeSchemeOperationRequest();
@@ -1097,6 +1100,7 @@ class TKqpSchemeExecuter : public TActorBootstrapped<TKqpSchemeExecuter> {
10971100
const TString ClientAddress;
10981101
std::unique_ptr<TEvKqpExecuter::TEvTxResponse> ResponseEv;
10991102
bool Temporary;
1103+
bool CreateTmpDir;
11001104
bool IsCreateTableAs;
11011105
TString SessionId;
11021106
ui64 TxId = 0;
@@ -1113,12 +1117,12 @@ IActor* CreateKqpSchemeExecuter(
11131117
TKqpPhyTxHolder::TConstPtr phyTx, NKikimrKqp::EQueryType queryType, const TActorId& target,
11141118
const TMaybe<TString>& requestType, const TString& database,
11151119
TIntrusiveConstPtr<NACLib::TUserToken> userToken, const TString& clientAddress,
1116-
bool temporary, bool isCreateTableAs,
1120+
bool temporary, bool createTmpDir, bool isCreateTableAs,
11171121
TString sessionId, TIntrusivePtr<TUserRequestContext> ctx, const TActorId& kqpTempTablesAgentActor)
11181122
{
11191123
return new TKqpSchemeExecuter(
11201124
phyTx, queryType, target, requestType, database, userToken, clientAddress,
1121-
temporary, isCreateTableAs, sessionId, std::move(ctx), kqpTempTablesAgentActor);
1125+
temporary, createTmpDir, isCreateTableAs, sessionId, std::move(ctx), kqpTempTablesAgentActor);
11221126
}
11231127

11241128
} // namespace NKikimr::NKqp

ydb/core/kqp/gateway/kqp_ic_gateway.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -615,7 +615,7 @@ class TKqpSchemeExecuterRequestHandler: public TActorBootstrapped<TKqpSchemeExec
615615
void Bootstrap() {
616616
auto ctx = MakeIntrusive<TUserRequestContext>();
617617
ctx->DatabaseId = DatabaseId;
618-
IActor* actor = CreateKqpSchemeExecuter(PhyTx, QueryType, SelfId(), RequestType, Database, UserToken, ClientAddress, false /* temporary */, false /* isCreateTableAs */, TString() /* sessionId */, ctx);
618+
IActor* actor = CreateKqpSchemeExecuter(PhyTx, QueryType, SelfId(), RequestType, Database, UserToken, ClientAddress, false /* temporary */, false /* createTmpDir */, false /* isCreateTableAs */, TString() /* sessionId */, ctx);
619619
Register(actor);
620620
Become(&TThis::WaitState);
621621
}

ydb/core/kqp/session_actor/kqp_session_actor.cpp

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1631,8 +1631,10 @@ class TKqpSessionActor : public TActorBootstrapped<TKqpSessionActor> {
16311631
const TString requestType = QueryState->GetRequestType();
16321632
const bool temporary = GetTemporaryTableInfo(tx).has_value();
16331633

1634-
auto executerActor = CreateKqpSchemeExecuter(tx, QueryState->GetType(), SelfId(), requestType, Settings.Database, userToken, clientAddress,
1635-
temporary, QueryState->IsCreateTableAs(), TempTablesState.SessionId, QueryState->UserRequestContext, KqpTempTablesAgentActor);
1634+
auto executerActor = CreateKqpSchemeExecuter(
1635+
tx, QueryState->GetType(), SelfId(), requestType, Settings.Database, userToken, clientAddress,
1636+
temporary, /* createTmpDir */ temporary && !TempTablesState.NeedCleaning,
1637+
QueryState->IsCreateTableAs(), TempTablesState.SessionId, QueryState->UserRequestContext, KqpTempTablesAgentActor);
16361638

16371639
ExecuterId = RegisterWithSameMailbox(executerActor);
16381640

@@ -1908,7 +1910,7 @@ class TKqpSessionActor : public TActorBootstrapped<TKqpSessionActor> {
19081910
return;
19091911
}
19101912
if (QueryState->IsCreateTableAs()) {
1911-
TempTablesState.HasCreateTableAs = true;
1913+
TempTablesState.NeedCleaning = true;
19121914
QueryState->UpdateTempTablesState(TempTablesState);
19131915
return;
19141916
}
@@ -1917,6 +1919,7 @@ class TKqpSessionActor : public TActorBootstrapped<TKqpSessionActor> {
19171919
if (optInfo) {
19181920
auto [isCreate, info] = *optInfo;
19191921
if (isCreate) {
1922+
TempTablesState.NeedCleaning = true;
19201923
TempTablesState.TempTables[info.first] = info.second;
19211924
} else {
19221925
TempTablesState.TempTables.erase(info.first);

ydb/core/kqp/session_actor/kqp_temp_tables_manager.cpp

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -59,7 +59,8 @@ class TKqpTempTablesManager : public TActorBootstrapped<TKqpTempTablesManager> {
5959
{}
6060

6161
void Bootstrap() {
62-
if (TempTablesState.TempTables.empty() && !TempTablesState.HasCreateTableAs) {
62+
if (!TempTablesState.NeedCleaning) {
63+
AFL_ENSURE(TempTablesState.TempTables.empty());
6364
Finish();
6465
return;
6566
}

0 commit comments

Comments
 (0)