diff options
author | Alexander Rutkovsky <[email protected]> | 2022-05-25 18:27:04 +0300 |
---|---|---|
committer | Alexander Rutkovsky <[email protected]> | 2022-05-25 18:27:04 +0300 |
commit | 10ee71fe578e9241b1e9198ef9467a7e5ca59b9f (patch) | |
tree | a4726973148496cc662dd523487ed4d939096324 | |
parent | e7acefb866b1faa124f0ff769c0d81188dc96598 (diff) |
Refactor TGroupID to support virtual group ids KIKIMR-14867
ref:5908ae9973c5f28ec8c103f8578ca8301cd0928f
-rw-r--r-- | ydb/core/base/blobstorage.h | 153 | ||||
-rw-r--r-- | ydb/core/blobstorage/nodewarden/blobstorage_node_warden_ut.cpp | 2 | ||||
-rw-r--r-- | ydb/core/blobstorage/nodewarden/node_warden_group.cpp | 4 | ||||
-rw-r--r-- | ydb/core/blobstorage/nodewarden/node_warden_pipe.cpp | 2 | ||||
-rw-r--r-- | ydb/core/blobstorage/nodewarden/node_warden_proxy.cpp | 2 | ||||
-rw-r--r-- | ydb/core/blobstorage/nodewarden/node_warden_vdisk.cpp | 4 | ||||
-rw-r--r-- | ydb/core/blobstorage/pdisk/blobstorage_pdisk_state.h | 4 | ||||
-rw-r--r-- | ydb/core/cms/cluster_info.h | 4 | ||||
-rw-r--r-- | ydb/core/health_check/health_check.cpp | 2 | ||||
-rw-r--r-- | ydb/core/mind/bscontroller/bsc.cpp | 19 | ||||
-rw-r--r-- | ydb/core/mind/bscontroller/config_fit_groups.cpp | 2 | ||||
-rw-r--r-- | ydb/core/mind/bscontroller/propose_group_key.cpp | 2 | ||||
-rw-r--r-- | ydb/core/mind/ut_fat/blobstorage_node_warden_ut_fat.cpp | 2 |
13 files changed, 99 insertions, 103 deletions
diff --git a/ydb/core/base/blobstorage.h b/ydb/core/base/blobstorage.h index 105d4399a78..91b972396f8 100644 --- a/ydb/core/base/blobstorage.h +++ b/ydb/core/base/blobstorage.h @@ -88,104 +88,109 @@ NKikimrBlobStorage::EPDiskType PDiskTypeToPDiskType(const TPDiskCategory::EDevic TPDiskCategory::EDeviceType PDiskTypeToPDiskType(const NKikimrBlobStorage::EPDiskType type); -enum EGroupConfigurationType { - GroupConfigurationTypeStatic = 0, - GroupConfigurationTypeDynamic = 1 +enum class EGroupConfigurationType : ui32 { + Static = 0, + Dynamic = 1, + Virtual = 2, }; struct TGroupID { - TGroupID() { Set((EGroupConfigurationType)0x1, 0x3f, InvalidLocalId); } + TGroupID() = default; + TGroupID(const TGroupID&) = default; + TGroupID(EGroupConfigurationType configurationType, ui32 dataCenterId, ui32 groupLocalId) { Set(configurationType, dataCenterId, groupLocalId); } - TGroupID(const TGroupID& group) { Raw.X = group.GetRaw(); } - explicit TGroupID(ui32 raw) { Raw.X = raw; } - EGroupConfigurationType ConfigurationType() const { return (EGroupConfigurationType)Raw.N.ConfigurationType; } - ui32 AvailabilityDomainID() const { return Raw.N.AvailabilityDomainID; } - ui32 GroupLocalID() const { return Raw.N.GroupLocalID; } - ui32 GetRaw() const { return Raw.X; } - bool operator==(const TGroupID &x) const { return GetRaw() == x.GetRaw(); } - bool operator!=(const TGroupID &x) const { return GetRaw() != x.GetRaw(); } - - TGroupID operator++() { + + explicit TGroupID(ui32 raw) + : Raw(raw) + {} + + EGroupConfigurationType ConfigurationType() const { + const auto type = static_cast<EGroupConfigurationType>(Raw >> TypeShift & TypeMask); + if (type == EGroupConfigurationType::Static) { + return type; + } else { + const ui32 domainId = Raw >> DomainShift & DomainMask; + return domainId == VirtualGroupDomain + ? EGroupConfigurationType::Virtual + : EGroupConfigurationType::Dynamic; + } + } + + ui32 AvailabilityDomainID() const { + const auto type = static_cast<EGroupConfigurationType>(Raw >> TypeShift & TypeMask); + const ui32 domainId = Raw >> DomainShift & DomainMask; + return type == EGroupConfigurationType::Static ? domainId : + domainId == VirtualGroupDomain ? 1 : + domainId; + } + + ui32 GroupLocalID() const { + return Raw & GroupMask; + } + + ui32 GetRaw() const { + return Raw; + } + + friend bool operator ==(const TGroupID& x, const TGroupID& y) { return x.Raw == y.Raw; } + friend bool operator !=(const TGroupID& x, const TGroupID& y) { return x.Raw != y.Raw; } + + TGroupID& operator++() { Set(ConfigurationType(), AvailabilityDomainID(), NextValidLocalId()); return *this; } + TGroupID operator++(int) { TGroupID old(*this); - ++(*this); + ++*this; return old; } TString ToString() const; + private: - union { - struct { - ui32 GroupLocalID : 25; - ui32 AvailabilityDomainID : 6; - ui32 ConfigurationType : 1; - } N; + static constexpr ui32 TypeWidth = 1; + static constexpr ui32 TypeMask = (1 << TypeWidth) - 1; + static constexpr ui32 TypeShift = 32 - TypeWidth; - ui32 X; - } Raw; + static constexpr ui32 DomainWidth = 6; + static constexpr ui32 DomainMask = (1 << DomainWidth) - 1; + static constexpr ui32 DomainShift = TypeShift - DomainWidth; + static constexpr ui32 VirtualGroupDomain = DomainMask; + static constexpr ui32 MaxValidDomain = DomainMask - 1; - void Set(EGroupConfigurationType configurationType, ui32 availabilityDomainID, ui32 groupLocalId) { - Y_VERIFY(ui32(configurationType) < (1 << 2)); - Y_VERIFY(ui32(availabilityDomainID) < (1 << 7)); - Y_VERIFY(ui32(groupLocalId) < (1 << 26)); - Raw.N.ConfigurationType = configurationType; - Raw.N.AvailabilityDomainID = availabilityDomainID; - Raw.N.GroupLocalID = groupLocalId; - } + static constexpr ui32 GroupWidth = 25; + static constexpr ui32 GroupMask = (1 << GroupWidth) - 1; + static constexpr ui32 InvalidLocalId = GroupMask; + static constexpr ui32 MaxValidGroup = GroupMask - 1; - ui32 NextValidLocalId() { - const ui32 localId = GroupLocalID(); - if (localId == InvalidLocalId) { - return localId; - } - if (localId == InvalidLocalId - 1) { - return 0; - } - return localId + 1; - } + ui32 Raw = Max<ui32>(); - static constexpr ui32 InvalidLocalId = 0x1ffffff; - static_assert(sizeof(decltype(Raw)) == sizeof(ui32), "TGroupID Raw value must be binary compatible with ui32"); -}; + void Set(EGroupConfigurationType configurationType, ui32 availabilityDomainID, ui32 groupLocalId) { + Y_VERIFY(groupLocalId <= MaxValidGroup); -struct TPDiskID { - TPDiskID() { Set((EGroupConfigurationType)0x1, 0x3f, 0x1ffffff); } - explicit TPDiskID(EGroupConfigurationType configurationType, ui32 availabilityDomainID, ui32 pDiskLocalId) { - Set(configurationType, availabilityDomainID, pDiskLocalId); + switch (configurationType) { + case EGroupConfigurationType::Static: + case EGroupConfigurationType::Dynamic: + Y_VERIFY(availabilityDomainID <= MaxValidDomain); + Raw = static_cast<ui32>(configurationType) << TypeShift | availabilityDomainID << DomainShift | groupLocalId; + break; + + case EGroupConfigurationType::Virtual: + Y_VERIFY(availabilityDomainID == 1); + Raw = static_cast<ui32>(EGroupConfigurationType::Dynamic) << TypeShift | VirtualGroupDomain << DomainShift | groupLocalId; + break; + } } - explicit TPDiskID(ui32 raw) { Raw.X = raw; } - EGroupConfigurationType ConfigurationType() const { return (EGroupConfigurationType)Raw.N.ConfigurationType; } - ui32 AvailabilityDomainID() const { return Raw.N.AvailabilityDomainID; } - ui32 PDiskLocalID() const { return Raw.N.PDiskLocalID; } - ui32 GetRaw() const { return Raw.X; } - bool operator==(const TPDiskID &x) const { return GetRaw() == x.GetRaw(); } - TString ToString() const; -private: - union { - struct { - ui32 PDiskLocalID : 25; - ui32 AvailabilityDomainID : 6; - ui32 ConfigurationType : 1; - } N; - - ui32 X; - } Raw; - - void Set(EGroupConfigurationType configurationType, ui32 availabilityDomainID, ui32 pDiskLocalId) { - Y_VERIFY(ui32(configurationType) < (1 << 2)); - Y_VERIFY(ui32(availabilityDomainID) < (1 << 7)); - Y_VERIFY(ui32(pDiskLocalId) < (1 << 26)); - Raw.N.ConfigurationType = configurationType; - Raw.N.AvailabilityDomainID = availabilityDomainID; - Raw.N.PDiskLocalID = pDiskLocalId; + ui32 NextValidLocalId() { + const ui32 localId = GroupLocalID(); + return localId == InvalidLocalId ? localId : + localId == MaxValidGroup ? 0 : + localId + 1; } - static_assert(sizeof(decltype(Raw)) == sizeof(ui32), "TPDiskID Raw value must be binary compatible with ui32"); }; // channel info for tablet diff --git a/ydb/core/blobstorage/nodewarden/blobstorage_node_warden_ut.cpp b/ydb/core/blobstorage/nodewarden/blobstorage_node_warden_ut.cpp index 8a781afe8ce..983f3c00da7 100644 --- a/ydb/core/blobstorage/nodewarden/blobstorage_node_warden_ut.cpp +++ b/ydb/core/blobstorage/nodewarden/blobstorage_node_warden_ut.cpp @@ -150,7 +150,7 @@ void SetupServices(TTestActorRuntime &runtime, TString extraPath, TIntrusivePtr< app.SetChannels(std::move(channelProfiles)); } - ui32 groupId = TGroupID(GroupConfigurationTypeStatic, DOMAIN_ID, 0).GetRaw(); + ui32 groupId = TGroupID(EGroupConfigurationType::Static, DOMAIN_ID, 0).GetRaw(); for (ui32 nodeIndex = 0; nodeIndex < runtime.GetNodeCount(); ++nodeIndex) { SetupStateStorage(runtime, nodeIndex, stateStorageGroup); diff --git a/ydb/core/blobstorage/nodewarden/node_warden_group.cpp b/ydb/core/blobstorage/nodewarden/node_warden_group.cpp index 8982533fd9c..215cf321d91 100644 --- a/ydb/core/blobstorage/nodewarden/node_warden_group.cpp +++ b/ydb/core/blobstorage/nodewarden/node_warden_group.cpp @@ -82,7 +82,7 @@ namespace NKikimr::NStorage { } TEncryptionKey& TNodeWarden::GetGroupMainKey(ui32 groupId) { - return TGroupID(groupId).ConfigurationType() == GroupConfigurationTypeStatic + return TGroupID(groupId).ConfigurationType() == EGroupConfigurationType::Static ? Cfg->StaticKey : Cfg->TenantKey; } @@ -172,7 +172,7 @@ namespace NKikimr::NStorage { Y_VERIFY(success); groupChanged = before != after; - if (groupChanged && Cfg->IsCacheEnabled() && TGroupID(groupId).ConfigurationType() == GroupConfigurationTypeDynamic) { + if (groupChanged && Cfg->IsCacheEnabled() && TGroupID(groupId).ConfigurationType() == EGroupConfigurationType::Dynamic) { EnqueueSyncOp(WrapCacheOp(UpdateGroupInCache(*currentGroup))); } } diff --git a/ydb/core/blobstorage/nodewarden/node_warden_pipe.cpp b/ydb/core/blobstorage/nodewarden/node_warden_pipe.cpp index f401ef1de0b..e618cf2d553 100644 --- a/ydb/core/blobstorage/nodewarden/node_warden_pipe.cpp +++ b/ydb/core/blobstorage/nodewarden/node_warden_pipe.cpp @@ -63,7 +63,7 @@ void TNodeWarden::SendRegisterNode() { TVector<ui32> startedDynamicGroups, generations; for (const auto& [groupId, group] : Groups) { - if (group.ProxyRunning && TGroupID(groupId).ConfigurationType() == GroupConfigurationTypeDynamic) { + if (group.ProxyRunning && TGroupID(groupId).ConfigurationType() == EGroupConfigurationType::Dynamic) { startedDynamicGroups.push_back(groupId); generations.push_back(group.Info ? group.Info->GroupGeneration : 0); } diff --git a/ydb/core/blobstorage/nodewarden/node_warden_proxy.cpp b/ydb/core/blobstorage/nodewarden/node_warden_proxy.cpp index 3e351ac554a..6000a0cb52a 100644 --- a/ydb/core/blobstorage/nodewarden/node_warden_proxy.cpp +++ b/ydb/core/blobstorage/nodewarden/node_warden_proxy.cpp @@ -44,7 +44,7 @@ void TNodeWarden::HandleForwarded(TAutoPtr<::NActors::IEventHandle> &ev) { const TGroupID groupId(GroupIDFromBlobStorageProxyID(ev->GetForwardOnNondeliveryRecipient())); const ui32 id = groupId.GetRaw(); - const bool noGroup = (groupId.ConfigurationType() == GroupConfigurationTypeStatic && !Groups.count(id)) || EjectedGroups.count(id); + const bool noGroup = (groupId.ConfigurationType() == EGroupConfigurationType::Static && !Groups.count(id)) || EjectedGroups.count(id); STLOG(PRI_DEBUG, BS_NODE, NW46, "HandleForwarded", (GroupId, id), (EnableProxyMock, EnableProxyMock), (NoGroup, noGroup)); if (id == Max<ui32>()) { diff --git a/ydb/core/blobstorage/nodewarden/node_warden_vdisk.cpp b/ydb/core/blobstorage/nodewarden/node_warden_vdisk.cpp index 1a75ac8a9e4..986770b1c57 100644 --- a/ydb/core/blobstorage/nodewarden/node_warden_vdisk.cpp +++ b/ydb/core/blobstorage/nodewarden/node_warden_vdisk.cpp @@ -185,7 +185,7 @@ namespace NKikimr::NStorage { (PDiskGuid, pdiskGuid)); // for dynamic groups -- start state aggregator - if (TGroupID(groupInfo->GroupID).ConfigurationType() == GroupConfigurationTypeDynamic) { + if (TGroupID(groupInfo->GroupID).ConfigurationType() == EGroupConfigurationType::Dynamic) { StartAggregator(vdiskServiceId, groupInfo->GroupID); } @@ -232,7 +232,7 @@ namespace NKikimr::NStorage { const auto& loc = vdisk.GetVDiskLocation(); if (loc.GetNodeID() != LocalNodeId) { - if (TGroupID(vdisk.GetVDiskID().GetGroupID()).ConfigurationType() != GroupConfigurationTypeStatic) { + if (TGroupID(vdisk.GetVDiskID().GetGroupID()).ConfigurationType() != EGroupConfigurationType::Static) { STLOG_DEBUG_FAIL(BS_NODE, NW31, "incorrect NodeId in VDisk configuration", (Record, vdisk), (NodeId, LocalNodeId)); } return; diff --git a/ydb/core/blobstorage/pdisk/blobstorage_pdisk_state.h b/ydb/core/blobstorage/pdisk/blobstorage_pdisk_state.h index 3791397b91f..ec3ef4e2b7d 100644 --- a/ydb/core/blobstorage/pdisk/blobstorage_pdisk_state.h +++ b/ydb/core/blobstorage/pdisk/blobstorage_pdisk_state.h @@ -86,9 +86,7 @@ struct TOwnerData { if (VDiskId == TVDiskID::InvalidId) { return false; } - TGroupID groupId(VDiskId.GroupID); - bool isStatic = (groupId.ConfigurationType() == GroupConfigurationTypeStatic); - return isStatic; + return TGroupID(VDiskId.GroupID).ConfigurationType() == EGroupConfigurationType::Static; } bool IsNextLsnOk(const ui64 lsn) const { diff --git a/ydb/core/cms/cluster_info.h b/ydb/core/cms/cluster_info.h index af5fe24af80..d4568473f00 100644 --- a/ydb/core/cms/cluster_info.h +++ b/ydb/core/cms/cluster_info.h @@ -725,8 +725,8 @@ public: return TGroupID(vdId.GroupID).ConfigurationType(); } - static bool IsStaticGroupVDisk(const TVDiskID &vdId) { return GroupConfigurationTypeStatic == VDiskConfigurationType(vdId); } - static bool IsDynamicGroupVDisk(const TVDiskID &vdId) { return GroupConfigurationTypeDynamic == VDiskConfigurationType(vdId); } + static bool IsStaticGroupVDisk(const TVDiskID &vdId) { return EGroupConfigurationType::Static == VDiskConfigurationType(vdId); } + static bool IsDynamicGroupVDisk(const TVDiskID &vdId) { return EGroupConfigurationType::Dynamic == VDiskConfigurationType(vdId); } private: TNodeInfo &NodeRef(ui32 nodeId) const diff --git a/ydb/core/health_check/health_check.cpp b/ydb/core/health_check/health_check.cpp index 7995c58aafc..49f71d47ef6 100644 --- a/ydb/core/health_check/health_check.cpp +++ b/ydb/core/health_check/health_check.cpp @@ -1167,7 +1167,7 @@ public: if (current == nullptr || current->GetGroupGeneration() < state.GetGroupGeneration()) { current = &state; } - if (storagePoolName.empty() && groupId.ConfigurationType() != EGroupConfigurationType::GroupConfigurationTypeStatic) { + if (storagePoolName.empty() && groupId.ConfigurationType() != EGroupConfigurationType::Static) { continue; } StoragePoolState[storagePoolName].Groups.emplace(state.groupid()); diff --git a/ydb/core/mind/bscontroller/bsc.cpp b/ydb/core/mind/bscontroller/bsc.cpp index bd9f83d86d6..9f2abd6c6ad 100644 --- a/ydb/core/mind/bscontroller/bsc.cpp +++ b/ydb/core/mind/bscontroller/bsc.cpp @@ -7,24 +7,17 @@ namespace NKikimr { TString TGroupID::ToString() const { TStringStream str; - str << "{TGroupID ConfigurationType# " - << (ConfigurationType() == GroupConfigurationTypeStatic ? "Static" : "Dynamic"); - str << " AvailabilityDomainID# " << AvailabilityDomainID(); + str << "{TGroupID ConfigurationType# "; + switch (ConfigurationType()) { + case EGroupConfigurationType::Static: str << "Static"; break; + case EGroupConfigurationType::Dynamic: str << "Dynamic"; break; + case EGroupConfigurationType::Virtual: str << "Virtual"; break; + } str << " GroupLocalID# " << GroupLocalID(); str << "}"; return str.Str(); } -TString TPDiskID::ToString() const { - TStringStream str; - str << "{TPDiskID ConfigurationType# " - << (ConfigurationType() == GroupConfigurationTypeStatic ? "Static" : "Dynamic"); - str << " AvailabilityDomainID# " << AvailabilityDomainID(); - str << " PDiskLocalID# " << PDiskLocalID(); - str << "}"; - return str.Str(); -} - IActor* CreateFlatBsController(const TActorId &tablet, TTabletStorageInfo *info) { return new NBsController::TBlobStorageController(tablet, info); } diff --git a/ydb/core/mind/bscontroller/config_fit_groups.cpp b/ydb/core/mind/bscontroller/config_fit_groups.cpp index dd1513b3549..e3a97b54144 100644 --- a/ydb/core/mind/bscontroller/config_fit_groups.cpp +++ b/ydb/core/mind/bscontroller/config_fit_groups.cpp @@ -69,7 +69,7 @@ namespace NKikimr { const ui32 groupLocalId = nextGroupId ? TGroupID(nextGroupId).GroupLocalID() : 0; // create new full group id - TGroupID fullGroupId(GroupConfigurationTypeDynamic, AvailabilityDomainId, groupLocalId); + TGroupID fullGroupId(EGroupConfigurationType::Dynamic, AvailabilityDomainId, groupLocalId); TGroupID nextFullGroupId = fullGroupId; ++nextFullGroupId; diff --git a/ydb/core/mind/bscontroller/propose_group_key.cpp b/ydb/core/mind/bscontroller/propose_group_key.cpp index ebca302ee67..4d246b74aad 100644 --- a/ydb/core/mind/bscontroller/propose_group_key.cpp +++ b/ydb/core/mind/bscontroller/propose_group_key.cpp @@ -34,7 +34,7 @@ public: void ReadStep() { const auto prevStatus = std::exchange(Status, NKikimrProto::ERROR); // assume error TGroupInfo *group = Self->FindGroup(GroupId); - if (TGroupID(GroupId).ConfigurationType() != GroupConfigurationTypeDynamic) { + if (TGroupID(GroupId).ConfigurationType() != EGroupConfigurationType::Dynamic) { STLOG(PRI_CRIT, BS_CONTROLLER, BSCTXPGK01, "Can't propose key for non-dynamic group", (GroupId, GroupId)); } else if (!group) { STLOG(PRI_CRIT, BS_CONTROLLER, BSCTXPGK02, "Can't read group info", (GroupId, GroupId)); diff --git a/ydb/core/mind/ut_fat/blobstorage_node_warden_ut_fat.cpp b/ydb/core/mind/ut_fat/blobstorage_node_warden_ut_fat.cpp index d1165b3ce4d..40e385c734c 100644 --- a/ydb/core/mind/ut_fat/blobstorage_node_warden_ut_fat.cpp +++ b/ydb/core/mind/ut_fat/blobstorage_node_warden_ut_fat.cpp @@ -137,7 +137,7 @@ void SetupServices(TTestActorRuntime &runtime) { app.SetChannels(std::move(channelProfiles)); } - ui32 groupId = TGroupID(GroupConfigurationTypeStatic, DOMAIN_ID, 0).GetRaw(); + ui32 groupId = TGroupID(EGroupConfigurationType::Static, DOMAIN_ID, 0).GetRaw(); for (ui32 nodeIndex = 0; nodeIndex < runtime.GetNodeCount(); ++nodeIndex) { SetupStateStorage(runtime, nodeIndex, stateStorageGroup); |