aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authoralexvru <alexvru@ydb.tech>2023-05-22 19:18:45 +0300
committeralexvru <alexvru@ydb.tech>2023-05-22 19:18:45 +0300
commit7a2f5cd02629fd9ba4332c870229c0760b8499d1 (patch)
treee9893d8e3f40d1f925f48179e0bb02325ab16417
parent96fc286011395f6892487dc43bacf5ae889c9a8a (diff)
downloadydb-7a2f5cd02629fd9ba4332c870229c0760b8499d1.tar.gz
Support database designation when operating virtual groups
-rw-r--r--ydb/apps/dstool/lib/commands.py5
-rw-r--r--ydb/apps/dstool/lib/dstool_cmd_group_decommit.py9
-rw-r--r--ydb/apps/dstool/lib/dstool_cmd_group_virtual_cancel.py15
-rw-r--r--ydb/apps/dstool/lib/dstool_cmd_group_virtual_create.py9
-rw-r--r--ydb/core/mind/bscontroller/bsc.cpp4
-rw-r--r--ydb/core/mind/bscontroller/impl.h3
-rw-r--r--ydb/core/mind/bscontroller/load_everything.cpp1
-rw-r--r--ydb/core/mind/bscontroller/scheme.h3
-rw-r--r--ydb/core/mind/bscontroller/virtual_group.cpp97
-rw-r--r--ydb/core/protos/blobstorage_config.proto10
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
}