Skip to content

Commit af3c4bb

Browse files
committed
fix follower filter in tablet info handler (#15988)
1 parent cb772cf commit af3c4bb

File tree

2 files changed

+26
-20
lines changed

2 files changed

+26
-20
lines changed

ydb/core/tablet/node_whiteboard.cpp

Lines changed: 15 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -841,14 +841,25 @@ class TNodeWhiteboardService : public TActorBootstrapped<TNodeWhiteboardService>
841841
}
842842
}
843843

844+
static std::unordered_set<TTabletId> BuildIndex(const ::google::protobuf::RepeatedField<::NProtoBuf::uint64>& array) {
845+
std::unordered_set<TTabletId> result;
846+
result.reserve(array.size());
847+
for (auto id : array) {
848+
result.insert(id);
849+
}
850+
return result;
851+
}
852+
844853
void Handle(TEvWhiteboard::TEvTabletStateRequest::TPtr &ev, const TActorContext &ctx) {
845854
auto now = TMonotonic::Now();
846855
const auto& request = ev->Get()->Record;
847856
auto matchesFilter = [
848857
changedSince = request.has_changedsince() ? request.changedsince() : 0,
858+
filterTabletId = BuildIndex(request.filtertabletid()),
849859
filterTenantId = request.has_filtertenantid() ? NKikimr::TSubDomainKey(request.filtertenantid()) : NKikimr::TSubDomainKey()
850860
](const NKikimrWhiteboard::TTabletStateInfo& tabletStateInfo) {
851861
return tabletStateInfo.changetime() >= changedSince
862+
&& (filterTabletId.empty() || filterTabletId.count(tabletStateInfo.tabletid()))
852863
&& (!filterTenantId || filterTenantId == NKikimr::TSubDomainKey(tabletStateInfo.tenantid()));
853864
};
854865
std::unique_ptr<TEvWhiteboard::TEvTabletStateResponse> response = std::make_unique<TEvWhiteboard::TEvTabletStateResponse>();
@@ -871,22 +882,10 @@ class TNodeWhiteboardService : public TActorBootstrapped<TNodeWhiteboardService>
871882
}
872883
} else {
873884
if (request.groupby().empty()) {
874-
if (request.filtertabletid_size() == 0) {
875-
for (const auto& pr : TabletStateInfo) {
876-
if (matchesFilter(pr.second)) {
877-
NKikimrWhiteboard::TTabletStateInfo& tabletStateInfo = *record.add_tabletstateinfo();
878-
Copy(tabletStateInfo, pr.second, request);
879-
}
880-
}
881-
} else {
882-
for (auto tabletId : request.filtertabletid()) {
883-
auto it = TabletStateInfo.find({tabletId, 0});
884-
if (it != TabletStateInfo.end()) {
885-
if (matchesFilter(it->second)) {
886-
NKikimrWhiteboard::TTabletStateInfo& tabletStateInfo = *record.add_tabletstateinfo();
887-
Copy(tabletStateInfo, it->second, request);
888-
}
889-
}
885+
for (const auto& pr : TabletStateInfo) {
886+
if (matchesFilter(pr.second)) {
887+
NKikimrWhiteboard::TTabletStateInfo& tabletStateInfo = *record.add_tabletstateinfo();
888+
Copy(tabletStateInfo, pr.second, request);
890889
}
891890
}
892891
} else if (request.groupby() == "Type,State" || request.groupby() == "NodeId,Type,State") { // the only supported group-by for now

ydb/core/viewer/viewer_tabletinfo.h

Lines changed: 11 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -71,6 +71,7 @@ class TJsonTabletInfo : public TJsonWhiteboardRequest<TEvWhiteboard::TEvTabletSt
7171
using TBase = TJsonWhiteboardRequest<TEvWhiteboard::TEvTabletStateRequest, TEvWhiteboard::TEvTabletStateResponse>;
7272
using TThis = TJsonTabletInfo;
7373
THashMap<ui64, NKikimrTabletBase::TTabletTypes::EType> Tablets;
74+
std::unordered_set<ui64> DeadTablets;
7475
std::unordered_map<ui64, TString> EndOfRangeKeyPrefix;
7576
TTabletId HiveId = 0;
7677
bool IsBase64Encode = true;
@@ -365,6 +366,12 @@ class TJsonTabletInfo : public TJsonWhiteboardRequest<TEvWhiteboard::TEvTabletSt
365366

366367
virtual void FilterResponse(NKikimrWhiteboard::TEvTabletStateResponse& response) override {
367368
if (!Tablets.empty()) {
369+
if (ReplyWithDeadTabletsInfo) {
370+
DeadTablets.reserve(Tablets.size());
371+
for (const auto& [tabletId, tabletType] : Tablets) {
372+
DeadTablets.insert(tabletId);
373+
}
374+
}
368375
NKikimrWhiteboard::TEvTabletStateResponse result;
369376
for (const NKikimrWhiteboard::TTabletStateInfo& info : response.GetTabletStateInfo()) {
370377
auto tablet = Tablets.find(info.GetTabletId());
@@ -375,15 +382,15 @@ class TJsonTabletInfo : public TJsonWhiteboardRequest<TEvWhiteboard::TEvTabletSt
375382
if (itKey != EndOfRangeKeyPrefix.end()) {
376383
tabletInfo->SetEndOfRangeKeyPrefix(itKey->second);
377384
}
378-
Tablets.erase(tablet->first);
385+
DeadTablets.erase(tablet->first);
379386
}
380387
}
381388
if (ReplyWithDeadTabletsInfo) {
382-
for (auto tablet : Tablets) {
389+
for (auto tabletId : DeadTablets) {
383390
auto deadTablet = result.MutableTabletStateInfo()->Add();
384-
deadTablet->SetTabletId(tablet.first);
391+
deadTablet->SetTabletId(tabletId);
385392
deadTablet->SetState(NKikimrWhiteboard::TTabletStateInfo::Dead);
386-
deadTablet->SetType(tablet.second);
393+
deadTablet->SetType(Tablets[tabletId]);
387394
deadTablet->SetHiveId(HiveId);
388395
if (FilterTenantId) {
389396
deadTablet->MutableTenantId()->CopyFrom(FilterTenantId);

0 commit comments

Comments
 (0)