Skip to content

Commit 2145bca

Browse files
authored
schemeshard: add notion and protection of system path names (#19620)
New feature flag `enable_system_names_protection` prohibits users from creating paths with names reserved for current or future system use. YDB exclusively reserves names like `.sys`, `.metadata`, `.tmp`, `.backups` etc. and any names starting with prefixes `.` and `__ydb` for its own use. Also introduces safeguards against carelessly using reserved names in future code. Special tests verify that: - New scheme create operations include protection for reserved names - Modifications to the reserved name registry will not go unnoticed The latter is designed to protect well-meaning developers from careless actions. YDB developers must obtain explicit consent from the project committee to add new names to the reserved list.
1 parent 8cdfc17 commit 2145bca

File tree

60 files changed

+1570
-198
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

60 files changed

+1570
-198
lines changed

ydb/core/kqp/proxy_service/kqp_script_executions_ut.cpp

Lines changed: 12 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -58,7 +58,7 @@ const TVector<NKikimrSchemeOp::TColumnDescription> EXTENDED_COLUMNS = {
5858
Col("col5", NScheme::NTypeIds::Interval)
5959
};
6060

61-
const TVector<TString> TEST_TABLE_PATH = { ".test", "test_table" };
61+
const TVector<TString> TEST_TABLE_PATH = { "test", "test_table" };
6262

6363
const TVector<TString> TEST_KEY_COLUMNS = {"col1"};
6464

@@ -349,15 +349,18 @@ Y_UNIT_TEST_SUITE(TableCreation) {
349349

350350
constexpr i32 requests = 2;
351351

352+
auto uniqueTablePath = TEST_TABLE_PATH;
352353
TVector<TActorId> edgeActors;
353354
for (i32 i = 0; i < requests; ++i) {
354-
edgeActors.push_back(ydb.CreateTableInDbAsync(DEFAULT_COLUMNS, { ".test", "test_table" + ToString(i)}));
355+
uniqueTablePath.back() = TEST_TABLE_PATH.back() + ToString(i);
356+
edgeActors.push_back(ydb.CreateTableInDbAsync(DEFAULT_COLUMNS, uniqueTablePath));
355357
}
356358

357359
ydb.WaitTableCreation(std::move(edgeActors));
358360

359361
for(i32 i = 0; i < requests; i++) {
360-
ydb.VerifyColumnsList({".test", "test_table" + ToString(i)});
362+
uniqueTablePath.back() = TEST_TABLE_PATH.back() + ToString(i);
363+
ydb.VerifyColumnsList(uniqueTablePath);
361364
}
362365
}
363366

@@ -367,17 +370,20 @@ Y_UNIT_TEST_SUITE(TableCreation) {
367370
constexpr i32 tables = 2;
368371
constexpr i32 requests = 20;
369372

373+
auto uniqueTablePath = TEST_TABLE_PATH;
370374
TVector<TActorId> edgeActors;
371375
for (i32 i = 0; i < tables; ++i) {
372-
for (i32 j = 0; j < requests; ++j){
373-
edgeActors.push_back(ydb.CreateTableInDbAsync(DEFAULT_COLUMNS, { ".test", "test_table" + ToString(i)}));
376+
uniqueTablePath.back() = TEST_TABLE_PATH.back() + ToString(i);
377+
for (i32 j = 0; j < requests; ++j) {
378+
edgeActors.push_back(ydb.CreateTableInDbAsync(DEFAULT_COLUMNS, uniqueTablePath));
374379
}
375380
}
376381

377382
ydb.WaitTableCreation(std::move(edgeActors));
378383

379384
for(i32 i = 0; i < tables; i++) {
380-
ydb.VerifyColumnsList({".test", "test_table" + ToString(i)});
385+
uniqueTablePath.back() = TEST_TABLE_PATH.back() + ToString(i);
386+
ydb.VerifyColumnsList(uniqueTablePath);
381387
}
382388
}
383389

ydb/core/protos/feature_flags.proto

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -213,4 +213,5 @@ message TFeatureFlags {
213213
optional bool EnableAddUniqueIndex = 187 [default = false];
214214
optional bool EnableSharedMetadataAccessorCache = 188 [default = true, deprecated = true];
215215
optional bool RequireDbPrefixInSecretName = 189 [default = false];
216+
optional bool EnableSystemNamesProtection = 190 [default = false];
216217
}

ydb/core/sys_view/ut_kqp.cpp

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3578,6 +3578,12 @@ ALTER OBJECT `/Root/test_show_create` (TYPE TABLE) SET (ACTION = UPSERT_OPTIONS,
35783578
Y_UNIT_TEST(SystemViewFailOps) {
35793579
TTestEnv env;
35803580

3581+
// Make AdministrationAllowedSIDs non-empty to deny anonymous user cluster admin privilege.
3582+
// All requests here are made anonymously, effectively making all requests run with admin rights.
3583+
// That can cause side effects, especially when dealing with system reserved names.
3584+
// Using an authorized non-admin user helps avoid these side effects.
3585+
env.GetServer().GetRuntime()->GetAppData().AdministrationAllowedSIDs.push_back("thou-shalt-not-pass");
3586+
35813587
TTableClient client(env.GetDriver());
35823588
auto session = client.CreateSession().GetValueSync().GetSession();
35833589

ydb/core/testlib/basics/feature_flags.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -79,6 +79,7 @@ class TTestFeatureFlagsHolder {
7979
FEATURE_FLAG_SETTER(EnableShowCreate)
8080
FEATURE_FLAG_SETTER(EnableLocalDBBtreeIndex)
8181
FEATURE_FLAG_SETTER(EnableSharedMetadataAccessorCache)
82+
FEATURE_FLAG_SETTER(EnableSystemNamesProtection)
8283

8384
#undef FEATURE_FLAG_SETTER
8485
};

ydb/core/tx/schemeshard/olap/operations/create_store.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -377,7 +377,7 @@ class TCreateOlapStore: public TSubOperation {
377377

378378
if (checks) {
379379
checks
380-
.IsValidLeafName()
380+
.IsValidLeafName(context.UserToken.Get())
381381
.DepthLimit()
382382
.PathsLimit()
383383
.DirChildrenLimit()

ydb/core/tx/schemeshard/olap/operations/create_table.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -665,7 +665,7 @@ class TCreateColumnTable: public TSubOperation {
665665

666666
if (checks) {
667667
checks
668-
.IsValidLeafName()
668+
.IsValidLeafName(context.UserToken.Get())
669669
.DepthLimit()
670670
.PathsLimit()
671671
.ShardsLimit(storeInfo ? 0 : shardsCount)
Lines changed: 157 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,157 @@
1+
#include <ydb/core/protos/schemeshard/operations.pb.h>
2+
3+
#include "schemeshard__op_traits.h"
4+
5+
6+
namespace NKikimr::NSchemeShard {
7+
8+
enum EOperationClass {
9+
Create = 0,
10+
Alter,
11+
Drop,
12+
Other,
13+
Unknown
14+
};
15+
16+
EOperationClass GetOperationClass(NKikimrSchemeOp::EOperationType op) {
17+
switch (op) {
18+
// Simple operations that create paths
19+
case NKikimrSchemeOp::EOperationType::ESchemeOpMkDir:
20+
case NKikimrSchemeOp::EOperationType::ESchemeOpCreateTable:
21+
case NKikimrSchemeOp::EOperationType::ESchemeOpCreatePersQueueGroup:
22+
case NKikimrSchemeOp::EOperationType::ESchemeOpCreateSubDomain:
23+
case NKikimrSchemeOp::EOperationType::ESchemeOpCreateRtmrVolume:
24+
case NKikimrSchemeOp::EOperationType::ESchemeOpCreateBlockStoreVolume:
25+
case NKikimrSchemeOp::EOperationType::ESchemeOpCreateKesus:
26+
case NKikimrSchemeOp::EOperationType::ESchemeOpCreateSolomonVolume:
27+
case NKikimrSchemeOp::EOperationType::ESchemeOpCreateIndexedTable:
28+
case NKikimrSchemeOp::EOperationType::ESchemeOpCreateTableIndex:
29+
case NKikimrSchemeOp::EOperationType::ESchemeOpCreateExtSubDomain:
30+
case NKikimrSchemeOp::EOperationType::ESchemeOpCreateFileStore:
31+
case NKikimrSchemeOp::EOperationType::ESchemeOpCreateColumnStore:
32+
case NKikimrSchemeOp::EOperationType::ESchemeOpCreateColumnTable:
33+
case NKikimrSchemeOp::EOperationType::ESchemeOpCreateCdcStream:
34+
case NKikimrSchemeOp::EOperationType::ESchemeOpMoveTable:
35+
case NKikimrSchemeOp::EOperationType::ESchemeOpMoveTableIndex:
36+
case NKikimrSchemeOp::EOperationType::ESchemeOpCreateSequence:
37+
case NKikimrSchemeOp::EOperationType::ESchemeOpCreateReplication:
38+
case NKikimrSchemeOp::EOperationType::ESchemeOpCreateBlobDepot:
39+
case NKikimrSchemeOp::EOperationType::ESchemeOpCreateExternalTable:
40+
case NKikimrSchemeOp::EOperationType::ESchemeOpMoveIndex:
41+
case NKikimrSchemeOp::EOperationType::ESchemeOpCreateExternalDataSource:
42+
case NKikimrSchemeOp::EOperationType::ESchemeOpCreateView:
43+
case NKikimrSchemeOp::EOperationType::ESchemeOpCreateResourcePool:
44+
case NKikimrSchemeOp::EOperationType::ESchemeOpCreateContinuousBackup:
45+
case NKikimrSchemeOp::EOperationType::ESchemeOpCreateBackupCollection:
46+
case NKikimrSchemeOp::EOperationType::ESchemeOpMoveSequence:
47+
case NKikimrSchemeOp::EOperationType::ESchemeOpCreateTransfer:
48+
case NKikimrSchemeOp::EOperationType::ESchemeOpCreateSysView:
49+
return EOperationClass::Create;
50+
51+
// Simple operations that drop paths
52+
case NKikimrSchemeOp::EOperationType::ESchemeOpDropTable:
53+
case NKikimrSchemeOp::EOperationType::ESchemeOpDropPersQueueGroup:
54+
case NKikimrSchemeOp::EOperationType::ESchemeOpRmDir:
55+
case NKikimrSchemeOp::EOperationType::ESchemeOpDropSubDomain:
56+
case NKikimrSchemeOp::EOperationType::ESchemeOpDropBlockStoreVolume:
57+
case NKikimrSchemeOp::EOperationType::ESchemeOpDropKesus:
58+
case NKikimrSchemeOp::EOperationType::ESchemeOpForceDropSubDomain:
59+
case NKikimrSchemeOp::EOperationType::ESchemeOpDropSolomonVolume:
60+
case NKikimrSchemeOp::EOperationType::ESchemeOpForceDropUnsafe:
61+
case NKikimrSchemeOp::EOperationType::ESchemeOpDropTableIndex:
62+
case NKikimrSchemeOp::EOperationType::ESchemeOpForceDropExtSubDomain:
63+
case NKikimrSchemeOp::EOperationType::ESchemeOpDropLock:
64+
case NKikimrSchemeOp::EOperationType::ESchemeOpDropIndex:
65+
case NKikimrSchemeOp::EOperationType::ESchemeOpDropTableIndexAtMainTable:
66+
case NKikimrSchemeOp::EOperationType::ESchemeOpDropFileStore:
67+
case NKikimrSchemeOp::EOperationType::ESchemeOpDropColumnStore:
68+
case NKikimrSchemeOp::EOperationType::ESchemeOpDropColumnTable:
69+
case NKikimrSchemeOp::EOperationType::ESchemeOpDropCdcStream:
70+
case NKikimrSchemeOp::EOperationType::ESchemeOpDropSequence:
71+
case NKikimrSchemeOp::EOperationType::ESchemeOpDropReplication:
72+
case NKikimrSchemeOp::EOperationType::ESchemeOpDropBlobDepot:
73+
case NKikimrSchemeOp::EOperationType::ESchemeOpDropView:
74+
case NKikimrSchemeOp::EOperationType::ESchemeOpDropResourcePool:
75+
case NKikimrSchemeOp::EOperationType::ESchemeOpDropExternalTable:
76+
case NKikimrSchemeOp::EOperationType::ESchemeOpDropExternalDataSource:
77+
case NKikimrSchemeOp::EOperationType::ESchemeOpDropContinuousBackup:
78+
case NKikimrSchemeOp::EOperationType::ESchemeOpDropBackupCollection:
79+
case NKikimrSchemeOp::EOperationType::ESchemeOpDropTransfer:
80+
case NKikimrSchemeOp::EOperationType::ESchemeOpDropTransferCascade:
81+
case NKikimrSchemeOp::EOperationType::ESchemeOpDropSysView:
82+
return EOperationClass::Drop;
83+
84+
// Simple operations that alter paths
85+
case NKikimrSchemeOp::EOperationType::ESchemeOpAlterTable:
86+
case NKikimrSchemeOp::EOperationType::ESchemeOpAlterPersQueueGroup:
87+
case NKikimrSchemeOp::EOperationType::ESchemeOpModifyACL:
88+
case NKikimrSchemeOp::EOperationType::ESchemeOpAlterBlockStoreVolume:
89+
case NKikimrSchemeOp::EOperationType::ESchemeOpAlterKesus:
90+
case NKikimrSchemeOp::EOperationType::ESchemeOpAlterSubDomain:
91+
case NKikimrSchemeOp::EOperationType::ESchemeOpAlterUserAttributes:
92+
case NKikimrSchemeOp::EOperationType::ESchemeOpAlterExtSubDomain:
93+
case NKikimrSchemeOp::EOperationType::ESchemeOpAlterTableIndex:
94+
case NKikimrSchemeOp::EOperationType::ESchemeOpAlterSolomonVolume:
95+
case NKikimrSchemeOp::EOperationType::ESchemeOpAlterFileStore:
96+
case NKikimrSchemeOp::EOperationType::ESchemeOpAlterColumnStore:
97+
case NKikimrSchemeOp::EOperationType::ESchemeOpAlterColumnTable:
98+
case NKikimrSchemeOp::EOperationType::ESchemeOpAlterCdcStream:
99+
case NKikimrSchemeOp::EOperationType::ESchemeOpAlterSequence:
100+
case NKikimrSchemeOp::EOperationType::ESchemeOpAlterReplication:
101+
case NKikimrSchemeOp::EOperationType::ESchemeOpAlterBlobDepot:
102+
case NKikimrSchemeOp::EOperationType::ESchemeOpAlterExternalTable:
103+
case NKikimrSchemeOp::EOperationType::ESchemeOpAlterExternalDataSource:
104+
case NKikimrSchemeOp::EOperationType::ESchemeOpAlterView:
105+
case NKikimrSchemeOp::EOperationType::ESchemeOpAlterResourcePool:
106+
case NKikimrSchemeOp::EOperationType::ESchemeOpAlterContinuousBackup:
107+
case NKikimrSchemeOp::EOperationType::ESchemeOpAlterBackupCollection:
108+
case NKikimrSchemeOp::EOperationType::ESchemeOpAlterTransfer:
109+
return EOperationClass::Alter;
110+
111+
// Compound or special operations
112+
case NKikimrSchemeOp::EOperationType::ESchemeOpCreateConsistentCopyTables:
113+
case NKikimrSchemeOp::EOperationType::ESchemeOpSplitMergeTablePartitions:
114+
case NKikimrSchemeOp::EOperationType::ESchemeOpBackup:
115+
case NKikimrSchemeOp::EOperationType::ESchemeOpAssignBlockStoreVolume:
116+
case NKikimrSchemeOp::EOperationType::ESchemeOp_DEPRECATED_35:
117+
case NKikimrSchemeOp::EOperationType::ESchemeOpUpgradeSubDomain:
118+
case NKikimrSchemeOp::EOperationType::ESchemeOpUpgradeSubDomainDecision:
119+
case NKikimrSchemeOp::EOperationType::ESchemeOpCreateIndexBuild:
120+
case NKikimrSchemeOp::EOperationType::ESchemeOpInitiateBuildIndexMainTable:
121+
case NKikimrSchemeOp::EOperationType::ESchemeOpCreateLock:
122+
case NKikimrSchemeOp::EOperationType::ESchemeOpApplyIndexBuild:
123+
case NKikimrSchemeOp::EOperationType::ESchemeOpFinalizeBuildIndexMainTable:
124+
case NKikimrSchemeOp::EOperationType::ESchemeOpFinalizeBuildIndexImplTable:
125+
case NKikimrSchemeOp::EOperationType::ESchemeOpInitiateBuildIndexImplTable:
126+
case NKikimrSchemeOp::EOperationType::ESchemeOpCancelIndexBuild:
127+
case NKikimrSchemeOp::EOperationType::ESchemeOpRestore:
128+
case NKikimrSchemeOp::EOperationType::ESchemeOpAlterLogin:
129+
case NKikimrSchemeOp::EOperationType::ESchemeOpCreateCdcStreamImpl:
130+
case NKikimrSchemeOp::EOperationType::ESchemeOpCreateCdcStreamAtTable:
131+
case NKikimrSchemeOp::EOperationType::ESchemeOpAlterCdcStreamImpl:
132+
case NKikimrSchemeOp::EOperationType::ESchemeOpAlterCdcStreamAtTable:
133+
case NKikimrSchemeOp::EOperationType::ESchemeOpDropCdcStreamImpl:
134+
case NKikimrSchemeOp::EOperationType::ESchemeOpDropCdcStreamAtTable:
135+
case NKikimrSchemeOp::EOperationType::ESchemeOpDropReplicationCascade:
136+
case NKikimrSchemeOp::EOperationType::ESchemeOpAlterExtSubDomainCreateHive:
137+
case NKikimrSchemeOp::EOperationType::ESchemeOpCreateColumnBuild:
138+
case NKikimrSchemeOp::EOperationType::ESchemeOpRestoreMultipleIncrementalBackups:
139+
case NKikimrSchemeOp::EOperationType::ESchemeOpRestoreIncrementalBackupAtTable:
140+
case NKikimrSchemeOp::EOperationType::ESchemeOpBackupBackupCollection:
141+
case NKikimrSchemeOp::EOperationType::ESchemeOpBackupIncrementalBackupCollection:
142+
case NKikimrSchemeOp::EOperationType::ESchemeOpRestoreBackupCollection:
143+
case NKikimrSchemeOp::EOperationType::ESchemeOpCreateLongIncrementalRestoreOp:
144+
case NKikimrSchemeOp::EOperationType::ESchemeOpChangePathState:
145+
return EOperationClass::Other;
146+
147+
// intentionally no default -- to trigger [-Werror,-Wswitch] compile error on any new entry not handled here
148+
}
149+
150+
return EOperationClass::Unknown;
151+
}
152+
153+
bool IsCreatePathOperation(NKikimrSchemeOp::EOperationType op) {
154+
return (GetOperationClass(op) == EOperationClass::Create);
155+
}
156+
157+
} // namespace NKikimr::NSchemeShard

ydb/core/tx/schemeshard/schemeshard__op_traits.h

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -173,6 +173,13 @@ struct TSchemeTxTraits<NKikimrSchemeOp::EOperationType::ESchemeOpRestoreBackupCo
173173
constexpr inline static bool CreateAdditionalDirs = true;
174174
};
175175

176+
template <>
177+
struct TSchemeTxTraits<NKikimrSchemeOp::EOperationType::ESchemeOpCreateSequence>
178+
: public TSchemeTxTraitsFallback
179+
{
180+
constexpr inline static bool CreateDirsFromName = true;
181+
};
182+
176183
template <>
177184
struct TSchemeTxTraits<NKikimrSchemeOp::EOperationType::ESchemeOpCreateReplication>
178185
: public TSchemeTxTraitsFallback
@@ -232,4 +239,6 @@ bool Rewrite(TTraits traits, TTxTransaction& tx) {
232239
return false;
233240
}
234241

235-
}// namespace NKikimr::NSchemeShard
242+
bool IsCreatePathOperation(NKikimrSchemeOp::EOperationType op);
243+
244+
} // namespace NKikimr::NSchemeShard

ydb/core/tx/schemeshard/schemeshard__operation.cpp

Lines changed: 0 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -91,14 +91,6 @@ struct TSchemeShard::TTxOperationProposeCancelTx: public NTabletFlatExecutor::TT
9191
}
9292
};
9393

94-
NKikimrScheme::TEvModifySchemeTransaction GetRecordForPrint(const NKikimrScheme::TEvModifySchemeTransaction& record) {
95-
auto recordForPrint = record;
96-
if (record.HasUserToken()) {
97-
recordForPrint.SetUserToken("***hide token***");
98-
}
99-
return recordForPrint;
100-
}
101-
10294
bool TSchemeShard::ProcessOperationParts(
10395
const TVector<ISubOperation::TPtr>& parts,
10496
const TTxId& txId,
@@ -868,10 +860,6 @@ bool CreateDirs(const TTxTransaction& tx, const TPath& parentPath, TPath path, T
868860
.NotResolved();
869861
}
870862

871-
if (checks) {
872-
checks.IsValidLeafName();
873-
}
874-
875863
if (!checks) {
876864
result.Status = checks.GetStatus();
877865
result.Reason = checks.GetError();
@@ -964,10 +952,6 @@ TOperation::TSplitTransactionsResult TOperation::SplitIntoTransactions(const TTx
964952
.NotResolved();
965953
}
966954

967-
if (checks && !exists) {
968-
checks.IsValidLeafName();
969-
}
970-
971955
if (!checks) {
972956
result.Status = checks.GetStatus();
973957
result.Reason = checks.GetError();

ydb/core/tx/schemeshard/schemeshard__operation_alter_external_data_source.cpp

Lines changed: 5 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -91,18 +91,13 @@ class TAlterExternalDataSource : public TSubOperation {
9191
}
9292

9393
static bool IsDestinationPathValid(const THolder<TProposeResponse>& result,
94-
const TPath& dstPath,
95-
const TString& acl) {
94+
const TPath& dstPath) {
9695
const auto checks = dstPath.Check();
9796
checks.IsAtLocalSchemeShard()
9897
.IsResolved()
9998
.NotUnderDeleting()
10099
.FailOnWrongType(TPathElement::EPathType::EPathTypeExternalDataSource)
101-
.IsValidLeafName()
102-
.DepthLimit()
103-
.PathsLimit()
104-
.DirChildrenLimit()
105-
.IsValidACL(acl);
100+
;
106101

107102
if (!checks) {
108103
result->SetError(checks.GetStatus(), checks.GetError());
@@ -179,15 +174,11 @@ class TAlterExternalDataSource : public TSubOperation {
179174
const TOperationContext& context,
180175
NIceDb::TNiceDb& db,
181176
const TPathElement::TPtr& externalDataSourcePath,
182-
const TExternalDataSourceInfo::TPtr& externalDataSourceInfo,
183-
const TString& acl) const {
177+
const TExternalDataSourceInfo::TPtr& externalDataSourceInfo) const {
184178
const auto& externalDataSourcePathId = externalDataSourcePath->PathId;
185179

186180
context.SS->ExternalDataSources[externalDataSourcePathId] = externalDataSourceInfo;
187181

188-
if (!acl.empty()) {
189-
externalDataSourcePath->ApplyACL(acl);
190-
}
191182
context.SS->PersistPath(db, externalDataSourcePathId);
192183

193184
context.SS->PersistExternalDataSource(db,
@@ -226,10 +217,9 @@ class TAlterExternalDataSource : public TSubOperation {
226217
RETURN_RESULT_UNLESS(NExternalDataSource::IsParentPathValid(
227218
result, parentPath, Transaction, /* isCreate */ false));
228219

229-
const TString acl = Transaction.GetModifyACL().GetDiffACL();
230220
const TPath dstPath = parentPath.Child(name);
231221

232-
RETURN_RESULT_UNLESS(IsDestinationPathValid(result, dstPath, acl));
222+
RETURN_RESULT_UNLESS(IsDestinationPathValid(result, dstPath));
233223
RETURN_RESULT_UNLESS(IsApplyIfChecksPassed(result, context));
234224
RETURN_RESULT_UNLESS(IsDescriptionValid(result, externalDataSourceDescription, context.SS->ExternalSourceFactory));
235225

@@ -271,7 +261,7 @@ class TAlterExternalDataSource : public TSubOperation {
271261
AdvanceTransactionStateToPropose(context, db);
272262

273263
PersistExternalDataSource(
274-
context, db, externalDataSource, externalDataSourceInfo, acl);
264+
context, db, externalDataSource, externalDataSourceInfo);
275265

276266
IncParentDirAlterVersionWithRepublishSafeWithUndo(OperationId,
277267
dstPath,

0 commit comments

Comments
 (0)