Skip to content

Commit

Permalink
schemeshard: fix crash on concurrent alter-extsubdomains (#9201) (#10908
Browse files Browse the repository at this point in the history
)

Co-authored-by: ijon <ijon@ydb.tech>
  • Loading branch information
uzhastik and ijon authored Oct 25, 2024
1 parent a4c61b1 commit a6b5e7e
Show file tree
Hide file tree
Showing 4 changed files with 18 additions and 11 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
Original file line number Diff line number Diff line change
Expand Up @@ -814,7 +814,7 @@ class TSyncHive: public TSubOperationState {
}

bool HandleReply(TEvHive::TEvUpdateDomainReply::TPtr& ev, TOperationContext& context) override {
const TTabletId hive = TTabletId(ev->Get()->Record.GetOrigin());
const TTabletId hive = TTabletId(ev->Get()->Record.GetOrigin());

LOG_I(DebugHint() << "HandleReply TEvUpdateDomainReply"
<< ", from hive: " << hive);
Expand Down Expand Up @@ -1086,7 +1086,13 @@ ISubOperation::TPtr CreateAlterExtSubDomain(TOperationId id, TTxState::ETxState
}

TVector<ISubOperation::TPtr> CreateCompatibleAlterExtSubDomain(TOperationId id, const TTxTransaction& tx, TOperationContext& context) {
Y_ABORT_UNLESS(tx.GetOperationType() == NKikimrSchemeOp::ESchemeOpAlterExtSubDomain);
//NOTE: Accepting ESchemeOpAlterSubDomain operation for an ExtSubDomain is a special compatibility case
// for those old subdomains that at the time went through migration to a separate tenants.
// Console tablet holds records about types of the subdomains but they hadn't been updated
// at the migration time. So Console still thinks that old subdomains are plain subdomains
// whereas they had been migrated to the extsubdomains.
// This compatibility case should be upholded until Console records would be updated.
Y_ABORT_UNLESS(tx.GetOperationType() == NKikimrSchemeOp::ESchemeOpAlterExtSubDomain || tx.GetOperationType() == NKikimrSchemeOp::ESchemeOpAlterSubDomain);

LOG_I("CreateCompatibleAlterExtSubDomain, opId " << id
<< ", feature flag EnableAlterDatabaseCreateHiveFirst " << context.SS->EnableAlterDatabaseCreateHiveFirst
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 a6b5e7e

Please sign in to comment.