Skip to content

Commit 5fe73ea

Browse files
authored
stable-25-3-1: cherry-pick PR 28195, PR 28404 (#28824)
2 parents addcfa2 + 2673342 commit 5fe73ea

File tree

2 files changed

+77
-5
lines changed

2 files changed

+77
-5
lines changed

ydb/core/mind/hive/hive_ut.cpp

Lines changed: 63 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8229,6 +8229,69 @@ Y_UNIT_TEST_SUITE(THiveTest) {
82298229
}
82308230
}
82318231

8232+
Y_UNIT_TEST(TestReassignNonexistentTablet) {
8233+
TTestBasicRuntime runtime(1, false);
8234+
Setup(runtime, true);
8235+
8236+
const ui64 hiveTablet = MakeDefaultHiveID();
8237+
const ui64 testerTablet = MakeTabletID(false, 1);
8238+
const TActorId hiveActor = CreateTestBootstrapper(runtime, CreateTestTabletInfo(hiveTablet, TTabletTypes::Hive), &CreateDefaultHive);
8239+
runtime.EnableScheduleForActor(hiveActor);
8240+
MakeSureTabletIsUp(runtime, hiveTablet, 0);
8241+
TActorId sender = runtime.AllocateEdgeActor(0);
8242+
8243+
{
8244+
TDispatchOptions options;
8245+
options.FinalEvents.emplace_back(TEvLocal::EvSyncTablets);
8246+
runtime.DispatchEvents(options);
8247+
}
8248+
8249+
THolder<TEvHive::TEvCreateTablet> createTablet = MakeHolder<TEvHive::TEvCreateTablet>(testerTablet, 1, TTabletTypes::Dummy, BINDED_CHANNELS);
8250+
ui64 tablet = SendCreateTestTablet(runtime, hiveTablet, testerTablet, std::move(createTablet), 0, true);
8251+
8252+
MakeSureTabletIsUp(runtime, tablet, 0);
8253+
8254+
{
8255+
NActorsProto::TRemoteHttpInfo pb;
8256+
pb.SetMethod(HTTP_METHOD_POST);
8257+
pb.SetPath("/app");
8258+
auto* p1 = pb.AddQueryParams();
8259+
p1->SetKey("TabletID");
8260+
p1->SetValue(TStringBuilder() << hiveTablet);
8261+
auto* p2 = pb.AddQueryParams();
8262+
p2->SetKey("page");
8263+
p2->SetValue("ReassignTablet");
8264+
auto* p3 = pb.AddQueryParams();
8265+
p3->SetKey("tablet");
8266+
p3->SetValue("52");
8267+
runtime.SendToPipe(hiveTablet, sender, new NMon::TEvRemoteHttpInfo(std::move(pb)), 0, GetPipeConfigWithRetries());
8268+
8269+
TAutoPtr<IEventHandle> handle;
8270+
auto resp = runtime.GrabEdgeEventRethrow<NMon::TEvRemoteJsonInfoRes>(handle);
8271+
Ctest << "Hive response: " << resp->Json << Endl;
8272+
NJson::TJsonValue value;
8273+
ReadJsonTree(resp->Json, &value, false);
8274+
UNIT_ASSERT_VALUES_EQUAL(value["total"].GetIntegerSafe(), 0);
8275+
}
8276+
8277+
// this must not block balancer
8278+
8279+
{
8280+
THolder<TEvHive::TEvTabletMetrics> metrics = MakeHolder<TEvHive::TEvTabletMetrics>();
8281+
NKikimrHive::TTabletMetrics* metric = metrics->Record.AddTabletMetrics();
8282+
metric->SetTabletID(tablet);
8283+
metric->MutableResourceUsage()->SetNetwork(9000);
8284+
8285+
runtime.SendToPipe(hiveTablet, sender, metrics.Release());
8286+
}
8287+
8288+
{
8289+
TDispatchOptions options;
8290+
options.FinalEvents.push_back(NHive::TEvPrivate::EvBalancerOut);
8291+
runtime.DispatchEvents(options);
8292+
}
8293+
}
8294+
82328295
Y_UNIT_TEST(TestTabletsStartingCounter) {
82338296
TTestBasicRuntime runtime(1, false);
82348297
Setup(runtime, true);

ydb/core/mind/hive/monitoring.cpp

Lines changed: 14 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -2880,7 +2880,7 @@ class TTxMonEvent_RebalanceFromScratch : public TTransactionBase<THive> {
28802880
class TReassignTabletWaitActor : public TActor<TReassignTabletWaitActor>, public ISubActor {
28812881
public:
28822882
TActorId Source;
2883-
ui32 TabletsTotal = std::numeric_limits<ui32>::max();
2883+
ui32 TabletsTotal = 0;
28842884
ui32 TabletsDone = 0;
28852885
THive* Hive;
28862886

@@ -2907,14 +2907,23 @@ class TReassignTabletWaitActor : public TActor<TReassignTabletWaitActor>, public
29072907
return SelfId().LocalId();
29082908
}
29092909

2910-
void Handle(TEvPrivate::TEvRestartComplete::TPtr&) {
2911-
++TabletsDone;
2910+
void AddTablet(TLeaderTabletInfo* tablet) {
2911+
tablet->ActorsToNotifyOnRestart.push_back(SelfId());
2912+
++TabletsTotal;
2913+
}
2914+
2915+
void CheckCompletion() {
29122916
if (TabletsDone >= TabletsTotal) {
29132917
Send(Source, new NMon::TEvRemoteJsonInfoRes(TStringBuilder() << "{\"total\":" << TabletsDone << "}"));
29142918
PassAway();
29152919
}
29162920
}
29172921

2922+
void Handle(TEvPrivate::TEvRestartComplete::TPtr&) {
2923+
++TabletsDone;
2924+
CheckCompletion();
2925+
}
2926+
29182927
STATEFN(StateWork) {
29192928
switch (ev->GetTypeRewrite()) {
29202929
cFunc(TEvents::TSystem::PoisonPill, PassAway);
@@ -3042,12 +3051,12 @@ class TTxMonEvent_ReassignTablet : public TTransactionBase<THive> {
30423051
continue;
30433052
}
30443053
if (Wait) {
3045-
tablet->ActorsToNotifyOnRestart.emplace_back(waitActorId); // volatile settings, will not persist upon restart
3054+
waitActor->AddTablet(tablet);
30463055
}
30473056
operations.emplace_back(new TEvHive::TEvReassignTablet(tablet->Id, channels, forcedGroupIds, Async));
30483057
}
30493058
if (Wait) {
3050-
waitActor->TabletsTotal = operations.size();
3059+
waitActor->CheckCompletion();
30513060
}
30523061
for (auto& op : operations) {
30533062
ctx.Send(Self->SelfId(), op.Release());

0 commit comments

Comments
 (0)