@@ -62,17 +62,17 @@ void BalanceNodes<NKikimrConfig::THiveConfig::HIVE_NODE_BALANCE_STRATEGY_RANDOM>
62
62
}
63
63
64
64
template <>
65
- void BalanceTablets<NKikimrConfig::THiveConfig::HIVE_TABLET_BALANCE_STRATEGY_OLD_WEIGHTED_RANDOM>(std::vector<TTabletInfo*>& tablets , EResourceToBalance resourceToBalance) {
65
+ void BalanceTablets<NKikimrConfig::THiveConfig::HIVE_TABLET_BALANCE_STRATEGY_OLD_WEIGHTED_RANDOM>(std::vector<TTabletInfo*>::iterator first, std::vector<TTabletInfo*>::iterator last , EResourceToBalance resourceToBalance) {
66
66
auto & randGen = *TAppData::RandomProvider.Get ();
67
67
// weighted random shuffle
68
68
std::vector<double > weights;
69
- weights.reserve (tablets. size () );
70
- for (auto it = tablets. begin () ; it != tablets. end () ; ++it) {
69
+ weights.reserve (last - first );
70
+ for (auto it = first ; it != last ; ++it) {
71
71
weights.emplace_back ((*it)->GetWeight (resourceToBalance));
72
72
}
73
- auto itT = tablets. begin () ;
73
+ auto itT = first ;
74
74
auto itW = weights.begin ();
75
- while (itT != tablets. end () && itW != weights.end ()) {
75
+ while (itT != last && itW != weights.end ()) {
76
76
auto idx = std::discrete_distribution (itW, weights.end ())(randGen);
77
77
if (idx != 0 ) {
78
78
std::iter_swap (itT, std::next (itT, idx));
@@ -84,32 +84,32 @@ void BalanceTablets<NKikimrConfig::THiveConfig::HIVE_TABLET_BALANCE_STRATEGY_OLD
84
84
}
85
85
86
86
template <>
87
- void BalanceTablets<NKikimrConfig::THiveConfig::HIVE_TABLET_BALANCE_STRATEGY_HEAVIEST>(std::vector<TTabletInfo*>& tablets , EResourceToBalance resourceToBalance) {
88
- std::sort (tablets. begin (), tablets. end () , [resourceToBalance](const TTabletInfo* a, const TTabletInfo* b) -> bool {
87
+ void BalanceTablets<NKikimrConfig::THiveConfig::HIVE_TABLET_BALANCE_STRATEGY_HEAVIEST>(std::vector<TTabletInfo*>::iterator first, std::vector<TTabletInfo*>::iterator last , EResourceToBalance resourceToBalance) {
88
+ std::sort (first, last , [resourceToBalance](const TTabletInfo* a, const TTabletInfo* b) -> bool {
89
89
return a->GetWeight (resourceToBalance) > b->GetWeight (resourceToBalance);
90
90
});
91
91
}
92
92
93
93
template <>
94
- void BalanceTablets<NKikimrConfig::THiveConfig::HIVE_TABLET_BALANCE_STRATEGY_RANDOM>(std::vector<TTabletInfo*>& tablets , EResourceToBalance) {
94
+ void BalanceTablets<NKikimrConfig::THiveConfig::HIVE_TABLET_BALANCE_STRATEGY_RANDOM>(std::vector<TTabletInfo*>::iterator first, std::vector<TTabletInfo*>::iterator last , EResourceToBalance) {
95
95
auto & randGen = *TAppData::RandomProvider.Get ();
96
- std::shuffle (tablets. begin (), tablets. end () , randGen);
96
+ std::shuffle (first, last , randGen);
97
97
}
98
98
99
99
template <>
100
- void BalanceTablets<NKikimrConfig::THiveConfig::HIVE_TABLET_BALANCE_STRATEGY_WEIGHTED_RANDOM>(std::vector<TTabletInfo*>& tablets , EResourceToBalance resourceToBalance) {
100
+ void BalanceTablets<NKikimrConfig::THiveConfig::HIVE_TABLET_BALANCE_STRATEGY_WEIGHTED_RANDOM>(std::vector<TTabletInfo*>::iterator first, std::vector<TTabletInfo*>::iterator last , EResourceToBalance resourceToBalance) {
101
101
auto & randGen = *TAppData::RandomProvider.Get ();
102
102
std::vector<std::pair<double , TTabletInfo*>> weights;
103
- weights.reserve (tablets. size () );
104
- for (TTabletInfo* tablet : tablets ) {
105
- double weight = tablet ->GetWeight (resourceToBalance);
106
- weights.emplace_back (weight * randGen (), tablet );
103
+ weights.reserve (last - first );
104
+ for (auto it = first; it != last; ++it ) {
105
+ double weight = (*it) ->GetWeight (resourceToBalance);
106
+ weights.emplace_back (weight * randGen (), *it );
107
107
}
108
108
std::sort (weights.begin (), weights.end (), [](const auto & a, const auto & b) -> bool {
109
109
return a.first > b.first ;
110
110
});
111
111
for (size_t n = 0 ; n < weights.size (); ++n) {
112
- tablets [n] = weights[n].second ;
112
+ first [n] = weights[n].second ;
113
113
}
114
114
}
115
115
@@ -252,18 +252,31 @@ class THiveBalancer : public NActors::TActorBootstrapped<THiveBalancer>, public
252
252
}
253
253
BLOG_TRACE (" Balancer on node " << node->Id << " : " << tablets.size () << " /" << nodeTablets.size () << " tablets are suitable for balancing" );
254
254
if (!tablets.empty ()) {
255
+ // avoid moving system tablets if possible
256
+ std::vector<TTabletInfo*>::iterator partitionIt;
257
+ if (Hive->GetLessSystemTabletsMoves ()) {
258
+ partitionIt = std::partition (tablets.begin (), tablets.end (), [](TTabletInfo* tablet) {
259
+ return !THive::IsSystemTablet (tablet->GetTabletType ());
260
+ });
261
+ } else {
262
+ partitionIt = tablets.end ();
263
+ }
255
264
switch (Hive->GetTabletBalanceStrategy ()) {
256
265
case NKikimrConfig::THiveConfig::HIVE_TABLET_BALANCE_STRATEGY_OLD_WEIGHTED_RANDOM:
257
- BalanceTablets<NKikimrConfig::THiveConfig::HIVE_TABLET_BALANCE_STRATEGY_OLD_WEIGHTED_RANDOM>(tablets, Settings.ResourceToBalance );
266
+ BalanceTablets<NKikimrConfig::THiveConfig::HIVE_TABLET_BALANCE_STRATEGY_OLD_WEIGHTED_RANDOM>(tablets.begin (), partitionIt, Settings.ResourceToBalance );
267
+ BalanceTablets<NKikimrConfig::THiveConfig::HIVE_TABLET_BALANCE_STRATEGY_OLD_WEIGHTED_RANDOM>(partitionIt, tablets.end (), Settings.ResourceToBalance );
258
268
break ;
259
269
case NKikimrConfig::THiveConfig::HIVE_TABLET_BALANCE_STRATEGY_WEIGHTED_RANDOM:
260
- BalanceTablets<NKikimrConfig::THiveConfig::HIVE_TABLET_BALANCE_STRATEGY_WEIGHTED_RANDOM>(tablets, Settings.ResourceToBalance );
270
+ BalanceTablets<NKikimrConfig::THiveConfig::HIVE_TABLET_BALANCE_STRATEGY_WEIGHTED_RANDOM>(tablets.begin (), partitionIt, Settings.ResourceToBalance );
271
+ BalanceTablets<NKikimrConfig::THiveConfig::HIVE_TABLET_BALANCE_STRATEGY_WEIGHTED_RANDOM>(partitionIt, tablets.end (), Settings.ResourceToBalance );
261
272
break ;
262
273
case NKikimrConfig::THiveConfig::HIVE_TABLET_BALANCE_STRATEGY_HEAVIEST:
263
- BalanceTablets<NKikimrConfig::THiveConfig::HIVE_TABLET_BALANCE_STRATEGY_HEAVIEST>(tablets, Settings.ResourceToBalance );
274
+ BalanceTablets<NKikimrConfig::THiveConfig::HIVE_TABLET_BALANCE_STRATEGY_HEAVIEST>(tablets.begin (), partitionIt, Settings.ResourceToBalance );
275
+ BalanceTablets<NKikimrConfig::THiveConfig::HIVE_TABLET_BALANCE_STRATEGY_HEAVIEST>(partitionIt, tablets.end (), Settings.ResourceToBalance );
264
276
break ;
265
277
case NKikimrConfig::THiveConfig::HIVE_TABLET_BALANCE_STRATEGY_RANDOM:
266
- BalanceTablets<NKikimrConfig::THiveConfig::HIVE_TABLET_BALANCE_STRATEGY_RANDOM>(tablets, Settings.ResourceToBalance );
278
+ BalanceTablets<NKikimrConfig::THiveConfig::HIVE_TABLET_BALANCE_STRATEGY_RANDOM>(tablets.begin (), partitionIt, Settings.ResourceToBalance );
279
+ BalanceTablets<NKikimrConfig::THiveConfig::HIVE_TABLET_BALANCE_STRATEGY_RANDOM>(partitionIt, tablets.end (), Settings.ResourceToBalance );
267
280
break ;
268
281
}
269
282
Tablets.clear ();
0 commit comments