diff --git a/ydb/core/tx/schemeshard/schemeshard__operation_alter_extsubdomain.cpp b/ydb/core/tx/schemeshard/schemeshard__operation_alter_extsubdomain.cpp index 5b67ca14030c..621e4b656c74 100644 --- a/ydb/core/tx/schemeshard/schemeshard__operation_alter_extsubdomain.cpp +++ b/ydb/core/tx/schemeshard/schemeshard__operation_alter_extsubdomain.cpp @@ -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); @@ -1084,7 +1084,13 @@ ISubOperation::TPtr CreateAlterExtSubDomain(TOperationId id, TTxState::ETxState } TVector 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 diff --git a/ydb/core/tx/schemeshard/ut_extsubdomain/ut_extsubdomain.cpp b/ydb/core/tx/schemeshard/ut_extsubdomain/ut_extsubdomain.cpp index 4737ccdddc6f..a3fa2fab987e 100644 --- a/ydb/core/tx/schemeshard/ut_extsubdomain/ut_extsubdomain.cpp +++ b/ydb/core/tx/schemeshard/ut_extsubdomain/ut_extsubdomain.cpp @@ -322,6 +322,114 @@ Y_UNIT_TEST_SUITE(TSchemeShardExtSubDomainTest) { NLs::UserAttrsEqual({{"user__attr_1", "value"}})}); } + Y_UNIT_TEST_FLAG(AlterWithPlainAlterSubdomain, AlterDatabaseCreateHiveFirst) { + TTestBasicRuntime runtime; + TTestEnv env(runtime, TTestEnvOptions().EnableAlterDatabaseCreateHiveFirst(AlterDatabaseCreateHiveFirst)); + ui64 txId = 100; + + // Create extsubdomain + + TestCreateExtSubDomain(runtime, ++txId, "/MyRoot", + R"(Name: "USER_0")" + ); + TestAlterExtSubDomain(runtime, ++txId, "/MyRoot", + R"( + Name: "USER_0" + ExternalSchemeShard: true + PlanResolution: 50 + Coordinators: 1 + Mediators: 1 + TimeCastBucketsPerMediator: 2 + StoragePools { + Name: "pool-1" + Kind: "hdd" + } + )" + ); + env.TestWaitNotification(runtime, {txId, txId - 1}); + + // Altering extsubdomain but with plain altersubdomain should succeed + // (post tenant migration compatibility) + + //NOTE: SubDomain and not ExtSubdomain + TestAlterSubDomain(runtime, ++txId, "/MyRoot", + R"( + Name: "USER_0" + ExternalSchemeShard: true + PlanResolution: 50 + Coordinators: 1 + Mediators: 1 + TimeCastBucketsPerMediator: 2 + StoragePools { + Name: "pool-1" + Kind: "hdd" + } + )" + ); + env.TestWaitNotification(runtime, txId); + } + + Y_UNIT_TEST_FLAG(AlterTwiceAndWithPlainAlterSubdomain, AlterDatabaseCreateHiveFirst) { + TTestBasicRuntime runtime; + TTestEnv env(runtime, TTestEnvOptions().EnableAlterDatabaseCreateHiveFirst(AlterDatabaseCreateHiveFirst)); + ui64 txId = 100; + + TestCreateExtSubDomain(runtime, ++txId, "/MyRoot", + R"(Name: "USER_0")" + ); + TestAlterExtSubDomain(runtime, ++txId, "/MyRoot", + R"( + Name: "USER_0" + ExternalSchemeShard: true + PlanResolution: 50 + Coordinators: 1 + Mediators: 1 + TimeCastBucketsPerMediator: 2 + StoragePools { + Name: "pool-1" + Kind: "hdd" + } + )" + ); + env.TestWaitNotification(runtime, {txId, txId - 1}); + + AsyncAlterExtSubDomain(runtime, ++txId, "/MyRoot", + R"( + Name: "USER_0" + ExternalSchemeShard: true + PlanResolution: 50 + Coordinators: 1 + Mediators: 1 + TimeCastBucketsPerMediator: 2 + StoragePools { + Name: "pool-1" + Kind: "hdd" + } + )" + ); + // TestModificationResults(runtime, txId, {NKikimrScheme::StatusAccepted}); + const auto firstAlterTxId = txId; + + //NOTE: SubDomain vs ExtSubDomain + TestAlterSubDomain(runtime, ++txId, "/MyRoot", + R"( + Name: "USER_0" + ExternalSchemeShard: true + PlanResolution: 50 + Coordinators: 1 + Mediators: 1 + TimeCastBucketsPerMediator: 2 + StoragePools { + Name: "pool-1" + Kind: "hdd" + } + )", + {{NKikimrScheme::StatusMultipleModifications}} + ); + + env.TestWaitNotification(runtime, firstAlterTxId); + } + Y_UNIT_TEST(CreateWithOnlyDotsNotAllowed) { TTestBasicRuntime runtime; TTestEnv env(runtime);