summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorAlexander Rutkovsky <[email protected]>2022-05-25 18:27:04 +0300
committerAlexander Rutkovsky <[email protected]>2022-05-25 18:27:04 +0300
commit10ee71fe578e9241b1e9198ef9467a7e5ca59b9f (patch)
treea4726973148496cc662dd523487ed4d939096324
parente7acefb866b1faa124f0ff769c0d81188dc96598 (diff)
Refactor TGroupID to support virtual group ids KIKIMR-14867
ref:5908ae9973c5f28ec8c103f8578ca8301cd0928f
-rw-r--r--ydb/core/base/blobstorage.h153
-rw-r--r--ydb/core/blobstorage/nodewarden/blobstorage_node_warden_ut.cpp2
-rw-r--r--ydb/core/blobstorage/nodewarden/node_warden_group.cpp4
-rw-r--r--ydb/core/blobstorage/nodewarden/node_warden_pipe.cpp2
-rw-r--r--ydb/core/blobstorage/nodewarden/node_warden_proxy.cpp2
-rw-r--r--ydb/core/blobstorage/nodewarden/node_warden_vdisk.cpp4
-rw-r--r--ydb/core/blobstorage/pdisk/blobstorage_pdisk_state.h4
-rw-r--r--ydb/core/cms/cluster_info.h4
-rw-r--r--ydb/core/health_check/health_check.cpp2
-rw-r--r--ydb/core/mind/bscontroller/bsc.cpp19
-rw-r--r--ydb/core/mind/bscontroller/config_fit_groups.cpp2
-rw-r--r--ydb/core/mind/bscontroller/propose_group_key.cpp2
-rw-r--r--ydb/core/mind/ut_fat/blobstorage_node_warden_ut_fat.cpp2
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);