@@ -72,14 +72,17 @@ class TJsonNodes : public TViewerPipeClient {
72
72
73
73
std::optional<TRequestResponse<TEvInterconnect::TEvNodesInfo>> NodesInfoResponse;
74
74
std::optional<TRequestResponse<TEvWhiteboard::TEvNodeStateResponse>> NodeStateResponse;
75
- std::optional<TRequestResponse<TEvStateStorage::TEvBoardInfo>> DatabaseBoardInfoResponse;
76
- std::optional<TRequestResponse<TEvStateStorage::TEvBoardInfo>> ResourceBoardInfoResponse;
77
75
std::optional<TRequestResponse<TEvTxProxySchemeCache::TEvNavigateKeySetResult>> PathNavigateResponse;
78
76
std::unordered_map<TTabletId, TRequestResponse<TEvHive::TEvResponseHiveNodeStats>> HiveNodeStats;
79
77
bool HiveNodeStatsProcessed = false ;
80
78
std::vector<TTabletId> HivesToAsk;
81
79
bool AskHiveAboutPaths = false ;
82
80
bool DatabaseNavigateProcessed = false ;
81
+ bool ResourceNavigateProcessed = false ;
82
+ bool PathNavigateProcessed = false ;
83
+ bool DatabaseBoardInfoProcessed = false ;
84
+ bool ResourceBoardInfoProcessed = false ;
85
+ bool PDisksProcessed = false ;
83
86
84
87
std::optional<TRequestResponse<NSysView::TEvSysView::TEvGetStoragePoolsResponse>> StoragePoolsResponse;
85
88
std::optional<TRequestResponse<NSysView::TEvSysView::TEvGetGroupsResponse>> GroupsResponse;
@@ -113,6 +116,7 @@ class TJsonNodes : public TViewerPipeClient {
113
116
TString SharedDatabase;
114
117
bool FilterDatabase = false ;
115
118
bool HasDatabaseNodes = false ;
119
+ bool HasSharedNodes = false ;
116
120
TPathId FilterPathId;
117
121
TSubDomainKey SubDomainKey;
118
122
TSubDomainKey SharedSubDomainKey;
@@ -150,6 +154,7 @@ class TJsonNodes : public TViewerPipeClient {
150
154
Pools,
151
155
Groups,
152
156
VSlots,
157
+ DoneOrError,
153
158
};
154
159
155
160
enum class EPeerRole {
@@ -1090,7 +1095,7 @@ class TJsonNodes : public TViewerPipeClient {
1090
1095
if (!DatabaseNavigateResponse) {
1091
1096
DatabaseNavigateResponse = MakeRequestSchemeCacheNavigate (Database, ENavigateRequestDatabase);
1092
1097
}
1093
- if (!FieldsNeeded (FieldsHiveNodeStat) && !(FilterPath && FieldsNeeded (FieldsTablets))) {
1098
+ if (!DatabaseBoardInfoResponse && ! FieldsNeeded (FieldsHiveNodeStat) && !(FilterPath && FieldsNeeded (FieldsTablets))) {
1094
1099
DatabaseBoardInfoResponse = MakeRequestStateStorageEndpointsLookup (Database, EBoardInfoRequestDatabase);
1095
1100
}
1096
1101
if ((Type == EType::Storage || Type == EType::Static) && FilterStoragePools.empty () && FilterGroupIds.empty ()) {
@@ -1177,13 +1182,13 @@ class TJsonNodes : public TViewerPipeClient {
1177
1182
if (FilterDatabase) {
1178
1183
if (FilterSubDomainKey && FieldsAvailable.test (+ENodeFields::SubDomainKey)) {
1179
1184
TNodeView nodeView;
1180
- if (HasDatabaseNodes) {
1185
+ if (HasDatabaseNodes || !HasSharedNodes ) {
1181
1186
for (TNode* node : NodeView) {
1182
1187
if (node->HasSubDomainKey (SubDomainKey)) {
1183
1188
nodeView.push_back (node);
1184
1189
}
1185
1190
}
1186
- } else {
1191
+ } else if (HasSharedNodes) {
1187
1192
for (TNode* node : NodeView) {
1188
1193
if (node->HasSubDomainKey (SharedSubDomainKey)) {
1189
1194
nodeView.push_back (node);
@@ -1194,16 +1199,16 @@ class TJsonNodes : public TViewerPipeClient {
1194
1199
FoundNodes = TotalNodes = NodeView.size ();
1195
1200
InvalidateNodes ();
1196
1201
FilterDatabase = false ;
1197
- AddEvent (" PreFilter Applied" );
1202
+ AddEvent (" PreFilter SubDomain Applied" );
1198
1203
} else if (FieldsAvailable.test (+ENodeFields::Database)) {
1199
1204
TNodeView nodeView;
1200
- if (HasDatabaseNodes) {
1205
+ if (HasDatabaseNodes || !HasSharedNodes ) {
1201
1206
for (TNode* node : NodeView) {
1202
1207
if (node->HasDatabase (Database)) {
1203
1208
nodeView.push_back (node);
1204
1209
}
1205
1210
}
1206
- } else {
1211
+ } else if (HasSharedNodes) {
1207
1212
for (TNode* node : NodeView) {
1208
1213
if (node->HasDatabase (SharedDatabase)) {
1209
1214
nodeView.push_back (node);
@@ -1214,7 +1219,7 @@ class TJsonNodes : public TViewerPipeClient {
1214
1219
FoundNodes = TotalNodes = NodeView.size ();
1215
1220
InvalidateNodes ();
1216
1221
FilterDatabase = false ;
1217
- AddEvent (" PreFilter Applied" );
1222
+ AddEvent (" PreFilter Database Applied" );
1218
1223
} else {
1219
1224
return ;
1220
1225
}
@@ -1666,7 +1671,7 @@ class TJsonNodes : public TViewerPipeClient {
1666
1671
if (PathNavigateResponse && !PathNavigateResponse->IsDone ()) {
1667
1672
return false ;
1668
1673
}
1669
- return CurrentTimeoutState < TimeoutTablets ;
1674
+ return true ;
1670
1675
}
1671
1676
1672
1677
bool TimeToAskWhiteboard () {
@@ -1840,7 +1845,7 @@ class TJsonNodes : public TViewerPipeClient {
1840
1845
DatabaseNavigateProcessed = true ;
1841
1846
}
1842
1847
1843
- if (ResourceNavigateResponse && ResourceNavigateResponse->IsDone ()) { // database hive and subdomain key
1848
+ if (ResourceNavigateResponse && ResourceNavigateResponse->IsDone () && !ResourceNavigateProcessed ) { // database hive and subdomain key
1844
1849
if (ResourceNavigateResponse->IsOk ()) {
1845
1850
auto * ev = ResourceNavigateResponse->Get ();
1846
1851
if (ev->Request ->ResultSet .size () == 1 && ev->Request ->ResultSet .begin ()->Status == NSchemeCache::TSchemeCacheNavigate::EStatus::Ok) {
@@ -1862,17 +1867,19 @@ class TJsonNodes : public TViewerPipeClient {
1862
1867
}
1863
1868
}
1864
1869
} else {
1865
- ResourceBoardInfoResponse = MakeRequestStateStorageEndpointsLookup (path, EBoardInfoRequestResource);
1870
+ if (!ResourceBoardInfoResponse) {
1871
+ ResourceBoardInfoResponse = MakeRequestStateStorageEndpointsLookup (path, EBoardInfoRequestResource);
1872
+ }
1866
1873
}
1867
1874
}
1868
1875
} else {
1869
1876
NodeView.clear ();
1870
1877
AddProblem (" no-shared-database-info" );
1871
1878
}
1872
- ResourceNavigateResponse. reset () ;
1879
+ ResourceNavigateProcessed = true ;
1873
1880
}
1874
1881
1875
- if (PathNavigateResponse && PathNavigateResponse->IsDone ()) { // filter path id
1882
+ if (PathNavigateResponse && PathNavigateResponse->IsDone () && !PathNavigateProcessed ) { // filter path id
1876
1883
if (PathNavigateResponse->IsOk ()) {
1877
1884
auto * ev = PathNavigateResponse->Get ();
1878
1885
if (ev->Request ->ResultSet .size () == 1 && ev->Request ->ResultSet .begin ()->Status == NSchemeCache::TSchemeCacheNavigate::EStatus::Ok) {
@@ -1901,10 +1908,10 @@ class TJsonNodes : public TViewerPipeClient {
1901
1908
} else {
1902
1909
AddProblem (" no-path-info" );
1903
1910
}
1904
- PathNavigateResponse. reset () ;
1911
+ PathNavigateProcessed = true ;
1905
1912
}
1906
1913
1907
- if (DatabaseBoardInfoResponse && DatabaseBoardInfoResponse->IsDone () && TotalNodes > 0 ) {
1914
+ if (DatabaseBoardInfoResponse && DatabaseBoardInfoResponse->IsDone () && TotalNodes > 0 && !DatabaseBoardInfoProcessed ) {
1908
1915
if (DatabaseBoardInfoResponse->IsOk () && DatabaseBoardInfoResponse->Get ()->Status == TEvStateStorage::TEvBoardInfo::EStatus::Ok) {
1909
1916
TString database = GetDatabaseFromEndpointsBoardPath (DatabaseBoardInfoResponse->Get ()->Path );
1910
1917
for (const auto & entry : DatabaseBoardInfoResponse->Get ()->InfoEntries ) {
@@ -1921,10 +1928,10 @@ class TJsonNodes : public TViewerPipeClient {
1921
1928
} else {
1922
1929
AddProblem (" no-database-board-info" );
1923
1930
}
1924
- DatabaseBoardInfoResponse. reset () ;
1931
+ DatabaseBoardInfoProcessed = true ;
1925
1932
}
1926
1933
1927
- if (ResourceBoardInfoResponse && ResourceBoardInfoResponse->IsDone () && TotalNodes > 0 ) {
1934
+ if (ResourceBoardInfoResponse && ResourceBoardInfoResponse->IsDone () && TotalNodes > 0 && !ResourceBoardInfoProcessed ) {
1928
1935
if (ResourceBoardInfoResponse->IsOk () && ResourceBoardInfoResponse->Get ()->Status == TEvStateStorage::TEvBoardInfo::EStatus::Ok) {
1929
1936
TString database = GetDatabaseFromEndpointsBoardPath (ResourceBoardInfoResponse->Get ()->Path );
1930
1937
for (const auto & entry : ResourceBoardInfoResponse->Get ()->InfoEntries ) {
@@ -1933,14 +1940,15 @@ class TJsonNodes : public TViewerPipeClient {
1933
1940
if (node) {
1934
1941
node->Database = database;
1935
1942
node->GotDatabaseFromResourceBoardInfo = true ;
1943
+ HasSharedNodes = true ;
1936
1944
}
1937
1945
}
1938
1946
}
1939
1947
FieldsAvailable.set (+ENodeFields::Database);
1940
1948
} else {
1941
1949
AddProblem (" no-shared-database-board-info" );
1942
1950
}
1943
- ResourceBoardInfoResponse. reset () ;
1951
+ ResourceBoardInfoProcessed = true ;
1944
1952
}
1945
1953
1946
1954
if (!TimeToAskHive ()) {
@@ -1949,8 +1957,8 @@ class TJsonNodes : public TViewerPipeClient {
1949
1957
1950
1958
AddEvent (" TimeToAskHive" );
1951
1959
1952
- if (!HivesToAsk.empty ()) {
1953
- AddEvent (" HivesTokHive " );
1960
+ if (!HivesToAsk.empty () && CurrentTimeoutState < TimeoutTablets ) {
1961
+ AddEvent (" HivesToAsk " );
1954
1962
std::sort (HivesToAsk.begin (), HivesToAsk.end ());
1955
1963
HivesToAsk.erase (std::unique (HivesToAsk.begin (), HivesToAsk.end ()), HivesToAsk.end ());
1956
1964
for (TTabletId hiveId : HivesToAsk) {
@@ -2000,6 +2008,9 @@ class TJsonNodes : public TViewerPipeClient {
2000
2008
if (node->SubDomainKey == SubDomainKey) {
2001
2009
HasDatabaseNodes = true ;
2002
2010
}
2011
+ if (node->SubDomainKey == SharedSubDomainKey) {
2012
+ HasSharedNodes = true ;
2013
+ }
2003
2014
}
2004
2015
}
2005
2016
}
@@ -2026,6 +2037,7 @@ class TJsonNodes : public TViewerPipeClient {
2026
2037
FilterStorageStage = EFilterStorageStage::Groups;
2027
2038
} else {
2028
2039
AddProblem (" bsc-storage-pools-no-data" );
2040
+ FilterStorageStage = EFilterStorageStage::DoneOrError;
2029
2041
}
2030
2042
StoragePoolsResponse.reset ();
2031
2043
}
@@ -2042,8 +2054,8 @@ class TJsonNodes : public TViewerPipeClient {
2042
2054
FilterStorageStage = EFilterStorageStage::VSlots;
2043
2055
} else {
2044
2056
AddProblem (" bsc-storage-groups-no-data" );
2057
+ FilterStorageStage = EFilterStorageStage::DoneOrError;
2045
2058
}
2046
- GroupsResponse.reset ();
2047
2059
}
2048
2060
if ((FilterStorageStage == EFilterStorageStage::VSlots || FilterStorageStage == EFilterStorageStage::None) && VSlotsResponse && VSlotsResponse->IsDone ()) {
2049
2061
if (VSlotsResponse->IsOk ()) {
@@ -2070,14 +2082,14 @@ class TJsonNodes : public TViewerPipeClient {
2070
2082
MaximumSlotsPerDisk = std::max (MaximumSlotsPerDisk.value_or (0 ), slots);
2071
2083
}
2072
2084
FieldsAvailable.set (+ENodeFields::HasDisks);
2073
- FilterStorageStage = EFilterStorageStage::None ;
2085
+ FilterStorageStage = EFilterStorageStage::DoneOrError ;
2074
2086
ApplyEverything ();
2075
2087
} else {
2076
2088
AddProblem (" bsc-storage-slots-no-data" );
2089
+ FilterStorageStage = EFilterStorageStage::DoneOrError;
2077
2090
}
2078
- VSlotsResponse.reset ();
2079
2091
}
2080
- if (PDisksResponse && PDisksResponse->IsDone ()) {
2092
+ if (PDisksResponse && PDisksResponse->IsDone () && !PDisksProcessed ) {
2081
2093
if (PDisksResponse->IsOk ()) {
2082
2094
std::unordered_map<TNodeId, std::size_t > disksPerNode;
2083
2095
for (const auto & pdiskEntry : PDisksResponse->Get ()->Record .GetEntries ()) {
@@ -2099,7 +2111,7 @@ class TJsonNodes : public TViewerPipeClient {
2099
2111
} else {
2100
2112
AddProblem (" bsc-pdisks-no-data" );
2101
2113
}
2102
- PDisksResponse. reset () ;
2114
+ PDisksProcessed = true ;
2103
2115
}
2104
2116
2105
2117
if (!TimeToAskWhiteboard ()) {
@@ -3077,6 +3089,7 @@ class TJsonNodes : public TViewerPipeClient {
3077
3089
}
3078
3090
}
3079
3091
if (WaitingForResponse ()) {
3092
+ AddEvent (" WaitingForSomethingOnTimeout" );
3080
3093
ReplyAndPassAway ();
3081
3094
}
3082
3095
}
0 commit comments