diff --git a/ydb/core/cms/cluster_info.cpp b/ydb/core/cms/cluster_info.cpp index ee69f20175fb..f82ad598994c 100644 --- a/ydb/core/cms/cluster_info.cpp +++ b/ydb/core/cms/cluster_info.cpp @@ -916,22 +916,27 @@ void TClusterInfo::MigrateOldInfo(TClusterInfoPtr old) void TClusterInfo::ApplyStateStorageInfo(TIntrusiveConstPtr info) { StateStorageInfoReceived = true; Y_ABORT_UNLESS(info->RingGroups.size() > 0); - auto& groupInfo = info->RingGroups[0]; - for (ui32 ringId = 0; ringId < groupInfo.Rings.size(); ++ringId) { - auto &ring = groupInfo.Rings[ringId]; - TStateStorageRingInfoPtr ringInfo = MakeIntrusive(); - ringInfo->RingId = ringId; - if (ring.IsDisabled) - ringInfo->SetDisabled(); - - for(auto replica : ring.Replicas) { - CheckNodeExistenceWithVerify(replica.NodeId()); - ringInfo->AddNode(Nodes[replica.NodeId()]); - StateStorageReplicas.insert(replica.NodeId()); - StateStorageNodeToRingId[replica.NodeId()] = ringId; - } + const ui64 rGroupSize = IsBridgeMode ? info->RingGroups.size() : 1; + StateStorageRings.resize(rGroupSize); + + for (ui64 rGroupId = 0; rGroupId < rGroupSize; ++rGroupId) { + auto& groupInfo = info->RingGroups[rGroupId]; + for (ui32 ringId = 0; ringId < groupInfo.Rings.size(); ++ringId) { + auto &ring = groupInfo.Rings[ringId]; + TStateStorageRingInfoPtr ringInfo = MakeIntrusive(); + ringInfo->RingId = ringId; + if (ring.IsDisabled) + ringInfo->SetDisabled(); + + for(auto replica : ring.Replicas) { + CheckNodeExistenceWithVerify(replica.NodeId()); + ringInfo->AddNode(Nodes[replica.NodeId()]); + StateStorageReplicas.insert(replica.NodeId()); + StateStorageNodeToRingId[replica.NodeId()] = ringId; + } - StateStorageRings.push_back(ringInfo); + StateStorageRings[rGroupId].push_back(ringInfo); + } } } diff --git a/ydb/core/cms/cluster_info.h b/ydb/core/cms/cluster_info.h index 74c069a42835..e5a53166c6c6 100644 --- a/ydb/core/cms/cluster_info.h +++ b/ydb/core/cms/cluster_info.h @@ -1043,10 +1043,11 @@ class TClusterInfo : public TThrRefBase { THashMap> SysNodesCheckers; TIntrusiveConstPtr StateStorageInfo; - TVector StateStorageRings; + TVector> StateStorageRings; std::vector Piles; THashMap NodeIdToPileId; + bool IsBridgeMode = false; }; inline bool ActionRequiresHost(NKikimrCms::TAction::EType type) { diff --git a/ydb/core/cms/cms.cpp b/ydb/core/cms/cms.cpp index ea729ac4d397..153bc5627ab1 100644 --- a/ydb/core/cms/cms.cpp +++ b/ydb/core/cms/cms.cpp @@ -715,7 +715,8 @@ bool TCms::TryToLockStateStorageReplica(const TAction& action, } Y_ABORT_UNLESS(ClusterInfo->StateStorageInfo->RingGroups.size() > 0); - const ui32 nToSelect = ClusterInfo->StateStorageInfo->RingGroups[0].NToSelect; + const ui32 ringGroupId = ClusterInfo->IsBridgeMode ? node.PileId : 0; + const ui32 nToSelect = ClusterInfo->StateStorageInfo->RingGroups[ringGroupId].NToSelect; const ui32 currentRing = ClusterInfo->GetRingId(node.NodeId); ui8 currentRingState = TStateStorageRingInfo::Unknown; ui32 restartRings = 0; @@ -723,7 +724,7 @@ bool TCms::TryToLockStateStorageReplica(const TAction& action, ui32 disabledRings = 0; auto now = AppData(ctx)->TimeProvider->Now(); TDuration duration = TDuration::MicroSeconds(action.GetDuration()) + opts.PermissionDuration; - for (auto ringInfo : ClusterInfo->StateStorageRings) { + for (auto ringInfo : ClusterInfo->StateStorageRings[ringGroupId]) { auto state = ringInfo->CountState(now, State->Config.DefaultRetryTime, duration); LOG_DEBUG_S(*TlsActivationContext, NKikimrServices::CMS, "Ring: " << ringInfo->RingId << "; State: " << TStateStorageRingInfo::RingStateToString(state)); diff --git a/ydb/core/cms/info_collector.cpp b/ydb/core/cms/info_collector.cpp index ec5bdb5b5eb1..4074191e26e2 100644 --- a/ydb/core/cms/info_collector.cpp +++ b/ydb/core/cms/info_collector.cpp @@ -227,6 +227,7 @@ void TInfoCollector::Handle(TEvInterconnect::TEvNodesInfo::TPtr& ev) { RequestBridgeInfo(); const auto& pileMap = ev->Get()->PileMap; + Info->IsBridgeMode = static_cast(pileMap); Info->NodeIdToPileId = FlipPileMap(pileMap); for (const auto& node : ev->Get()->Nodes) { Info->AddNode(node, &TlsActivationContext->AsActorContext());