Skip to content

Commit 799bca8

Browse files
authored
User for .tmp/sessions dir (#12244)
1 parent 335d81a commit 799bca8

File tree

7 files changed

+108
-6
lines changed

7 files changed

+108
-6
lines changed

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

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,14 @@ namespace {
2828
const TString SessionsDirectoryName = "sessions";
2929
}
3030

31+
TString GetTmpDirPath(const TString& database) {
32+
return CanonizePath(JoinPath({database, TmpDirectoryName}));
33+
}
34+
35+
TString GetSessionDirName() {
36+
return SessionsDirectoryName;
37+
}
38+
3139
TString GetSessionDirsBasePath(const TString& database) {
3240
return CanonizePath(JoinPath({database, TmpDirectoryName, SessionsDirectoryName}));
3341
}

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

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,8 @@ struct TKqpTempTablesState {
2727
FindInfo(const std::string_view& path, bool withSessionId = false) const;
2828
};
2929

30+
TString GetTmpDirPath(const TString& database);
31+
TString GetSessionDirName();
3032
TString GetSessionDirsBasePath(const TString& database);
3133
TString GetSessionDirPath(const TString& database, const TString& sessionId);
3234
TString GetTempTablePath(const TString& database, const TString& sessionId, const TString tablePath);

ydb/core/kqp/executer_actor/kqp_scheme_executer.cpp

Lines changed: 70 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@
1010
#include <ydb/core/protos/schemeshard/operations.pb.h>
1111
#include <ydb/core/tx/schemeshard/schemeshard_build_index.h>
1212
#include <ydb/core/tx/tx_proxy/proxy.h>
13+
#include <ydb/library/aclib/aclib.h>
1314
#include <ydb/services/metadata/abstract/kqp_common.h>
1415

1516

@@ -45,6 +46,7 @@ class TKqpSchemeExecuter : public TActorBootstrapped<TKqpSchemeExecuter> {
4546
enum EEv {
4647
EvResult = EventSpaceBegin(TEvents::ES_PRIVATE),
4748
EvMakeTempDirResult,
49+
EvMakeSessionDirResult,
4850
};
4951

5052
struct TEvResult : public TEventLocal<TEvResult, EEv::EvResult> {
@@ -54,6 +56,10 @@ class TKqpSchemeExecuter : public TActorBootstrapped<TKqpSchemeExecuter> {
5456
struct TEvMakeTempDirResult : public TEventLocal<TEvMakeTempDirResult, EEv::EvMakeTempDirResult> {
5557
IKqpGateway::TGenericResult Result;
5658
};
59+
60+
struct TEvMakeSessionDirResult : public TEventLocal<TEvMakeSessionDirResult, EEv::EvMakeSessionDirResult> {
61+
IKqpGateway::TGenericResult Result;
62+
};
5763
};
5864
public:
5965
static constexpr NKikimrServices::TActivity::EType ActorActivityType() {
@@ -95,6 +101,46 @@ class TKqpSchemeExecuter : public TActorBootstrapped<TKqpSchemeExecuter> {
95101
auto ev = MakeHolder<TEvTxUserProxy::TEvProposeTransaction>();
96102
auto& record = ev->Record;
97103

104+
record.SetDatabaseName(Database);
105+
record.SetUserToken(NACLib::TSystemUsers::Tmp().SerializeAsString());
106+
record.SetPeerName(ClientAddress);
107+
108+
auto* modifyScheme = record.MutableTransaction()->MutableModifyScheme();
109+
modifyScheme->SetWorkingDir(GetTmpDirPath(Database));
110+
modifyScheme->SetOperationType(NKikimrSchemeOp::EOperationType::ESchemeOpMkDir);
111+
modifyScheme->SetAllowCreateInTempDir(false);
112+
modifyScheme->SetInternal(true);
113+
114+
auto* makeDir = modifyScheme->MutableMkDir();
115+
makeDir->SetName(GetSessionDirName());
116+
117+
NACLib::TDiffACL diffAcl;
118+
diffAcl.AddAccess(
119+
NACLib::EAccessType::Allow,
120+
NACLib::EAccessRights::CreateDirectory | NACLib::EAccessRights::DescribeSchema,
121+
AppData()->AllAuthenticatedUsers);
122+
123+
auto* modifyAcl = modifyScheme->MutableModifyACL();
124+
modifyAcl->SetDiffACL(diffAcl.SerializeAsString());
125+
126+
auto promise = NewPromise<IKqpGateway::TGenericResult>();
127+
IActor* requestHandler = new TSchemeOpRequestHandler(ev.Release(), promise, false);
128+
RegisterWithSameMailbox(requestHandler);
129+
130+
auto actorSystem = TActivationContext::ActorSystem();
131+
auto selfId = SelfId();
132+
promise.GetFuture().Subscribe([actorSystem, selfId](const TFuture<IKqpGateway::TGenericResult>& future) {
133+
auto ev = MakeHolder<TEvPrivate::TEvMakeTempDirResult>();
134+
ev->Result = future.GetValue();
135+
actorSystem->Send(selfId, ev.Release());
136+
});
137+
Become(&TKqpSchemeExecuter::ExecuteState);
138+
}
139+
140+
void CreateSessionDirectory() {
141+
auto ev = MakeHolder<TEvTxUserProxy::TEvProposeTransaction>();
142+
auto& record = ev->Record;
143+
98144
record.SetDatabaseName(Database);
99145
if (UserToken) {
100146
record.SetUserToken(UserToken->GetSerializedToken());
@@ -105,22 +151,31 @@ class TKqpSchemeExecuter : public TActorBootstrapped<TKqpSchemeExecuter> {
105151
modifyScheme->SetWorkingDir(GetSessionDirsBasePath(Database));
106152
modifyScheme->SetOperationType(NKikimrSchemeOp::EOperationType::ESchemeOpMkDir);
107153
modifyScheme->SetAllowCreateInTempDir(false);
154+
108155
auto* makeDir = modifyScheme->MutableMkDir();
109156
makeDir->SetName(SessionId);
110157
ActorIdToProto(KqpTempTablesAgentActor, modifyScheme->MutableTempDirOwnerActorId());
111158

159+
NACLib::TDiffACL diffAcl;
160+
diffAcl.RemoveAccess(
161+
NACLib::EAccessType::Allow,
162+
NACLib::EAccessRights::CreateDirectory | NACLib::EAccessRights::DescribeSchema,
163+
AppData()->AllAuthenticatedUsers);
164+
165+
auto* modifyAcl = modifyScheme->MutableModifyACL();
166+
modifyAcl->SetDiffACL(diffAcl.SerializeAsString());
167+
112168
auto promise = NewPromise<IKqpGateway::TGenericResult>();
113169
IActor* requestHandler = new TSchemeOpRequestHandler(ev.Release(), promise, false);
114170
RegisterWithSameMailbox(requestHandler);
115171

116-
auto actorSystem = TActivationContext::ActorSystem();
172+
auto actorSystem = TlsActivationContext->ActorSystem();
117173
auto selfId = SelfId();
118174
promise.GetFuture().Subscribe([actorSystem, selfId](const TFuture<IKqpGateway::TGenericResult>& future) {
119-
auto ev = MakeHolder<TEvPrivate::TEvMakeTempDirResult>();
175+
auto ev = MakeHolder<TEvPrivate::TEvMakeSessionDirResult>();
120176
ev->Result = future.GetValue();
121177
actorSystem->Send(selfId, ev.Release());
122178
});
123-
Become(&TKqpSchemeExecuter::ExecuteState);
124179
}
125180

126181
TString GetDatabaseForLoginOperation() const {
@@ -527,6 +582,7 @@ class TKqpSchemeExecuter : public TActorBootstrapped<TKqpSchemeExecuter> {
527582
switch (ev->GetTypeRewrite()) {
528583
hFunc(TEvPrivate::TEvResult, HandleExecute);
529584
hFunc(TEvPrivate::TEvMakeTempDirResult, Handle);
585+
hFunc(TEvPrivate::TEvMakeSessionDirResult, Handle);
530586
hFunc(TEvKqp::TEvAbortExecution, HandleAbortExecution);
531587
hFunc(TEvTxUserProxy::TEvAllocateTxIdResult, Handle);
532588
hFunc(TEvTxProxySchemeCache::TEvNavigateKeySetResult, Handle);
@@ -560,7 +616,17 @@ class TKqpSchemeExecuter : public TActorBootstrapped<TKqpSchemeExecuter> {
560616
void Handle(TEvPrivate::TEvMakeTempDirResult::TPtr& result) {
561617
if (!result->Get()->Result.Success()) {
562618
InternalError(TStringBuilder()
563-
<< "Error creating temporary directory for session " << SessionId
619+
<< "Error creating temporary directory: "
620+
<< result->Get()->Result.Issues().ToString(true));
621+
}
622+
623+
CreateSessionDirectory();
624+
}
625+
626+
void Handle(TEvPrivate::TEvMakeSessionDirResult::TPtr& result) {
627+
if (!result->Get()->Result.Success()) {
628+
InternalError(TStringBuilder()
629+
<< "Error creating directory for session " << SessionId
564630
<< ": " << result->Get()->Result.Issues().ToString(true));
565631
}
566632
MakeSchemeOperationRequest();

ydb/core/kqp/ut/query/kqp_query_ut.cpp

Lines changed: 18 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1513,9 +1513,26 @@ Y_UNIT_TEST_SUITE(KqpQuery) {
15131513
auto settings = TKikimrSettings()
15141514
.SetAppConfig(appConfig)
15151515
.SetWithSampleTables(false)
1516-
.SetEnableTempTables(true);
1516+
.SetEnableTempTables(true)
1517+
.SetAuthToken("user0@builtin");;
15171518
TKikimrRunner kikimr(settings);
15181519

1520+
{
1521+
auto driverConfig = TDriverConfig()
1522+
.SetEndpoint(kikimr.GetEndpoint())
1523+
.SetAuthToken("root@builtin");
1524+
auto driver = TDriver(driverConfig);
1525+
auto schemeClient = NYdb::NScheme::TSchemeClient(driver);
1526+
1527+
NYdb::NScheme::TPermissions permissions("user0@builtin",
1528+
{"ydb.generic.read", "ydb.generic.write"}
1529+
);
1530+
auto result = schemeClient.ModifyPermissions("/Root",
1531+
NYdb::NScheme::TModifyPermissionsSettings().AddGrantPermissions(permissions)
1532+
).ExtractValueSync();
1533+
AssertSuccessResult(result);
1534+
}
1535+
15191536
const TString query = R"(
15201537
CREATE TABLE `/Root/Source` (
15211538
Col1 Uint64 NOT NULL,

ydb/core/kqp/ut/service/kqp_qs_queries_ut.cpp

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1694,7 +1694,8 @@ Y_UNIT_TEST_SUITE(KqpQueryService) {
16941694
auto setting = NKikimrKqp::TKqpSetting();
16951695
auto serverSettings = TKikimrSettings()
16961696
.SetAppConfig(appConfig)
1697-
.SetKqpSettings({setting});
1697+
.SetKqpSettings({setting})
1698+
.SetAuthToken("user0@builtin");
16981699
TKikimrRunner kikimr(
16991700
serverSettings.SetWithSampleTables(false).SetEnableTempTables(true));
17001701
auto clientConfig = NGRpcProxy::TGRpcClientConfig(kikimr.GetEndpoint());

ydb/library/aclib/aclib.cpp

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -817,4 +817,9 @@ const NACLib::TUserToken& TSystemUsers::Metadata() {
817817
return GlobalMetadataUser;
818818
}
819819

820+
const NACLib::TUserToken& TSystemUsers::Tmp() {
821+
static TUserToken GlobalTmpUser = TUserToken(BUILTIN_ACL_TMP, {});
822+
return GlobalTmpUser;
823+
}
824+
820825
}

ydb/library/aclib/aclib.h

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,10 +12,13 @@ namespace NACLib {
1212
#define BUILTIN_SYSTEM_DOMAIN "system"
1313

1414
#define BUILTIN_ACL_METADATA "metadata@" BUILTIN_SYSTEM_DOMAIN
15+
#define BUILTIN_ACL_TMP "tmp@" BUILTIN_SYSTEM_DOMAIN
16+
1517
class TUserToken;
1618
class TSystemUsers {
1719
public:
1820
static const TUserToken& Metadata();
21+
static const TUserToken& Tmp();
1922
};
2023

2124
enum EAccessRights : ui32 { // bitmask

0 commit comments

Comments
 (0)