Skip to content

Commit 4d16fd9

Browse files
authored
fix crash in storage/groups (#11268)
1 parent 87ae150 commit 4d16fd9

File tree

1 file changed

+16
-9
lines changed

1 file changed

+16
-9
lines changed

ydb/core/viewer/storage_groups.h

Lines changed: 16 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -131,9 +131,13 @@ class TStorageGroups : public TViewerPipeClient {
131131
// BSC
132132
bool FallbackToWhiteboard = false;
133133
std::optional<TRequestResponse<NSysView::TEvSysView::TEvGetGroupsResponse>> GetGroupsResponse;
134+
bool GetGroupsResponseProcessed = false;
134135
std::optional<TRequestResponse<NSysView::TEvSysView::TEvGetStoragePoolsResponse>> GetStoragePoolsResponse;
136+
bool GetStoragePoolsResponseProcessed = false;
135137
std::optional<TRequestResponse<NSysView::TEvSysView::TEvGetVSlotsResponse>> GetVSlotsResponse;
138+
bool GetVSlotsResponseProcessed = false;
136139
std::optional<TRequestResponse<NSysView::TEvSysView::TEvGetPDisksResponse>> GetPDisksResponse;
140+
bool GetPDisksResponseProcessed = false;
137141

138142
// Whiteboard
139143
std::optional<TRequestResponse<TEvInterconnect::TEvNodesInfo>> NodesInfo;
@@ -1270,7 +1274,10 @@ class TStorageGroups : public TViewerPipeClient {
12701274
}
12711275

12721276
bool AreBSControllerRequestsDone() const {
1273-
return !GetGroupsResponse && !GetStoragePoolsResponse && !GetVSlotsResponse && !GetPDisksResponse;
1277+
return (!GetGroupsResponse || GetGroupsResponseProcessed) &&
1278+
(!GetStoragePoolsResponse || GetStoragePoolsResponseProcessed) &&
1279+
(!GetVSlotsResponse || GetVSlotsResponseProcessed) &&
1280+
(!GetPDisksResponse || GetPDisksResponseProcessed);
12741281
}
12751282

12761283
bool TimeToAskWhiteboard() const {
@@ -1281,7 +1288,7 @@ class TStorageGroups : public TViewerPipeClient {
12811288

12821289
void ProcessResponses() {
12831290
AddEvent("ProcessResponses");
1284-
if (GetGroupsResponse && GetGroupsResponse->IsDone()) {
1291+
if (GetGroupsResponse && GetGroupsResponse->IsDone() && !GetGroupsResponseProcessed) {
12851292
if (GetGroupsResponse->IsOk()) {
12861293
GroupData.reserve(GetGroupsResponse->Get()->Record.EntriesSize());
12871294
for (const NKikimrSysView::TGroupEntry& entry : GetGroupsResponse->Get()->Record.GetEntries()) {
@@ -1310,9 +1317,9 @@ class TStorageGroups : public TViewerPipeClient {
13101317
} else {
13111318
AddProblem("bsc-storage-groups-no-data");
13121319
}
1313-
GetGroupsResponse.reset();
1320+
GetGroupsResponseProcessed = true;
13141321
}
1315-
if (FieldsAvailable.test(+EGroupFields::GroupId) && GetStoragePoolsResponse && GetStoragePoolsResponse->IsDone()) {
1322+
if (FieldsAvailable.test(+EGroupFields::GroupId) && GetStoragePoolsResponse && GetStoragePoolsResponse->IsDone() && !GetStoragePoolsResponseProcessed) {
13161323
if (GetStoragePoolsResponse->IsOk()) {
13171324
std::unordered_map<std::pair<ui64, ui64>, const NKikimrSysView::TStoragePoolInfo*> indexStoragePool; // (box, id) -> pool
13181325
for (const NKikimrSysView::TStoragePoolEntry& entry : GetStoragePoolsResponse->Get()->Record.GetEntries()) {
@@ -1353,9 +1360,9 @@ class TStorageGroups : public TViewerPipeClient {
13531360
} else {
13541361
AddProblem("bsc-storage-pools-no-data");
13551362
}
1356-
GetStoragePoolsResponse.reset();
1363+
GetStoragePoolsResponseProcessed = true;
13571364
}
1358-
if (FieldsAvailable.test(+EGroupFields::GroupId) && GetVSlotsResponse && GetVSlotsResponse->IsDone()) {
1365+
if (FieldsAvailable.test(+EGroupFields::GroupId) && GetVSlotsResponse && GetVSlotsResponse->IsDone() && !GetVSlotsResponseProcessed) {
13591366
if (GetVSlotsResponse->IsOk()) {
13601367
if (GroupsByGroupId.empty()) {
13611368
RebuildGroupsByGroupId();
@@ -1386,9 +1393,9 @@ class TStorageGroups : public TViewerPipeClient {
13861393
} else {
13871394
AddProblem("bsc-vslots-no-data");
13881395
}
1389-
GetVSlotsResponse.reset();
1396+
GetVSlotsResponseProcessed = true;
13901397
}
1391-
if (GetPDisksResponse && GetPDisksResponse->IsDone()) {
1398+
if (GetPDisksResponse && GetPDisksResponse->IsDone() && !GetPDisksResponseProcessed) {
13921399
if (GetPDisksResponse->IsOk()) {
13931400
for (const NKikimrSysView::TPDiskEntry& entry : GetPDisksResponse->Get()->Record.GetEntries()) {
13941401
const NKikimrSysView::TPDiskKey& key = entry.GetKey();
@@ -1414,7 +1421,7 @@ class TStorageGroups : public TViewerPipeClient {
14141421
} else {
14151422
AddProblem("bsc-pdisks-no-data");
14161423
}
1417-
GetPDisksResponse.reset();
1424+
GetPDisksResponseProcessed = true;;
14181425
}
14191426
if (FieldsAvailable.test(+EGroupFields::VDisk)) {
14201427
if (FieldsNeeded(FieldsGroupState)) {

0 commit comments

Comments
 (0)