@@ -35,6 +35,7 @@ enum class ENodeFields : ui8 {
35
35
SubDomainKey,
36
36
DisconnectTime,
37
37
Database,
38
+ HasDisks,
38
39
COUNT
39
40
};
40
41
@@ -124,6 +125,7 @@ class TJsonNodes : public TViewerPipeClient {
124
125
Any,
125
126
Static,
126
127
Dynamic,
128
+ Storage,
127
129
};
128
130
EType Type = EType::Any;
129
131
@@ -660,6 +662,9 @@ class TJsonNodes : public TViewerPipeClient {
660
662
} else if (params.Get (" type" ) == " dynamic" ) {
661
663
Type = EType::Dynamic;
662
664
FieldsRequired.set (+ENodeFields::NodeInfo);
665
+ } else if (params.Get (" type" ) == " storage" ) {
666
+ Type = EType::Storage;
667
+ FieldsRequired.set (+ENodeFields::NodeInfo);
663
668
} else if (params.Get (" type" ) == " any" ) {
664
669
Type = EType::Any;
665
670
}
@@ -866,6 +871,42 @@ class TJsonNodes : public TViewerPipeClient {
866
871
if (FilterStorageStage != EFilterStorageStage::None) {
867
872
return ;
868
873
}
874
+ if (((Type == EType::Static || Type == EType::Dynamic) && FieldsAvailable.test (+ENodeFields::NodeInfo)) || (Type == EType::Storage && FieldsAvailable.test (+ENodeFields::HasDisks))) {
875
+ TNodeView nodeView;
876
+ switch (Type) {
877
+ case EType::Static:
878
+ for (TNode* node : NodeView) {
879
+ if (node->IsStatic ()) {
880
+ nodeView.push_back (node);
881
+ }
882
+ }
883
+ break ;
884
+ case EType::Dynamic:
885
+ for (TNode* node : NodeView) {
886
+ if (!node->IsStatic ()) {
887
+ nodeView.push_back (node);
888
+ }
889
+ }
890
+ break ;
891
+ case EType::Storage:
892
+ for (TNode* node : NodeView) {
893
+ if (node->HasDisks ) {
894
+ nodeView.push_back (node);
895
+ }
896
+ }
897
+ break ;
898
+ case EType::Any:
899
+ break ;
900
+ }
901
+ NodeView.swap (nodeView);
902
+ FoundNodes = TotalNodes = NodeView.size ();
903
+ Type = EType::Any;
904
+ InvalidateNodes ();
905
+ }
906
+ // storage/nodes pre-filter, affects TotalNodes count
907
+ if (Type != EType::Any) {
908
+ return ;
909
+ }
869
910
if (!FilterNodeIds.empty () && FieldsAvailable.test (+ENodeFields::NodeId)) {
870
911
TNodeView nodeView;
871
912
for (TNode* node : NodeView) {
@@ -901,17 +942,6 @@ class TJsonNodes : public TViewerPipeClient {
901
942
With = EWith::Everything;
902
943
InvalidateNodes ();
903
944
}
904
- if (Type != EType::Any && FieldsAvailable.test (+ENodeFields::NodeInfo)) {
905
- TNodeView nodeView;
906
- for (TNode* node : NodeView) {
907
- if ((Type == EType::Static && node->IsStatic ()) || (Type == EType::Dynamic && !node->IsStatic ())) {
908
- nodeView.push_back (node);
909
- }
910
- }
911
- NodeView.swap (nodeView);
912
- Type = EType::Any;
913
- InvalidateNodes ();
914
- }
915
945
if (ProblemNodesOnly && FieldsAvailable.test (+ENodeFields::SystemState)) {
916
946
TNodeView nodeView;
917
947
for (TNode* node : NodeView) {
@@ -1021,6 +1051,7 @@ class TJsonNodes : public TViewerPipeClient {
1021
1051
case ENodeFields::CPU:
1022
1052
case ENodeFields::LoadAverage:
1023
1053
case ENodeFields::DisconnectTime:
1054
+ case ENodeFields::HasDisks:
1024
1055
break ;
1025
1056
}
1026
1057
}
@@ -1088,6 +1119,7 @@ class TJsonNodes : public TViewerPipeClient {
1088
1119
case ENodeFields::Tablets:
1089
1120
case ENodeFields::SubDomainKey:
1090
1121
case ENodeFields::DisconnectTime:
1122
+ case ENodeFields::HasDisks:
1091
1123
case ENodeFields::COUNT:
1092
1124
break ;
1093
1125
}
@@ -1553,6 +1585,7 @@ class TJsonNodes : public TViewerPipeClient {
1553
1585
++slots;
1554
1586
MaximumSlotsPerDisk = std::max (MaximumSlotsPerDisk.value_or (0 ), slots);
1555
1587
}
1588
+ FieldsAvailable.set (+ENodeFields::HasDisks);
1556
1589
FilterStorageStage = EFilterStorageStage::None;
1557
1590
ApplyEverything ();
1558
1591
} else {
@@ -1576,6 +1609,7 @@ class TJsonNodes : public TViewerPipeClient {
1576
1609
for (TNode* node : NodeView) {
1577
1610
node->CalcDisks ();
1578
1611
}
1612
+ FieldsAvailable.set (+ENodeFields::HasDisks);
1579
1613
FieldsAvailable.set (+ENodeFields::Missing);
1580
1614
FieldsAvailable.set (+ENodeFields::DiskSpaceUsage);
1581
1615
} else {
@@ -2288,6 +2322,7 @@ class TJsonNodes : public TViewerPipeClient {
2288
2322
return nodes of specific type:
2289
2323
* `static`
2290
2324
* `dynamic`
2325
+ * `storage`
2291
2326
* `any`
2292
2327
- name: with
2293
2328
in: query
0 commit comments