From 2a4dd035c6bfb69d02c4e74f026b0e81f99ae096 Mon Sep 17 00:00:00 2001 From: Alexey Efimov Date: Thu, 20 Mar 2025 04:42:01 +0000 Subject: [PATCH] fix follower filter in tablet info handler --- ydb/core/tablet/node_whiteboard.cpp | 31 ++++++++++++++--------------- ydb/core/viewer/viewer_tabletinfo.h | 15 ++++++++++---- 2 files changed, 26 insertions(+), 20 deletions(-) diff --git a/ydb/core/tablet/node_whiteboard.cpp b/ydb/core/tablet/node_whiteboard.cpp index 0a0b8db4a15a..fb38f7a72863 100644 --- a/ydb/core/tablet/node_whiteboard.cpp +++ b/ydb/core/tablet/node_whiteboard.cpp @@ -841,14 +841,25 @@ class TNodeWhiteboardService : public TActorBootstrapped } } + static std::unordered_set BuildIndex(const ::google::protobuf::RepeatedField<::NProtoBuf::uint64>& array) { + std::unordered_set result; + result.reserve(array.size()); + for (auto id : array) { + result.insert(id); + } + return result; + } + void Handle(TEvWhiteboard::TEvTabletStateRequest::TPtr &ev, const TActorContext &ctx) { auto now = TMonotonic::Now(); const auto& request = ev->Get()->Record; auto matchesFilter = [ changedSince = request.has_changedsince() ? request.changedsince() : 0, + filterTabletId = BuildIndex(request.filtertabletid()), filterTenantId = request.has_filtertenantid() ? NKikimr::TSubDomainKey(request.filtertenantid()) : NKikimr::TSubDomainKey() ](const NKikimrWhiteboard::TTabletStateInfo& tabletStateInfo) { return tabletStateInfo.changetime() >= changedSince + && (filterTabletId.empty() || filterTabletId.count(tabletStateInfo.tabletid())) && (!filterTenantId || filterTenantId == NKikimr::TSubDomainKey(tabletStateInfo.tenantid())); }; std::unique_ptr response = std::make_unique(); @@ -871,22 +882,10 @@ class TNodeWhiteboardService : public TActorBootstrapped } } else { if (request.groupby().empty()) { - if (request.filtertabletid_size() == 0) { - for (const auto& pr : TabletStateInfo) { - if (matchesFilter(pr.second)) { - NKikimrWhiteboard::TTabletStateInfo& tabletStateInfo = *record.add_tabletstateinfo(); - Copy(tabletStateInfo, pr.second, request); - } - } - } else { - for (auto tabletId : request.filtertabletid()) { - auto it = TabletStateInfo.find({tabletId, 0}); - if (it != TabletStateInfo.end()) { - if (matchesFilter(it->second)) { - NKikimrWhiteboard::TTabletStateInfo& tabletStateInfo = *record.add_tabletstateinfo(); - Copy(tabletStateInfo, it->second, request); - } - } + for (const auto& pr : TabletStateInfo) { + if (matchesFilter(pr.second)) { + NKikimrWhiteboard::TTabletStateInfo& tabletStateInfo = *record.add_tabletstateinfo(); + Copy(tabletStateInfo, pr.second, request); } } } else if (request.groupby() == "Type,State" || request.groupby() == "NodeId,Type,State") { // the only supported group-by for now diff --git a/ydb/core/viewer/viewer_tabletinfo.h b/ydb/core/viewer/viewer_tabletinfo.h index a8f819fa58b9..144eca317003 100644 --- a/ydb/core/viewer/viewer_tabletinfo.h +++ b/ydb/core/viewer/viewer_tabletinfo.h @@ -71,6 +71,7 @@ class TJsonTabletInfo : public TJsonWhiteboardRequest; using TThis = TJsonTabletInfo; THashMap Tablets; + std::unordered_set DeadTablets; std::unordered_map EndOfRangeKeyPrefix; TTabletId HiveId = 0; bool IsBase64Encode = true; @@ -365,6 +366,12 @@ class TJsonTabletInfo : public TJsonWhiteboardRequestSetEndOfRangeKeyPrefix(itKey->second); } - Tablets.erase(tablet->first); + DeadTablets.erase(tablet->first); } } if (ReplyWithDeadTabletsInfo) { - for (auto tablet : Tablets) { + for (auto tabletId : DeadTablets) { auto deadTablet = result.MutableTabletStateInfo()->Add(); - deadTablet->SetTabletId(tablet.first); + deadTablet->SetTabletId(tabletId); deadTablet->SetState(NKikimrWhiteboard::TTabletStateInfo::Dead); - deadTablet->SetType(tablet.second); + deadTablet->SetType(Tablets[tabletId]); deadTablet->SetHiveId(HiveId); if (FilterTenantId) { deadTablet->MutableTenantId()->CopyFrom(FilterTenantId);