diff options
author | alexvru <alexvru@ydb.tech> | 2023-09-27 20:29:41 +0300 |
---|---|---|
committer | alexvru <alexvru@ydb.tech> | 2023-09-27 20:51:21 +0300 |
commit | 1382aaa536ee181ab2a358bf4cc0688f8e586b91 (patch) | |
tree | 890b4baf1e2362f90934ce9ef80422930824e8e3 | |
parent | fddb0f8c39b7d1913eb5161041eb3575aa5c29c6 (diff) | |
download | ydb-1382aaa536ee181ab2a358bf4cc0688f8e586b91.tar.gz |
BlobDepot tablet creation in domain KIKIMR-14867
-rw-r--r-- | ydb/core/mind/bscontroller/virtual_group.cpp | 72 | ||||
-rw-r--r-- | ydb/core/protos/blob_depot_config.proto | 4 |
2 files changed, 40 insertions, 36 deletions
diff --git a/ydb/core/mind/bscontroller/virtual_group.cpp b/ydb/core/mind/bscontroller/virtual_group.cpp index d60c6aa9d56..e6c98795004 100644 --- a/ydb/core/mind/bscontroller/virtual_group.cpp +++ b/ydb/core/mind/bscontroller/virtual_group.cpp @@ -409,7 +409,6 @@ namespace NKikimr::NBsController { TActorId HivePipeId; TActorId TenantHivePipeId; TActorId BlobDepotPipeId; - TActorId SchemeshardPipeId; ui64 RootHiveId = 0; bool TenantHiveInvalidated = false; bool TenantHiveInvalidateInProgress = false; @@ -443,9 +442,6 @@ namespace NKikimr::NBsController { Y_VERIFY(!group->HiveId); const TString& database = *group->Database; - // find schemeshard serving this database - ui64 schemeshardId = 0; - const auto& domainsInfo = AppData()->DomainsInfo; for (const auto& [_, domain] : domainsInfo->Domains) { const TString domainPath = TStringBuilder() << '/' << domain->Name; @@ -454,36 +450,34 @@ namespace NKikimr::NBsController { if (RootHiveId == TDomainsInfo::BadTabletId) { return CreateFailed(TStringBuilder() << "failed to resolve Hive -- BadTabletId for Database# " << database); } - schemeshardId = domain->SchemeRoot; break; } } - if (!schemeshardId) { - return CreateFailed(TStringBuilder() << "failed to resolve Hive -- Schemeshard not found for Database# " << database); - } - - Y_VERIFY(!SchemeshardPipeId); - SchemeshardPipeId = Register(NTabletPipe::CreateClient(SelfId(), schemeshardId, NTabletPipe::TClientRetryPolicy::WithRetries())); - NTabletPipe::SendData(SelfId(), SchemeshardPipeId, new NSchemeShard::TEvSchemeShard::TEvDescribeScheme(database)); + auto req = MakeHolder<NSchemeCache::TSchemeCacheNavigate>(); + auto& item = req->ResultSet.emplace_back(); + item.Path = NKikimr::SplitPath(database); + item.RedirectRequired = false; + item.Operation = NSchemeCache::TSchemeCacheNavigate::OpPath; + Send(MakeSchemeCacheID(), new TEvTxProxySchemeCache::TEvNavigateKeySet(req)); } - void Handle(NSchemeShard::TEvSchemeShard::TEvDescribeSchemeResult::TPtr ev) { - NTabletPipe::CloseAndForgetClient(SelfId(), SchemeshardPipeId); - const auto& record = ev->Get()->GetRecord(); - STLOG(PRI_DEBUG, BS_CONTROLLER, BSCVG16, "TEvDescribeSchemeResult", (GroupId, GroupId), (Record, record)); - if (record.GetStatus() != NKikimrScheme::StatusSuccess) { - return CreateFailed(TStringBuilder() << "failed to resolve Hive -- Status# " - << NKikimrScheme::EStatus_Name(record.GetStatus()) << " Reason# " << record.GetReason()); - } else if (!record.HasPathDescription()) { - return CreateFailed("failed to resolve Hive -- no PathDescription in TEvDescribeSchemeResult"); - } else if (const auto& path = record.GetPathDescription(); !path.HasDomainDescription()) { - return CreateFailed("failed to resolve Hive -- database path is not a domain"); - } else if (const auto& domain = path.GetDomainDescription(); !domain.HasProcessingParams()) { - return CreateFailed("failed to resolve Hive -- no ProcessingParams in TEvDescribeSchemeResult"); - } else if (const auto& params = domain.GetProcessingParams(); !params.HasHive() && !RootHiveId) { - return CreateFailed("failed to resolve Hive -- no Hive in TEvDescribeSchemeResult"); + void Handle(TEvTxProxySchemeCache::TEvNavigateKeySetResult::TPtr ev) { + auto& response = *ev->Get()->Request; + Y_VERIFY(response.ResultSet.size() == 1); + auto& item = response.ResultSet.front(); + auto& domainInfo = item.DomainInfo; + + STLOG(PRI_DEBUG, BS_CONTROLLER, BSCVG16, "TEvDescribeSchemeResult", (GroupId, GroupId), + (Result, response.ToString(*AppData()->TypeRegistry))); + + if (item.Status != NSchemeCache::TSchemeCacheNavigate::EStatus::Ok || !domainInfo || !item.DomainDescription) { + return CreateFailed(TStringBuilder() << "failed to resolve Hive -- erroneous reply from SchemeCache or not a domain"); + } else if (const auto& params = domainInfo->Params; !params.HasHive() && !RootHiveId) { + return CreateFailed("failed to resolve Hive -- no Hive in SchemeCache reply"); } else { + auto& domain = item.DomainDescription->Description; + THashSet<std::tuple<TString, TString>> storagePools; // name, kind THashSet<TString> storagePoolNames; for (const auto& item : domain.GetStoragePools()) { @@ -513,11 +507,14 @@ namespace NKikimr::NBsController { return CreateFailed("failed to resolve Hive -- Hive is zero"); } + auto descr = item.DomainDescription; + Self->Execute(std::make_unique<TTxUpdateGroup>(this, [=](TGroupInfo& group, TConfigState&) { auto& config = GetConfig(&group); if (hiveId != RootHiveId) { config.SetTenantHiveId(hiveId); } + config.MutableHiveParams()->MutableObjectDomain()->CopyFrom(descr->Description.GetDomainKey()); TString data; const bool success = config.SerializeToString(&data); Y_VERIFY(success); @@ -529,10 +526,17 @@ namespace NKikimr::NBsController { } void HiveCreateTablet(TGroupInfo *group) { - auto ev = std::make_unique<TEvHive::TEvCreateTablet>(Self->TabletID(), group->ID, TTabletTypes::BlobDepot, - TChannelsBindings()); + auto ev = std::make_unique<TEvHive::TEvCreateTablet>(); auto& config = GetConfig(group); + if (config.HasHiveParams()) { + ev->Record.CopyFrom(config.GetHiveParams()); + } + ev->Record.SetOwner(Self->TabletID()); + ev->Record.SetOwnerIdx(GroupId); + ev->Record.SetTabletType(TTabletTypes::BlobDepot); + ev->Record.ClearBindedChannels(); + for (const auto& item : config.GetChannelProfiles()) { const TString& storagePoolName = item.GetStoragePoolName(); NKikimrStoragePool::TChannelBind binding; @@ -598,7 +602,7 @@ namespace NKikimr::NBsController { void Handle(TEvTabletPipe::TEvClientConnected::TPtr ev) { STLOG(PRI_DEBUG, BS_CONTROLLER, BSCVG02, "received TEvClientConnected", (GroupId, GroupId), (Status, ev->Get()->Status), (ClientId, ev->Get()->ClientId), (HivePipeId, HivePipeId), - (BlobDepotPipeId, BlobDepotPipeId), (SchemeshardPipeId, SchemeshardPipeId)); + (BlobDepotPipeId, BlobDepotPipeId)); if (ev->Get()->Status != NKikimrProto::OK) { OnPipeError(ev->Get()->ClientId); @@ -619,14 +623,13 @@ namespace NKikimr::NBsController { void Handle(TEvTabletPipe::TEvClientDestroyed::TPtr ev) { STLOG(PRI_DEBUG, BS_CONTROLLER, BSCVG03, "received TEvClientDestroyed", (GroupId, GroupId), - (ClientId, ev->Get()->ClientId), (HivePipeId, HivePipeId), (BlobDepotPipeId, BlobDepotPipeId), - (SchemeshardPipeId, SchemeshardPipeId)); + (ClientId, ev->Get()->ClientId), (HivePipeId, HivePipeId), (BlobDepotPipeId, BlobDepotPipeId)); OnPipeError(ev->Get()->ClientId); } void OnPipeError(TActorId clientId) { - for (auto *pipeId : {&HivePipeId, &TenantHivePipeId, &BlobDepotPipeId, &SchemeshardPipeId}) { + for (auto *pipeId : {&HivePipeId, &TenantHivePipeId, &BlobDepotPipeId}) { if (*pipeId == clientId) { *pipeId = {}; Bootstrap(); @@ -777,7 +780,6 @@ namespace NKikimr::NBsController { NTabletPipe::CloseClient(SelfId(), HivePipeId); NTabletPipe::CloseClient(SelfId(), BlobDepotPipeId); - NTabletPipe::CloseClient(SelfId(), SchemeshardPipeId); TActorBootstrapped::PassAway(); } @@ -791,7 +793,7 @@ namespace NKikimr::NBsController { cFunc(TEvents::TSystem::Bootstrap, Bootstrap); hFunc(TEvTabletPipe::TEvClientConnected, Handle); hFunc(TEvTabletPipe::TEvClientDestroyed, Handle); - hFunc(NSchemeShard::TEvSchemeShard::TEvDescribeSchemeResult, Handle); + hFunc(TEvTxProxySchemeCache::TEvNavigateKeySetResult, Handle); hFunc(TEvHive::TEvCreateTabletReply, Handle); hFunc(TEvHive::TEvTabletCreationResult, Handle); hFunc(TEvHive::TEvInvalidateStoragePoolsReply, Handle); diff --git a/ydb/core/protos/blob_depot_config.proto b/ydb/core/protos/blob_depot_config.proto index a6f46dbd82a..51b64d84943 100644 --- a/ydb/core/protos/blob_depot_config.proto +++ b/ydb/core/protos/blob_depot_config.proto @@ -1,3 +1,5 @@ +import "ydb/core/protos/hive.proto"; + package NKikimrBlobDepot; message TChannelKind { @@ -21,6 +23,6 @@ message TBlobDepotConfig { optional bool IsDecommittingGroup = 3; optional uint64 TabletId = 4; optional bool HiveContacted = 5; - reserved 6; // optional NKikimrHive.TEvCreateTablet HiveParams = 6; // extra hive parameters + optional NKikimrHive.TEvCreateTablet HiveParams = 6; // extra hive parameters optional uint64 TenantHiveId = 7; } |