@@ -4855,6 +4855,75 @@ Y_UNIT_TEST_SUITE(THiveTest) {
4855
4855
UNIT_ASSERT_VALUES_EQUAL (newDistribution[1 ].size (), TABLETS_PER_NODE - 1 );
4856
4856
}
4857
4857
4858
+ Y_UNIT_TEST (TestHiveBalancerHighUsage) {
4859
+ static constexpr ui64 NUM_NODES = 2 ;
4860
+ TTestBasicRuntime runtime (2 , false );
4861
+ Setup (runtime, true , 1 , [](TAppPrepare& app) {
4862
+ app.HiveConfig .SetTabletKickCooldownPeriod (0 );
4863
+ app.HiveConfig .SetResourceChangeReactionPeriod (0 );
4864
+ });
4865
+ const int nodeBase = runtime.GetNodeId (0 );
4866
+ TActorId senderA = runtime.AllocateEdgeActor ();
4867
+ const ui64 hiveTablet = MakeDefaultHiveID ();
4868
+ const ui64 testerTablet = MakeTabletID (false , 1 );
4869
+
4870
+ auto getDistribution = [hiveTablet, nodeBase, senderA, &runtime]() -> std::array<std::vector<ui64>, NUM_NODES> {
4871
+ std::array<std::vector<ui64>, NUM_NODES> nodeTablets = {};
4872
+ {
4873
+ runtime.SendToPipe (hiveTablet, senderA, new TEvHive::TEvRequestHiveInfo ());
4874
+ TAutoPtr<IEventHandle> handle;
4875
+ TEvHive::TEvResponseHiveInfo* response = runtime.GrabEdgeEventRethrow <TEvHive::TEvResponseHiveInfo>(handle);
4876
+ for (const NKikimrHive::TTabletInfo& tablet : response->Record .GetTablets ()) {
4877
+ UNIT_ASSERT_C (((int )tablet.GetNodeID () - nodeBase >= 0 ) && (tablet.GetNodeID () - nodeBase < NUM_NODES),
4878
+ " nodeId# " << tablet.GetNodeID () << " nodeBase# " << nodeBase);
4879
+ nodeTablets[tablet.GetNodeID () - nodeBase].push_back (tablet.GetTabletID ());
4880
+ }
4881
+ }
4882
+ return nodeTablets;
4883
+ };
4884
+
4885
+ CreateTestBootstrapper (runtime, CreateTestTabletInfo (hiveTablet, TTabletTypes::Hive), &CreateDefaultHive);
4886
+
4887
+ // wait for creation of nodes
4888
+ {
4889
+ TDispatchOptions options;
4890
+ options.FinalEvents .emplace_back (TEvLocal::EvStatus, NUM_NODES);
4891
+ runtime.DispatchEvents (options);
4892
+ }
4893
+
4894
+ TTabletTypes::EType tabletType = TTabletTypes::Dummy;
4895
+ for (size_t i = 0 ; i < 2 ; ++i) {
4896
+ THolder<TEvHive::TEvCreateTablet> ev (new TEvHive::TEvCreateTablet (testerTablet, 100500 + i, tabletType, BINDED_CHANNELS));
4897
+ ev->Record .SetObjectId (i);
4898
+ ui64 tabletId = SendCreateTestTablet (runtime, hiveTablet, testerTablet, std::move (ev), 0 , true );
4899
+ MakeSureTabletIsUp (runtime, tabletId, 0 );
4900
+ }
4901
+
4902
+ auto initialDistribution = getDistribution ();
4903
+
4904
+ std::array<double , NUM_NODES> usages = {.89 , .91 };
4905
+ for (ui32 i = 0 ; i < 2 ; ++i) {
4906
+ for (ui32 node = 0 ; node < NUM_NODES; ++node) {
4907
+ TActorId sender = runtime.AllocateEdgeActor (node);
4908
+ THolder<TEvHive::TEvTabletMetrics> metrics = MakeHolder<TEvHive::TEvTabletMetrics>();
4909
+ metrics->Record .SetTotalNodeUsage (usages[node]);
4910
+
4911
+ runtime.SendToPipe (hiveTablet, sender, metrics.Release (), node);
4912
+ }
4913
+ }
4914
+
4915
+ {
4916
+ TDispatchOptions options;
4917
+ options.FinalEvents .emplace_back (NHive::TEvPrivate::EvBalancerOut);
4918
+ runtime.DispatchEvents (options, TDuration::Seconds (10 ));
4919
+ }
4920
+
4921
+ // Check that balancer moved no tablets
4922
+ auto newDistribution = getDistribution ();
4923
+
4924
+ UNIT_ASSERT_EQUAL (initialDistribution, newDistribution);
4925
+ }
4926
+
4858
4927
Y_UNIT_TEST (TestUpdateTabletsObjectUpdatesMetrics) {
4859
4928
TTestBasicRuntime runtime (1 , false );
4860
4929
Setup (runtime, true );
0 commit comments