diff options
author | alexvru <alexvru@ydb.tech> | 2023-05-22 19:18:45 +0300 |
---|---|---|
committer | alexvru <alexvru@ydb.tech> | 2023-05-22 19:18:45 +0300 |
commit | 7a2f5cd02629fd9ba4332c870229c0760b8499d1 (patch) | |
tree | e9893d8e3f40d1f925f48179e0bb02325ab16417 | |
parent | 96fc286011395f6892487dc43bacf5ae889c9a8a (diff) | |
download | ydb-7a2f5cd02629fd9ba4332c870229c0760b8499d1.tar.gz |
Support database designation when operating virtual groups
-rw-r--r-- | ydb/apps/dstool/lib/commands.py | 5 | ||||
-rw-r--r-- | ydb/apps/dstool/lib/dstool_cmd_group_decommit.py | 9 | ||||
-rw-r--r-- | ydb/apps/dstool/lib/dstool_cmd_group_virtual_cancel.py | 15 | ||||
-rw-r--r-- | ydb/apps/dstool/lib/dstool_cmd_group_virtual_create.py | 9 | ||||
-rw-r--r-- | ydb/core/mind/bscontroller/bsc.cpp | 4 | ||||
-rw-r--r-- | ydb/core/mind/bscontroller/impl.h | 3 | ||||
-rw-r--r-- | ydb/core/mind/bscontroller/load_everything.cpp | 1 | ||||
-rw-r--r-- | ydb/core/mind/bscontroller/scheme.h | 3 | ||||
-rw-r--r-- | ydb/core/mind/bscontroller/virtual_group.cpp | 97 | ||||
-rw-r--r-- | ydb/core/protos/blobstorage_config.proto | 10 |
10 files changed, 127 insertions, 29 deletions
diff --git a/ydb/apps/dstool/lib/commands.py b/ydb/apps/dstool/lib/commands.py index 54124336d0..015f2e35f2 100644 --- a/ydb/apps/dstool/lib/commands.py +++ b/ydb/apps/dstool/lib/commands.py @@ -19,6 +19,7 @@ import ydb.apps.dstool.lib.dstool_cmd_group_show_usage_by_tablets as group_show_ import ydb.apps.dstool.lib.dstool_cmd_group_state as group_state import ydb.apps.dstool.lib.dstool_cmd_group_take_snapshot as group_take_snapshot import ydb.apps.dstool.lib.dstool_cmd_group_virtual_create as group_virtual_create +import ydb.apps.dstool.lib.dstool_cmd_group_virtual_cancel as group_virtual_cancel import ydb.apps.dstool.lib.dstool_cmd_pool_create_virtual as pool_create_virtual import ydb.apps.dstool.lib.dstool_cmd_pool_list as pool_list @@ -43,7 +44,7 @@ modules = [ node_list, box_list, pool_list, pool_create_virtual, - group_check, group_decommit, group_show_blob_info, group_show_usage_by_tablets, group_state, group_take_snapshot, group_add, group_list, group_virtual_create, + group_check, group_decommit, group_show_blob_info, group_show_usage_by_tablets, group_state, group_take_snapshot, group_add, group_list, group_virtual_create, group_virtual_cancel, pdisk_add_by_serial, pdisk_remove_by_serial, pdisk_set, pdisk_list, vdisk_remove_donor, vdisk_evict, vdisk_list, vdisk_wipe, device_list, @@ -53,7 +54,7 @@ default_structure = [ ('device', ['list']), ('pdisk', ['add-by-serial', 'remove-by-serial', 'set', 'list']), ('vdisk', ['evict', 'remove-donor', 'wipe', 'list']), - ('group', ['add', 'check', 'decommit', ('show', ['blob-info', 'usage-by-tablets']), 'state', 'take-snapshot', 'list', ('virtual', ['create'])]), + ('group', ['add', 'check', 'decommit', ('show', ['blob-info', 'usage-by-tablets']), 'state', 'take-snapshot', 'list', ('virtual', ['create', 'cancel'])]), ('pool', ['list', ('create', ['virtual'])]), ('box', ['list']), ('node', ['list']), diff --git a/ydb/apps/dstool/lib/dstool_cmd_group_decommit.py b/ydb/apps/dstool/lib/dstool_cmd_group_decommit.py index c3f09787a9..57f558f988 100644 --- a/ydb/apps/dstool/lib/dstool_cmd_group_decommit.py +++ b/ydb/apps/dstool/lib/dstool_cmd_group_decommit.py @@ -7,7 +7,9 @@ description = 'Decommit physical group' def add_options(p): common.add_group_ids_option(p, required=True) - p.add_argument('--hive-id', type=int, required=True, help='tablet id of containing hive') + g = p.add_mutually_exclusive_group(required=True) + g.add_argument('--hive-id', type=int, help='tablet id of containing hive') + g.add_argument('--database', type=str, help='database path of containing hive') p.add_argument('--log-channel-sp', type=str, metavar='POOL_NAME', help='channel 0 specifier') p.add_argument('--snapshot-channel-sp', type=str, metavar='POOL_NAME', help='channel 1 specifier (defaults to channel 0)') p.add_argument('--data-channel-sp', type=str, metavar='POOL_NAME[*COUNT]', nargs='*', help='data channel specifier') @@ -17,7 +19,10 @@ def do(args): request = common.create_bsc_request(args) cmd = request.Command.add().DecommitGroups cmd.GroupIds.extend(args.group_ids) - cmd.HiveId = args.hive_id + if args.hive_id is not None: + cmd.HiveId = args.hive_id + if args.database is not None: + cmd.Database = args.database if args.log_channel_sp or args.snapshot_channel_sp or args.data_channel_sp: if args.log_channel_sp is None: diff --git a/ydb/apps/dstool/lib/dstool_cmd_group_virtual_cancel.py b/ydb/apps/dstool/lib/dstool_cmd_group_virtual_cancel.py new file mode 100644 index 0000000000..68ac4b878d --- /dev/null +++ b/ydb/apps/dstool/lib/dstool_cmd_group_virtual_cancel.py @@ -0,0 +1,15 @@ +import ydb.apps.dstool.lib.common as common + +description = 'Cancel virtual group creation/decommission' + + +def add_options(p): + p.add_argument('--group-id', type=int, required=True, help='group id to cancel') + + +def do(args): + request = common.create_bsc_request(args) + cmd = request.Command.add().CancelVirtualGroup + cmd.GroupId = args.group_id + response = common.invoke_bsc_request(request) + common.print_request_result(args, request, response) diff --git a/ydb/apps/dstool/lib/dstool_cmd_group_virtual_create.py b/ydb/apps/dstool/lib/dstool_cmd_group_virtual_create.py index b805997208..bf59e87395 100644 --- a/ydb/apps/dstool/lib/dstool_cmd_group_virtual_create.py +++ b/ydb/apps/dstool/lib/dstool_cmd_group_virtual_create.py @@ -8,7 +8,9 @@ description = 'Create virtual group backed by BlobDepot' def add_options(p): p.add_argument('--name', type=str, required=True, nargs='+', help='cluster-unique name(s) of newly created virtual groups') - p.add_argument('--hive-id', type=int, required=True, help='tablet id of containing hive') + g = p.add_mutually_exclusive_group(required=True) + g.add_argument('--hive-id', type=int, help='tablet id of containing hive') + g.add_argument('--database', type=str, help='database path of containing hive') g = p.add_mutually_exclusive_group(required=True) g.add_argument('--storage-pool-name', type=str, metavar='POOL_NAME', help='name of the containing storage pool') g.add_argument('--storage-pool-id', type=str, metavar='BOX:POOL', help='id of the cotaining storage pool') @@ -24,7 +26,10 @@ def do(args): cmd = request.Command.add().AllocateVirtualGroup cmd.Name = name - cmd.HiveId = args.hive_id + if args.hive_id is not None: + cmd.HiveId = args.hive_id + if args.database is not None: + cmd.Database = args.database if args.storage_pool_name is not None: cmd.StoragePoolName = args.storage_pool_name diff --git a/ydb/core/mind/bscontroller/bsc.cpp b/ydb/core/mind/bscontroller/bsc.cpp index ac81e4c86e..921aa99ce8 100644 --- a/ydb/core/mind/bscontroller/bsc.cpp +++ b/ydb/core/mind/bscontroller/bsc.cpp @@ -60,8 +60,8 @@ TBlobStorageController::TVSlotInfo::TVSlotInfo(TVSlotId vSlotId, TPDiskInfo *pdi void TBlobStorageController::TGroupInfo::CalculateGroupStatus() { Status = {NKikimrBlobStorage::TGroupStatus::FULL, NKikimrBlobStorage::TGroupStatus::FULL}; - if (VirtualGroupState == NKikimrBlobStorage::EVirtualGroupState::CREATE_FAILED || - (VirtualGroupState == NKikimrBlobStorage::EVirtualGroupState::NEW && VDisksInGroup.empty())) { + if ((VirtualGroupState == NKikimrBlobStorage::EVirtualGroupState::CREATE_FAILED || + VirtualGroupState == NKikimrBlobStorage::EVirtualGroupState::NEW) && VDisksInGroup.empty()) { Status.MakeWorst(NKikimrBlobStorage::TGroupStatus::DISINTEGRATED, NKikimrBlobStorage::TGroupStatus::DISINTEGRATED); } diff --git a/ydb/core/mind/bscontroller/impl.h b/ydb/core/mind/bscontroller/impl.h index 590df0efcc..fc18b4774d 100644 --- a/ydb/core/mind/bscontroller/impl.h +++ b/ydb/core/mind/bscontroller/impl.h @@ -535,6 +535,7 @@ public: TMaybe<Table::VirtualGroupName::Type> VirtualGroupName; TMaybe<Table::VirtualGroupState::Type> VirtualGroupState; TMaybe<Table::HiveId::Type> HiveId; + TMaybe<Table::Database::Type> Database; TMaybe<Table::BlobDepotConfig::Type> BlobDepotConfig; TMaybe<Table::BlobDepotId::Type> BlobDepotId; TMaybe<Table::ErrorReason::Type> ErrorReason; @@ -605,6 +606,7 @@ public: Table::VirtualGroupName, Table::VirtualGroupState, Table::HiveId, + Table::Database, Table::BlobDepotConfig, Table::BlobDepotId, Table::ErrorReason, @@ -626,6 +628,7 @@ public: &TGroupInfo::VirtualGroupName, &TGroupInfo::VirtualGroupState, &TGroupInfo::HiveId, + &TGroupInfo::Database, &TGroupInfo::BlobDepotConfig, &TGroupInfo::BlobDepotId, &TGroupInfo::ErrorReason, diff --git a/ydb/core/mind/bscontroller/load_everything.cpp b/ydb/core/mind/bscontroller/load_everything.cpp index 98460d07bf..41580b628c 100644 --- a/ydb/core/mind/bscontroller/load_everything.cpp +++ b/ydb/core/mind/bscontroller/load_everything.cpp @@ -212,6 +212,7 @@ public: OPTIONAL(VirtualGroupName) OPTIONAL(VirtualGroupState) OPTIONAL(HiveId) + OPTIONAL(Database) OPTIONAL(BlobDepotConfig) OPTIONAL(BlobDepotId) OPTIONAL(ErrorReason) diff --git a/ydb/core/mind/bscontroller/scheme.h b/ydb/core/mind/bscontroller/scheme.h index f6d0957a2b..94027bcf63 100644 --- a/ydb/core/mind/bscontroller/scheme.h +++ b/ydb/core/mind/bscontroller/scheme.h @@ -67,6 +67,7 @@ struct Schema : NIceDb::Schema { struct VirtualGroupName : Column<112, NScheme::NTypeIds::Utf8> {}; // unique name of the virtual group struct VirtualGroupState : Column<102, NScheme::NTypeIds::Uint32> { using Type = NKikimrBlobStorage::EVirtualGroupState; }; struct HiveId : Column<113, NScheme::NTypeIds::Uint64> {}; // hive id for this vg + struct Database : Column<120, NScheme::NTypeIds::String> {}; // database path struct BlobDepotConfig : Column<106, NScheme::NTypeIds::String> {}; // serialized blob depot config protobuf struct BlobDepotId : Column<109, NScheme::NTypeIds::Uint64> {}; // created blobdepot tablet id struct ErrorReason : Column<110, NScheme::NTypeIds::Utf8> {}; // creation error reason @@ -76,7 +77,7 @@ struct Schema : NIceDb::Schema { using TKey = TableKey<ID>; using TColumns = TableColumns<ID, Generation, ErasureSpecies, Owner, DesiredPDiskCategory, DesiredVDiskCategory, EncryptionMode, LifeCyclePhase, MainKeyId, EncryptedGroupKey, GroupKeyNonce, MainKeyVersion, Down, - SeenOperational, DecommitStatus, VirtualGroupName, VirtualGroupState, HiveId, BlobDepotConfig, + SeenOperational, DecommitStatus, VirtualGroupName, VirtualGroupState, HiveId, Database, BlobDepotConfig, BlobDepotId, ErrorReason, NeedAlter, Metrics>; }; diff --git a/ydb/core/mind/bscontroller/virtual_group.cpp b/ydb/core/mind/bscontroller/virtual_group.cpp index c8250fd328..01ba6e1337 100644 --- a/ydb/core/mind/bscontroller/virtual_group.cpp +++ b/ydb/core/mind/bscontroller/virtual_group.cpp @@ -6,8 +6,8 @@ namespace NKikimr::NBsController { void TBlobStorageController::TConfigState::ExecuteStep(const NKikimrBlobStorage::TAllocateVirtualGroup& cmd, TStatus& status) { if (!cmd.GetName()) { throw TExError() << "TAllocateVirtualGroup.Name must be set and be nonempty"; - } else if (!cmd.GetHiveId()) { - throw TExError() << "TAllocateVirtualGroup.HiveId is not specified"; + } else if (cmd.GetHiveDesignatorCase() == NKikimrBlobStorage::TAllocateVirtualGroup::HIVEDESIGNATOR_NOT_SET) { + throw TExError() << "TAllocateVirtualGroup.HiveId/Database is not specified"; } // make sure the operation is idempotent @@ -77,7 +77,8 @@ namespace NKikimr::NBsController { group->VirtualGroupName = cmd.GetName(); group->VirtualGroupState = NKikimrBlobStorage::EVirtualGroupState::NEW; - group->HiveId = cmd.GetHiveId(); + group->HiveId = cmd.HasHiveId() ? MakeMaybe(cmd.GetHiveId()) : Nothing(); + group->Database = cmd.HasDatabase() ? MakeMaybe(cmd.GetDatabase()) : Nothing(); group->NeedAlter = true; if (cmd.GetBlobDepotId()) { @@ -99,8 +100,8 @@ namespace NKikimr::NBsController { } void TBlobStorageController::TConfigState::ExecuteStep(const NKikimrBlobStorage::TDecommitGroups& cmd, TStatus& /*status*/) { - if (!cmd.GetHiveId()) { - throw TExError() << "TDecommitGroups.HiveId is not specified"; + if (cmd.GetHiveDesignatorCase() == NKikimrBlobStorage::TDecommitGroups::HIVEDESIGNATOR_NOT_SET) { + throw TExError() << "TDecommitGroups.HiveId/Database is not specified"; } for (const TGroupId groupId : cmd.GetGroupIds()) { @@ -108,8 +109,12 @@ namespace NKikimr::NBsController { if (!group) { throw TExGroupNotFound(groupId); } else if (group->DecommitStatus != NKikimrBlobStorage::TGroupDecommitStatus::NONE) { - if (group->HiveId != cmd.GetHiveId()) { + if (cmd.HasHiveId() && group->HiveId && *group->HiveId != cmd.GetHiveId()) { throw TExError() << "different hive specified for decommitting group" << TErrorParams::GroupId(groupId); + } else if (cmd.HasDatabase() && group->Database && *group->Database != cmd.GetDatabase()) { + throw TExError() << "different database specified for decommitting group" << TErrorParams::GroupId(groupId); + } else if (cmd.HasHiveId() != group->HiveId.Defined() && cmd.HasDatabase() != group->Database.Defined()) { + throw TExError() << "different hive designator specified for decommitting group" << TErrorParams::GroupId(groupId); } // group is already being decommitted -- make this operation idempotent continue; @@ -119,7 +124,8 @@ namespace NKikimr::NBsController { group->DecommitStatus = NKikimrBlobStorage::TGroupDecommitStatus::PENDING; group->VirtualGroupState = NKikimrBlobStorage::EVirtualGroupState::NEW; - group->HiveId = cmd.GetHiveId(); + group->HiveId = cmd.HasHiveId() ? MakeMaybe(cmd.GetHiveId()) : Nothing(); + group->Database = cmd.HasDatabase() ? MakeMaybe(cmd.GetDatabase()) : Nothing(); group->NeedAlter = true; group->CalculateGroupStatus(); @@ -345,6 +351,8 @@ namespace NKikimr::NBsController { auto& config = GetConfig(group); if (config.HasTabletId()) { ConfigureBlobDepot(); + } else if (!group->HiveId) { + HiveResolve(group); } else if (HivePipeId) { HiveCreateTablet(group); } else { @@ -353,6 +361,56 @@ namespace NKikimr::NBsController { } } + void HiveResolve(TGroupInfo *group) { + Y_VERIFY(group->Database); + Y_VERIFY(!group->HiveId); + const TString& database = *group->Database; + const auto& domainsInfo = AppData()->DomainsInfo; + if (auto *domain = domainsInfo->GetDomainByName(database)) { + const ui64 hiveId = domainsInfo->GetHive(domain->DefaultHiveUid); + if (hiveId == TDomainsInfo::BadTabletId) { + return CreateFailed(TStringBuilder() << "failed to resolve Hive -- BadTabletId for Database# " << database); + } + Self->Execute(std::make_unique<TTxUpdateGroup>(this, [hiveId](TGroupInfo& group) { + group.HiveId = hiveId; + return true; + })); + } else { + auto request = std::make_unique<NSchemeCache::TSchemeCacheNavigate>(); + auto& item = request->ResultSet.emplace_back(); + item.Path = SplitPath(database); + item.Operation = NSchemeCache::TSchemeCacheNavigate::OpPath; + item.RedirectRequired = false; + Send(MakeSchemeCacheID(), new TEvTxProxySchemeCache::TEvNavigateKeySet(request.release())); + } + } + + void Handle(TEvTxProxySchemeCache::TEvNavigateKeySetResult::TPtr ev) { + auto& result = *ev->Get()->Request; + STLOG(PRI_DEBUG, BS_CONTROLLER, BSCVG16, "TEvNavigateKeySetResult", (TabletId, Self->TabletID()), + (GroupId, GroupId), (Result, result.ToString(*AppData()->TypeRegistry))); + if (result.ResultSet.size() != 1) { + return CreateFailed(TStringBuilder() << "failed to resolve Hive -- incorrect reply from SchemeCache"); + } + auto& item = result.ResultSet.front(); + if (item.Status != NSchemeCache::TSchemeCacheNavigate::EStatus::Ok) { + return CreateFailed(TStringBuilder() << "failed to resolve Hive -- error while resolving database Status# " << item.Status); + } else if (!item.DomainInfo) { + return CreateFailed(TStringBuilder() << "failed to resolve Hive -- no DomainInfo in NavigateKeySetResult"); + } + const auto& params = item.DomainInfo->Params; + if (!params.HasHive()) { + return CreateFailed(TStringBuilder() << "failed to resolve Hive -- no Hive field in ProcessingParams"); + } else if (const ui64 hiveId = params.GetHive()) { + Self->Execute(std::make_unique<TTxUpdateGroup>(this, [hiveId](TGroupInfo& group) { + group.HiveId = hiveId; + return true; + })); + } else { + return CreateFailed(TStringBuilder() << "failed to resolve Hive -- zero Hive value in ProcessingParams"); + } + } + void HiveCreateTablet(TGroupInfo *group) { TChannelsBindings bindings; std::unordered_set<TString> names; @@ -393,9 +451,7 @@ namespace NKikimr::NBsController { void HiveDelete(TGroupInfo *group) { auto& config = GetConfig(group); - Y_VERIFY(group->HiveId); - - if (!config.GetHiveContacted()) { + if (!config.GetHiveContacted() || !group->HiveId) { // hive has never been contacted, so there is no possibility this tablet was created Y_VERIFY(!config.HasTabletId()); return DeleteBlobDepot(); @@ -481,17 +537,21 @@ namespace NKikimr::NBsController { config.SetTabletId(tabletId); }); } else { - Self->Execute(std::make_unique<TTxUpdateGroup>(this, [&](TGroupInfo& group) { - group.VirtualGroupState = NKikimrBlobStorage::EVirtualGroupState::CREATE_FAILED; - group.NeedAlter = false; - group.ErrorReason = TStringBuilder() << "failed to create BlobDepot tablet" - << " Reason# " << NKikimrHive::EErrorReason_Name(record.GetErrorReason()) - << " Status# " << NKikimrProto::EReplyStatus_Name(record.GetStatus()); - return true; - })); + CreateFailed(TStringBuilder() << "failed to create BlobDepot tablet" + << " Reason# " << NKikimrHive::EErrorReason_Name(record.GetErrorReason()) + << " Status# " << NKikimrProto::EReplyStatus_Name(record.GetStatus())); } } + void CreateFailed(const TString& error) { + Self->Execute(std::make_unique<TTxUpdateGroup>(this, [=](TGroupInfo& group) { + group.VirtualGroupState = NKikimrBlobStorage::EVirtualGroupState::CREATE_FAILED; + group.NeedAlter = false; + group.ErrorReason = error; + return true; + })); + } + void Handle(TEvHive::TEvTabletCreationResult::TPtr ev) { STLOG(PRI_INFO, BS_CONTROLLER, BSCVG05, "received TEvTabletCreationResult", (TabletId, Self->TabletID()), (Msg, ev->Get()->Record)); @@ -590,6 +650,7 @@ namespace NKikimr::NBsController { cFunc(TEvents::TSystem::Bootstrap, Bootstrap); hFunc(TEvTabletPipe::TEvClientConnected, Handle); hFunc(TEvTabletPipe::TEvClientDestroyed, Handle); + hFunc(TEvTxProxySchemeCache::TEvNavigateKeySetResult, Handle); hFunc(TEvHive::TEvCreateTabletReply, Handle); hFunc(TEvHive::TEvTabletCreationResult, Handle); hFunc(TEvHive::TEvInvalidateStoragePoolsReply, Handle); diff --git a/ydb/core/protos/blobstorage_config.proto b/ydb/core/protos/blobstorage_config.proto index 9fa6ef2c8b..6e0e8c5b4a 100644 --- a/ydb/core/protos/blobstorage_config.proto +++ b/ydb/core/protos/blobstorage_config.proto @@ -477,7 +477,10 @@ message TBoxStoragePoolId { message TAllocateVirtualGroup { string Name = 1; - uint64 HiveId = 2; + oneof HiveDesignator { + uint64 HiveId = 2; + string Database = 7; + } oneof StoragePool { string StoragePoolName = 3; TBoxStoragePoolId StoragePoolId = 4; @@ -488,7 +491,10 @@ message TAllocateVirtualGroup { message TDecommitGroups { repeated uint32 GroupIds = 1; // group ids to decommit - uint64 HiveId = 2; // hive under which it is required to create blob depot tablets + oneof HiveDesignator { + uint64 HiveId = 2; // hive under which it is required to create blob depot tablets + string Database = 4; // database path + } repeated NKikimrBlobDepot.TChannelProfile ChannelProfiles = 3; // where to store decommitted groups' data } |