@@ -4968,6 +4968,75 @@ Y_UNIT_TEST_SUITE(THiveTest) {
49684968 UNIT_ASSERT_VALUES_EQUAL (newDistribution[1 ].size (), TABLETS_PER_NODE - 1 );
49694969 }
49704970
4971+ Y_UNIT_TEST (TestHiveBalancerHighUsage) {
4972+ static constexpr ui64 NUM_NODES = 2 ;
4973+ TTestBasicRuntime runtime (2 , false );
4974+ Setup (runtime, true , 1 , [](TAppPrepare& app) {
4975+ app.HiveConfig .SetTabletKickCooldownPeriod (0 );
4976+ app.HiveConfig .SetResourceChangeReactionPeriod (0 );
4977+ });
4978+ const int nodeBase = runtime.GetNodeId (0 );
4979+ TActorId senderA = runtime.AllocateEdgeActor ();
4980+ const ui64 hiveTablet = MakeDefaultHiveID ();
4981+ const ui64 testerTablet = MakeTabletID (false , 1 );
4982+
4983+ auto getDistribution = [hiveTablet, nodeBase, senderA, &runtime]() -> std::array<std::vector<ui64>, NUM_NODES> {
4984+ std::array<std::vector<ui64>, NUM_NODES> nodeTablets = {};
4985+ {
4986+ runtime.SendToPipe (hiveTablet, senderA, new TEvHive::TEvRequestHiveInfo ());
4987+ TAutoPtr<IEventHandle> handle;
4988+ TEvHive::TEvResponseHiveInfo* response = runtime.GrabEdgeEventRethrow <TEvHive::TEvResponseHiveInfo>(handle);
4989+ for (const NKikimrHive::TTabletInfo& tablet : response->Record .GetTablets ()) {
4990+ UNIT_ASSERT_C (((int )tablet.GetNodeID () - nodeBase >= 0 ) && (tablet.GetNodeID () - nodeBase < NUM_NODES),
4991+ " nodeId# " << tablet.GetNodeID () << " nodeBase# " << nodeBase);
4992+ nodeTablets[tablet.GetNodeID () - nodeBase].push_back (tablet.GetTabletID ());
4993+ }
4994+ }
4995+ return nodeTablets;
4996+ };
4997+
4998+ CreateTestBootstrapper (runtime, CreateTestTabletInfo (hiveTablet, TTabletTypes::Hive), &CreateDefaultHive);
4999+
5000+ // wait for creation of nodes
5001+ {
5002+ TDispatchOptions options;
5003+ options.FinalEvents .emplace_back (TEvLocal::EvStatus, NUM_NODES);
5004+ runtime.DispatchEvents (options);
5005+ }
5006+
5007+ TTabletTypes::EType tabletType = TTabletTypes::Dummy;
5008+ for (size_t i = 0 ; i < 2 ; ++i) {
5009+ THolder<TEvHive::TEvCreateTablet> ev (new TEvHive::TEvCreateTablet (testerTablet, 100500 + i, tabletType, BINDED_CHANNELS));
5010+ ev->Record .SetObjectId (i);
5011+ ui64 tabletId = SendCreateTestTablet (runtime, hiveTablet, testerTablet, std::move (ev), 0 , true );
5012+ MakeSureTabletIsUp (runtime, tabletId, 0 );
5013+ }
5014+
5015+ auto initialDistribution = getDistribution ();
5016+
5017+ std::array<double , NUM_NODES> usages = {.89 , .91 };
5018+ for (ui32 i = 0 ; i < 2 ; ++i) {
5019+ for (ui32 node = 0 ; node < NUM_NODES; ++node) {
5020+ TActorId sender = runtime.AllocateEdgeActor (node);
5021+ THolder<TEvHive::TEvTabletMetrics> metrics = MakeHolder<TEvHive::TEvTabletMetrics>();
5022+ metrics->Record .SetTotalNodeUsage (usages[node]);
5023+
5024+ runtime.SendToPipe (hiveTablet, sender, metrics.Release (), node);
5025+ }
5026+ }
5027+
5028+ {
5029+ TDispatchOptions options;
5030+ options.FinalEvents .emplace_back (NHive::TEvPrivate::EvBalancerOut);
5031+ runtime.DispatchEvents (options, TDuration::Seconds (10 ));
5032+ }
5033+
5034+ // Check that balancer moved no tablets
5035+ auto newDistribution = getDistribution ();
5036+
5037+ UNIT_ASSERT_EQUAL (initialDistribution, newDistribution);
5038+ }
5039+
49715040 Y_UNIT_TEST (TestUpdateTabletsObjectUpdatesMetrics) {
49725041 TTestBasicRuntime runtime (1 , false );
49735042 Setup (runtime, true );
0 commit comments