Skip to content

Commit

Permalink
schemeshard: make direct creation of TAlterExtSubDomain impossible (y…
Browse files Browse the repository at this point in the history
…db-platform#9157)

KIKIMR-21965

Enforce creation of `TAlterExtSubDomain` operations only through `CreateCompatibleAlterExtSubDomain()` to ensure all proper state checking.

### Changelog category

* Not for changelog
  • Loading branch information
ijon committed Sep 13, 2024
1 parent d50240f commit 2deb898
Show file tree
Hide file tree
Showing 3 changed files with 10 additions and 9 deletions.
2 changes: 1 addition & 1 deletion ydb/core/tx/schemeshard/schemeshard__operation.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -1263,7 +1263,7 @@ TVector<ISubOperation::TPtr> TOperation::ConstructParts(const TTxTransaction& tx
case NKikimrSchemeOp::EOperationType::ESchemeOpCreateSubDomain:
return {CreateSubDomain(NextPartId(), tx)};
case NKikimrSchemeOp::EOperationType::ESchemeOpAlterSubDomain:
return {CreateCompatibleSubdomainAlter(context.SS, NextPartId(), tx)};
return CreateCompatibleSubdomainAlter(NextPartId(), tx, context);
case NKikimrSchemeOp::EOperationType::ESchemeOpDropSubDomain:
return {CreateDropSubdomain(NextPartId(), tx)};
case NKikimrSchemeOp::EOperationType::ESchemeOpForceDropSubDomain:
Expand Down
6 changes: 3 additions & 3 deletions ydb/core/tx/schemeshard/schemeshard__operation_part.h
Original file line number Diff line number Diff line change
Expand Up @@ -493,7 +493,7 @@ ISubOperation::TPtr CreateAlterSubDomain(TOperationId id, const TTxTransaction&
ISubOperation::TPtr CreateAlterSubDomain(TOperationId id, TTxState::ETxState state);

ISubOperation::TPtr CreateCompatibleSubdomainDrop(TSchemeShard* ss, TOperationId id, const TTxTransaction& tx);
ISubOperation::TPtr CreateCompatibleSubdomainAlter(TSchemeShard* ss, TOperationId id, const TTxTransaction& tx);
TVector<ISubOperation::TPtr> CreateCompatibleSubdomainAlter(TOperationId id, const TTxTransaction& tx, TOperationContext& context);

ISubOperation::TPtr CreateUpgradeSubDomain(TOperationId id, const TTxTransaction& tx);
ISubOperation::TPtr CreateUpgradeSubDomain(TOperationId id, TTxState::ETxState state);
Expand All @@ -514,10 +514,10 @@ ISubOperation::TPtr CreateExtSubDomain(TOperationId id, TTxState::ETxState state

// Alter
TVector<ISubOperation::TPtr> CreateCompatibleAlterExtSubDomain(TOperationId nextId, const TTxTransaction& tx, TOperationContext& context);
ISubOperation::TPtr CreateAlterExtSubDomain(TOperationId id, const TTxTransaction& tx);
ISubOperation::TPtr CreateAlterExtSubDomain(TOperationId id, TTxState::ETxState state);
ISubOperation::TPtr CreateAlterExtSubDomainCreateHive(TOperationId id, const TTxTransaction& tx);
ISubOperation::TPtr CreateAlterExtSubDomainCreateHive(TOperationId id, TTxState::ETxState state);
//NOTE: no variants to construct individual suboperations directly from TTxTransaction --
// -- it should be possible only through CreateCompatibleAlterExtSubDomain

// Drop
ISubOperation::TPtr CreateForceDropExtSubDomain(TOperationId id, const TTxTransaction& tx);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -1530,13 +1530,13 @@ ISubOperation::TPtr CreateCompatibleSubdomainDrop(TSchemeShard* ss, TOperationId
return CreateForceDropSubDomain(id, tx);
}

ISubOperation::TPtr CreateCompatibleSubdomainAlter(TSchemeShard* ss, TOperationId id, const TTxTransaction& tx) {
TVector<ISubOperation::TPtr> CreateCompatibleSubdomainAlter(TOperationId id, const TTxTransaction& tx, TOperationContext& context) {
const auto& info = tx.GetSubDomain();

const TString& parentPathStr = tx.GetWorkingDir();
const TString& name = info.GetName();

TPath path = TPath::Resolve(parentPathStr, ss).Dive(name);
TPath path = TPath::Resolve(parentPathStr, context.SS).Dive(name);

{
TPath::TChecker checks = path.Check();
Expand All @@ -1546,15 +1546,16 @@ ISubOperation::TPtr CreateCompatibleSubdomainAlter(TSchemeShard* ss, TOperationI
.NotDeleted();

if (!checks) {
return CreateAlterSubDomain(id, tx);
return {CreateAlterSubDomain(id, tx)};
}
}

if (path.Base()->IsExternalSubDomainRoot()) {
return CreateAlterExtSubDomain(id, tx);
// plain subdomains don't have subdomain/tenant hives so only single operation should be returned here
return CreateCompatibleAlterExtSubDomain(id, tx, context);
}

return CreateAlterSubDomain(id, tx);
return {CreateAlterSubDomain(id, tx)};
}

}

0 comments on commit 2deb898

Please sign in to comment.