@@ -1176,15 +1176,15 @@ TNodeInfo* THive::SelectNode<NKikimrConfig::THiveConfig::HIVE_NODE_SELECT_STRATE
11761176 return itNode->Node ;
11771177}
11781178
1179- TVector<THive::TSelectedNode> THive::SelectMaxPriorityNodes (TVector<TSelectedNode> selectedNodes, const TTabletInfo& tablet) const
1179+ TVector<THive::TSelectedNode> THive::SelectMaxPriorityNodes (TVector<TSelectedNode> selectedNodes, const TTabletInfo& tablet, TDataCenterPriority& dcPriority ) const
11801180{
11811181 i32 priority = std::numeric_limits<i32 >::min ();
11821182 for (const TSelectedNode& selectedNode : selectedNodes) {
1183- priority = std::max (priority, selectedNode.Node ->GetPriorityForTablet (tablet));
1183+ priority = std::max (priority, selectedNode.Node ->GetPriorityForTablet (tablet, dcPriority ));
11841184 }
11851185
11861186 auto it = std::partition (selectedNodes.begin (), selectedNodes.end (), [&] (const TSelectedNode& selectedNode) {
1187- return selectedNode.Node ->GetPriorityForTablet (tablet) == priority;
1187+ return selectedNode.Node ->GetPriorityForTablet (tablet, dcPriority ) == priority;
11881188 });
11891189
11901190 selectedNodes.erase (it, selectedNodes.end ());
@@ -1279,53 +1279,21 @@ THive::TBestNodeResult THive::FindBestNode(const TTabletInfo& tablet, TNodeId su
12791279 }
12801280 }
12811281
1282- std::vector<std::vector<TNodeInfo*>> candidateGroups;
1283- candidateGroups.resize (dataCentersGroups.size () + 1 );
1284- std::unordered_map<TDataCenterId, std::vector<TNodeInfo*>*> indexDC2Group;
1282+ TDataCenterPriority dcPriority;
12851283 for (size_t numGroup = 0 ; numGroup < dataCentersGroups.size (); ++numGroup) {
12861284 const NKikimrHive::TDataCentersGroup* dcGroup = dataCentersGroups[numGroup];
1287- if (dcGroup->DataCenterSize ()) {
1288- for (TDataCenterId dc : dcGroup->GetDataCenter ()) {
1289- indexDC2Group[dc] = candidateGroups.data () + numGroup;
1290- }
1291- } else {
1292- for (const ui64 dcId : dcGroup->GetDataCenterNum ()) {
1293- indexDC2Group[DataCenterToString (dcId)] = candidateGroups.data () + numGroup;
1294- }
1295- }
1296- }
1297- for (auto it = Nodes.begin (); it != Nodes.end (); ++it) {
1298- TNodeInfo* nodeInfo = &it->second ;
1299- if (nodeInfo->IsAlive ()) {
1300- TDataCenterId dataCenterId = nodeInfo->GetDataCenter ();
1301- auto itDataCenter = indexDC2Group.find (dataCenterId);
1302- if (itDataCenter != indexDC2Group.end ()) {
1303- itDataCenter->second ->push_back (nodeInfo);
1304- } else {
1305- candidateGroups.back ().push_back (nodeInfo);
1306- }
1307- } else {
1308- BLOG_TRACE (" [FBN] Tablet " << tablet.ToString () << " node " << nodeInfo->Id << " is not alive" );
1309- debugState.NodesDead ++;
1285+ for (TDataCenterId dc : dcGroup->GetDataCenter ()) {
1286+ // First group gets largest priority, last group gets +1 priority, dcs not in any groups get 0
1287+ dcPriority[dc] = dataCentersGroups.size () - numGroup;
13101288 }
13111289 }
13121290
13131291 TVector<TSelectedNode> selectedNodes;
1292+ selectedNodes.reserve (Nodes.size ());
13141293 bool thereAreNodesWithManyStarts = false ;
13151294
1316- for (auto itCandidateNodes = candidateGroups.begin (); itCandidateNodes != candidateGroups.end (); ++itCandidateNodes) {
1317- const std::vector<TNodeInfo*>& candidateNodes (*itCandidateNodes);
1318- if (candidateGroups.size () > 1 ) {
1319- BLOG_TRACE (" [FBN] Tablet " << tablet.ToString ()
1320- << " checking candidates group " << (itCandidateNodes - candidateGroups.begin () + 1 )
1321- << " of " << candidateGroups.size ());
1322- }
1323-
1324- selectedNodes.clear ();
1325- selectedNodes.reserve (candidateNodes.size ());
1326-
1327- for (auto it = candidateNodes.begin (); it != candidateNodes.end (); ++it) {
1328- TNodeInfo& nodeInfo = *(*it);
1295+ for (auto & [_, nodeInfo] : Nodes) {
1296+ if (nodeInfo.IsAlive ()) {
13291297 if (nodeInfo.IsAllowedToRunTablet (tablet, &debugState)) {
13301298 if (nodeInfo.IsAbleToScheduleTablet ()) {
13311299 if (nodeInfo.IsAbleToRunTablet (tablet, &debugState)) {
@@ -1351,11 +1319,12 @@ THive::TBestNodeResult THive::FindBestNode(const TTabletInfo& tablet, TNodeId su
13511319 << " tablet allowed domains " << tablet.GetNodeFilter ().AllowedDomains
13521320 << " tablet effective allowed domains " << tablet.GetNodeFilter ().GetEffectiveAllowedDomains ());
13531321 }
1354- }
1355- if (!selectedNodes. empty ()) {
1356- break ;
1322+ } else {
1323+ BLOG_TRACE ( " [FBN] Tablet " << tablet. ToString () << " node " << nodeInfo. Id << " is not alive " );
1324+ debugState. NodesDead ++ ;
13571325 }
13581326 }
1327+
13591328 BLOG_TRACE (" [FBN] Tablet " << tablet.ToString () << " selected nodes count " << selectedNodes.size ());
13601329 if (selectedNodes.empty () && thereAreNodesWithManyStarts) {
13611330 BLOG_TRACE (" [FBN] Tablet " << tablet.ToString () << " all available nodes are booting too many tablets" );
@@ -1364,7 +1333,7 @@ THive::TBestNodeResult THive::FindBestNode(const TTabletInfo& tablet, TNodeId su
13641333
13651334 TNodeInfo* selectedNode = nullptr ;
13661335 if (!selectedNodes.empty ()) {
1367- selectedNodes = SelectMaxPriorityNodes (std::move (selectedNodes), tablet);
1336+ selectedNodes = SelectMaxPriorityNodes (std::move (selectedNodes), tablet, dcPriority );
13681337 BLOG_TRACE (" [FBN] Tablet " << tablet.ToString () << " selected max priority nodes count " << selectedNodes.size ());
13691338
13701339 switch (GetNodeSelectStrategy ()) {
0 commit comments