aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorAlexey Efimov <xeno@ydb.tech>2024-09-05 17:00:23 +0300
committerGitHub <noreply@github.com>2024-09-05 14:00:23 +0000
commitf2c3c58a54d95ce32b528ddf29227d65a1f4c5b1 (patch)
tree25a0a8de60919e1397ecc8a9afc6ec2f61b607ed
parentfc3d2c374a2329a40b61102a958c275f61562629 (diff)
downloadydb-f2c3c58a54d95ce32b528ddf29227d65a1f4c5b1.tar.gz
Fix tablets on nodes (#8790)
-rw-r--r--ydb/core/viewer/protos/viewer.proto1
-rw-r--r--ydb/core/viewer/viewer_nodes.h24
-rw-r--r--ydb/core/viewer/viewer_request.cpp78
3 files changed, 90 insertions, 13 deletions
diff --git a/ydb/core/viewer/protos/viewer.proto b/ydb/core/viewer/protos/viewer.proto
index f219d030ff5..e42033d223e 100644
--- a/ydb/core/viewer/protos/viewer.proto
+++ b/ydb/core/viewer/protos/viewer.proto
@@ -641,6 +641,7 @@ message TSchemeCacheRequest {
message TEvViewerRequest {
TNodeLocation Location = 1;
uint32 Timeout = 2; // ms
+ string MergeFields = 3;
oneof Request {
NKikimrWhiteboard.TEvTabletStateRequest TabletRequest = 11;
NKikimrWhiteboard.TEvSystemStateRequest SystemRequest = 12;
diff --git a/ydb/core/viewer/viewer_nodes.h b/ydb/core/viewer/viewer_nodes.h
index 06e6ec65124..ec1ac572e9e 100644
--- a/ydb/core/viewer/viewer_nodes.h
+++ b/ydb/core/viewer/viewer_nodes.h
@@ -1367,7 +1367,9 @@ public:
for (TTabletId hiveId : HivesToAsk) {
auto request = std::make_unique<TEvHive::TEvRequestHiveNodeStats>();
request->Record.SetReturnMetrics(true);
- request->Record.SetReturnExtendedTabletInfo(true);
+ if (Database) { // it's better to ask hive about tablets only if we're filtering by database
+ request->Record.SetReturnExtendedTabletInfo(true);
+ }
if (AskHiveAboutPaths) {
request->Record.SetFilterTabletsBySchemeShardId(FilterPathId.OwnerId);
request->Record.SetFilterTabletsByPathId(FilterPathId.LocalPathId);
@@ -1386,12 +1388,14 @@ public:
ui32 nodeId = nodeStats.GetNodeId();
TNode* node = FindNode(nodeId);
if (node) {
- for (const NKikimrHive::THiveDomainStatsStateCount& stateStats : nodeStats.GetStateStats()) {
- NKikimrViewer::TTabletStateInfo& viewerTablet(node->Tablets.emplace_back());
- viewerTablet.SetType(NKikimrTabletBase::TTabletTypes::EType_Name(stateStats.GetTabletType()));
- viewerTablet.SetCount(stateStats.GetCount());
- viewerTablet.SetState(GetFlagFromTabletState(stateStats.GetVolatileState()));
- FieldsAvailable.set(+ENodeFields::Tablets);
+ if (Database) { // it's better to ask hive about tablets only if we're filtering by database
+ for (const NKikimrHive::THiveDomainStatsStateCount& stateStats : nodeStats.GetStateStats()) {
+ NKikimrViewer::TTabletStateInfo& viewerTablet(node->Tablets.emplace_back());
+ viewerTablet.SetType(NKikimrTabletBase::TTabletTypes::EType_Name(stateStats.GetTabletType()));
+ viewerTablet.SetCount(stateStats.GetCount());
+ viewerTablet.SetState(GetFlagFromTabletState(stateStats.GetVolatileState()));
+ FieldsAvailable.set(+ENodeFields::Tablets);
+ }
}
if (nodeStats.HasLastAliveTimestamp()) {
node->SystemState.SetDisconnectTime(std::max(node->SystemState.GetDisconnectTime(), nodeStats.GetLastAliveTimestamp() / 1000)); // seconds
@@ -1648,10 +1652,14 @@ public:
if (FieldsNeeded(FieldsTablets)) {
for (auto& [nodeId, response] : TabletViewerResponse) {
if (response.IsOk()) {
+ Cerr << "Good tablet response for node " << nodeId << Endl;
+ Cerr << "LocationResponded: " << response.Get()->Record.GetLocationResponded().ShortDebugString() << Endl;
auto& tabletResponse(*(response.Get()->Record.MutableTabletResponse()));
if (tabletResponse.TabletStateInfoSize() > 0 && !tabletResponse.GetTabletStateInfo(0).HasCount()) {
+ Cerr << "TabletResponse before merge: " << tabletResponse.ShortDebugString() << Endl;
GroupWhiteboardResponses(tabletResponse, "NodeId,Type,State");
}
+ Cerr << "TabletResponse: " << tabletResponse.ShortDebugString() << Endl;
for (const auto& tabletState : tabletResponse.GetTabletStateInfo()) {
TNode* node = FindNode(tabletState.GetNodeId());
if (node) {
@@ -1663,6 +1671,8 @@ public:
}
}
}
+ } else {
+ Cerr << "Bad tablet response for node " << nodeId << Endl;
}
}
for (auto& [nodeId, response] : TabletStateResponse) {
diff --git a/ydb/core/viewer/viewer_request.cpp b/ydb/core/viewer/viewer_request.cpp
index a6abd5c1b49..24f4a42d8d3 100644
--- a/ydb/core/viewer/viewer_request.cpp
+++ b/ydb/core/viewer/viewer_request.cpp
@@ -36,7 +36,7 @@ public:
}
void Bootstrap() override {
- TBase::RequestSettings.MergeFields = TWhiteboardInfo<TResponseType>::GetDefaultMergeField();
+ TBase::RequestSettings.MergeFields = Event->Get()->Record.GetMergeFields();
TBase::RequestSettings.Timeout = Event->Get()->Record.GetTimeout();
for (TNodeId nodeId : Event->Get()->Record.GetLocation().GetNodeId()) {
TBase::RequestSettings.FilterNodeIds.push_back(nodeId);
@@ -74,15 +74,26 @@ public:
NKikimr::NViewer::MergeWhiteboardResponses(*(response->Record.MutableBSGroupResponse()), perNodeStateInfo, fields);
}
+ static void Merge(NKikimrViewer::TEvViewerResponse& viewerResponse, TNodeId nodeId, TResponseType& nodeResponse);
+
void ReplyAndPassAway() override {
auto response = MakeHolder<TEvViewer::TEvViewerResponse>();
auto& locationResponded = (*response->Record.MutableLocationResponded());
- auto perNodeStateInfo = TBase::GetPerNodeStateInfo();
- for (const auto& [nodeId, nodeResponse] : perNodeStateInfo) {
- locationResponded.AddNodeId(nodeId);
- }
- MergeWhiteboardResponses(response.Get(), perNodeStateInfo, TBase::RequestSettings.MergeFields);
+ if (TBase::RequestSettings.MergeFields) {
+ auto perNodeStateInfo = TBase::GetPerNodeStateInfo();
+ for (const auto& [nodeId, nodeResponse] : perNodeStateInfo) {
+ locationResponded.AddNodeId(nodeId);
+ }
+ MergeWhiteboardResponses(response.Get(), perNodeStateInfo, TBase::RequestSettings.MergeFields);
+ } else {
+ for (auto& [nodeId, nodeResponse] : TBase::NodeResponses) {
+ if (nodeResponse.IsOk()) {
+ locationResponded.AddNodeId(nodeId);
+ Merge(response->Record, nodeId, nodeResponse.Get()->Record);
+ }
+ }
+ }
TBase::Send(Event->Sender, response.Release(), 0, Event->Cookie);
TBase::PassAway();
@@ -121,6 +132,17 @@ THolder<TEvWhiteboard::TEvTabletStateRequest> TViewerWhiteboardRequest<TEvWhiteb
}
template<>
+void TViewerWhiteboardRequest<TEvWhiteboard::TEvTabletStateRequest, TEvWhiteboard::TEvTabletStateResponse>::Merge(
+ NKikimrViewer::TEvViewerResponse& viewerResponse, TNodeId nodeId, NKikimrWhiteboard::TEvTabletStateResponse& nodeResponse) {
+ auto& target = *viewerResponse.MutableTabletResponse();
+ for (auto& info : *nodeResponse.MutableTabletStateInfo()) {
+ auto& i = *target.AddTabletStateInfo();
+ i.MergeFrom(info);
+ i.SetNodeId(nodeId);
+ }
+}
+
+template<>
THolder<TEvWhiteboard::TEvSystemStateRequest> TViewerWhiteboardRequest<TEvWhiteboard::TEvSystemStateRequest, TEvWhiteboard::TEvSystemStateResponse>::BuildRequest() {
auto request = TBase::BuildRequest();
request->Record.MergeFrom(Event->Get()->Record.GetSystemRequest());
@@ -128,6 +150,17 @@ THolder<TEvWhiteboard::TEvSystemStateRequest> TViewerWhiteboardRequest<TEvWhiteb
}
template<>
+void TViewerWhiteboardRequest<TEvWhiteboard::TEvSystemStateRequest, TEvWhiteboard::TEvSystemStateResponse>::Merge(
+ NKikimrViewer::TEvViewerResponse& viewerResponse, TNodeId nodeId, NKikimrWhiteboard::TEvSystemStateResponse& nodeResponse) {
+ auto& target = *viewerResponse.MutableSystemResponse();
+ for (auto& info : *nodeResponse.MutableSystemStateInfo()) {
+ auto& i = *target.AddSystemStateInfo();
+ i.MergeFrom(info);
+ i.SetNodeId(nodeId);
+ }
+}
+
+template<>
THolder<TEvWhiteboard::TEvVDiskStateRequest> TViewerWhiteboardRequest<TEvWhiteboard::TEvVDiskStateRequest, TEvWhiteboard::TEvVDiskStateResponse>::BuildRequest() {
auto request = TBase::BuildRequest();
request->Record.MergeFrom(Event->Get()->Record.GetVDiskRequest());
@@ -135,6 +168,17 @@ THolder<TEvWhiteboard::TEvVDiskStateRequest> TViewerWhiteboardRequest<TEvWhitebo
}
template<>
+void TViewerWhiteboardRequest<TEvWhiteboard::TEvVDiskStateRequest, TEvWhiteboard::TEvVDiskStateResponse>::Merge(
+ NKikimrViewer::TEvViewerResponse& viewerResponse, TNodeId nodeId, NKikimrWhiteboard::TEvVDiskStateResponse& nodeResponse) {
+ auto& target = *viewerResponse.MutableVDiskResponse();
+ for (auto& info : *nodeResponse.MutableVDiskStateInfo()) {
+ auto& i = *target.AddVDiskStateInfo();
+ i.MergeFrom(info);
+ i.SetNodeId(nodeId);
+ }
+}
+
+template<>
THolder<TEvWhiteboard::TEvPDiskStateRequest> TViewerWhiteboardRequest<TEvWhiteboard::TEvPDiskStateRequest, TEvWhiteboard::TEvPDiskStateResponse>::BuildRequest() {
auto request = TBase::BuildRequest();
request->Record.MergeFrom(Event->Get()->Record.GetPDiskRequest());
@@ -142,12 +186,34 @@ THolder<TEvWhiteboard::TEvPDiskStateRequest> TViewerWhiteboardRequest<TEvWhitebo
}
template<>
+void TViewerWhiteboardRequest<TEvWhiteboard::TEvPDiskStateRequest, TEvWhiteboard::TEvPDiskStateResponse>::Merge(
+ NKikimrViewer::TEvViewerResponse& viewerResponse, TNodeId nodeId, NKikimrWhiteboard::TEvPDiskStateResponse& nodeResponse) {
+ auto& target = *viewerResponse.MutablePDiskResponse();
+ for (auto& info : *nodeResponse.MutablePDiskStateInfo()) {
+ auto& i = *target.AddPDiskStateInfo();
+ i.MergeFrom(info);
+ i.SetNodeId(nodeId);
+ }
+}
+
+template<>
THolder<TEvWhiteboard::TEvBSGroupStateRequest> TViewerWhiteboardRequest<TEvWhiteboard::TEvBSGroupStateRequest, TEvWhiteboard::TEvBSGroupStateResponse>::BuildRequest() {
auto request = TBase::BuildRequest();
request->Record.MergeFrom(Event->Get()->Record.GetBSGroupRequest());
return request;
}
+template<>
+void TViewerWhiteboardRequest<TEvWhiteboard::TEvBSGroupStateRequest, TEvWhiteboard::TEvBSGroupStateResponse>::Merge(
+ NKikimrViewer::TEvViewerResponse& viewerResponse, TNodeId nodeId, NKikimrWhiteboard::TEvBSGroupStateResponse& nodeResponse) {
+ auto& target = *viewerResponse.MutableBSGroupResponse();
+ for (auto& info : *nodeResponse.MutableBSGroupStateInfo()) {
+ auto& i = *target.AddBSGroupStateInfo();
+ i.MergeFrom(info);
+ i.SetNodeId(nodeId);
+ }
+}
+
bool IsPostContent(const NMon::TEvHttpInfo::TPtr& event) {
if (event->Get()->Request.GetMethod() == HTTP_METHOD_POST) {
const THttpHeaders& headers = event->Get()->Request.GetHeaders();