Skip to content

Commit a48e874

Browse files
authored
fixing bad_variant_access (#10985)
1 parent 39e1f8b commit a48e874

File tree

8 files changed

+328
-264
lines changed

8 files changed

+328
-264
lines changed

ydb/core/viewer/json_pipe_req.h

Lines changed: 10 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -80,22 +80,23 @@ class TViewerPipeClient : public TActorBootstrapped<TViewerPipeClient> {
8080
TRequestResponse& operator =(const TRequestResponse&) = delete;
8181
TRequestResponse& operator =(TRequestResponse&&) = default;
8282

83-
void Set(std::unique_ptr<T>&& response) {
83+
bool Set(std::unique_ptr<T>&& response) {
84+
if (IsDone()) {
85+
return false;
86+
}
8487
constexpr bool hasErrorCheck = requires(const std::unique_ptr<T>& r) {TViewerPipeClient::IsSuccess(r);};
8588
if constexpr (hasErrorCheck) {
8689
if (!TViewerPipeClient::IsSuccess(response)) {
87-
Error(TViewerPipeClient::GetError(response));
88-
return;
90+
return Error(TViewerPipeClient::GetError(response));
8991
}
9092
}
91-
if (!IsDone()) {
92-
Span.EndOk();
93-
Response = std::move(response);
94-
}
93+
Span.EndOk();
94+
Response = std::move(response);
95+
return true;
9596
}
9697

97-
void Set(TAutoPtr<TEventHandle<T>>&& response) {
98-
Set(std::unique_ptr<T>(response->Release().Release()));
98+
bool Set(TAutoPtr<TEventHandle<T>>&& response) {
99+
return Set(std::unique_ptr<T>(response->Release().Release()));
99100
}
100101

101102
bool Error(const TString& error) {

ydb/core/viewer/pdisk_info.h

Lines changed: 36 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -112,45 +112,64 @@ class TPDiskInfo : public TViewerPipeClient {
112112
}
113113

114114
void Disconnected(TEvInterconnect::TEvNodeDisconnected::TPtr&) {
115-
WhiteboardPDisk.Error("NodeDisconnected");
116-
WhiteboardVDisk.Error("NodeDisconnected");
115+
ui32 requestsDone = 0;
116+
if (WhiteboardPDisk.Error("NodeDisconnected")) {
117+
++requestsDone;
118+
}
119+
if (WhiteboardVDisk.Error("NodeDisconnected")) {
120+
++requestsDone;
121+
}
117122
if (!RetryRequest()) {
118-
TBase::RequestDone(2);
123+
TBase::RequestDone(requestsDone);
119124
}
120125
}
121126

122127
void Handle(TEvTabletPipe::TEvClientConnected::TPtr& ev) {
123128
if (ev->Get()->Status != NKikimrProto::OK) {
124-
SysViewPDisks.Error("ClientNotConnected");
125-
SysViewVSlots.Error("ClientNotConnected");
126-
TBase::RequestDone(2);
129+
ui32 requestsDone = 0;
130+
if (SysViewPDisks.Error("ClientNotConnected")) {
131+
++requestsDone;
132+
}
133+
if (SysViewVSlots.Error("ClientNotConnected")) {
134+
++requestsDone;
135+
}
136+
TBase::RequestDone(requestsDone);
127137
}
128138
}
129139

130140
void Handle(TEvTabletPipe::TEvClientDestroyed::TPtr&) {
131-
SysViewPDisks.Error("ClientDestroyed");
132-
SysViewVSlots.Error("ClientDestroyed");
133-
TBase::RequestDone(2);
141+
ui32 requestsDone = 0;
142+
if (SysViewPDisks.Error("ClientDestroyed")) {
143+
++requestsDone;
144+
}
145+
if (SysViewVSlots.Error("ClientDestroyed")) {
146+
++requestsDone;
147+
}
148+
TBase::RequestDone(requestsDone);
134149
}
135150

136151
void Handle(NSysView::TEvSysView::TEvGetPDisksResponse::TPtr& ev) {
137-
SysViewPDisks.Set(std::move(ev));
138-
TBase::RequestDone();
152+
if (SysViewPDisks.Set(std::move(ev))) {
153+
TBase::RequestDone();
154+
}
139155
}
140156

141157
void Handle(NSysView::TEvSysView::TEvGetVSlotsResponse::TPtr& ev) {
142-
SysViewVSlots.Set(std::move(ev));
143-
TBase::RequestDone();
158+
if (SysViewVSlots.Set(std::move(ev))) {
159+
TBase::RequestDone();
160+
}
144161
}
145162

146163
void Handle(NNodeWhiteboard::TEvWhiteboard::TEvPDiskStateResponse::TPtr& ev) {
147-
WhiteboardPDisk.Set(std::move(ev));
148-
TBase::RequestDone();
164+
if (WhiteboardPDisk.Set(std::move(ev))) {
165+
TBase::RequestDone();
166+
}
149167
}
150168

151169
void Handle(NNodeWhiteboard::TEvWhiteboard::TEvVDiskStateResponse::TPtr& ev) {
152-
WhiteboardVDisk.Set(std::move(ev));
153-
TBase::RequestDone();
170+
if (WhiteboardVDisk.Set(std::move(ev))) {
171+
TBase::RequestDone();
172+
}
154173
}
155174

156175
void HandleRetry() {

ydb/core/viewer/storage_groups.h

Lines changed: 47 additions & 38 deletions
Original file line numberDiff line numberDiff line change
@@ -1504,61 +1504,67 @@ class TStorageGroups : public TViewerPipeClient {
15041504
return RequestDone();
15051505
}
15061506
auto& navigateResult(itNavigateKeySetResult->second);
1507-
navigateResult.Set(std::move(ev));
1508-
ProcessNavigate(navigateResult, firstNavigate);
1509-
--NavigateKeySetInFlight;
1510-
ProcessResponses();
1511-
RequestDone();
1507+
if (navigateResult.Set(std::move(ev))) {
1508+
ProcessNavigate(navigateResult, firstNavigate);
1509+
--NavigateKeySetInFlight;
1510+
ProcessResponses();
1511+
RequestDone();
1512+
}
15121513
}
15131514

15141515
void Handle(TEvHive::TEvResponseHiveStorageStats::TPtr& ev) {
15151516
auto itHiveStorageStats = HiveStorageStats.find(ev->Cookie);
15161517
if (itHiveStorageStats != HiveStorageStats.end()) {
1517-
itHiveStorageStats->second.Set(std::move(ev));
1518+
if (itHiveStorageStats->second.Set(std::move(ev))) {
1519+
--HiveStorageStatsInFlight;
1520+
ProcessResponses();
1521+
RequestDone();
1522+
}
15181523
}
1519-
--HiveStorageStatsInFlight;
1520-
ProcessResponses();
1521-
RequestDone();
15221524
}
15231525

15241526
void Handle(NSysView::TEvSysView::TEvGetGroupsResponse::TPtr& ev) {
1525-
GetGroupsResponse->Set(std::move(ev));
1526-
if (FallbackToWhiteboard) {
1527+
if (GetGroupsResponse->Set(std::move(ev))) {
1528+
if (FallbackToWhiteboard) {
1529+
RequestDone();
1530+
return;
1531+
}
1532+
ProcessResponses();
15271533
RequestDone();
1528-
return;
15291534
}
1530-
ProcessResponses();
1531-
RequestDone();
15321535
}
15331536

15341537
void Handle(NSysView::TEvSysView::TEvGetStoragePoolsResponse::TPtr& ev) {
1535-
GetStoragePoolsResponse->Set(std::move(ev));
1536-
if (FallbackToWhiteboard) {
1538+
if (GetStoragePoolsResponse->Set(std::move(ev))) {
1539+
if (FallbackToWhiteboard) {
1540+
RequestDone();
1541+
return;
1542+
}
1543+
ProcessResponses();
15371544
RequestDone();
1538-
return;
15391545
}
1540-
ProcessResponses();
1541-
RequestDone();
15421546
}
15431547

15441548
void Handle(NSysView::TEvSysView::TEvGetVSlotsResponse::TPtr& ev) {
1545-
GetVSlotsResponse->Set(std::move(ev));
1546-
if (FallbackToWhiteboard) {
1549+
if (GetVSlotsResponse->Set(std::move(ev))) {
1550+
if (FallbackToWhiteboard) {
1551+
RequestDone();
1552+
return;
1553+
}
1554+
ProcessResponses();
15471555
RequestDone();
1548-
return;
15491556
}
1550-
ProcessResponses();
1551-
RequestDone();
15521557
}
15531558

15541559
void Handle(NSysView::TEvSysView::TEvGetPDisksResponse::TPtr& ev) {
1555-
GetPDisksResponse->Set(std::move(ev));
1556-
if (FallbackToWhiteboard) {
1560+
if (GetPDisksResponse->Set(std::move(ev))) {
1561+
if (FallbackToWhiteboard) {
1562+
RequestDone();
1563+
return;
1564+
}
1565+
ProcessResponses();
15571566
RequestDone();
1558-
return;
15591567
}
1560-
ProcessResponses();
1561-
RequestDone();
15621568
}
15631569

15641570
void RequestNodesList() {
@@ -1584,26 +1590,29 @@ class TStorageGroups : public TViewerPipeClient {
15841590

15851591
void Handle(TEvWhiteboard::TEvBSGroupStateResponse::TPtr& ev) {
15861592
ui64 nodeId = ev.Get()->Cookie;
1587-
BSGroupStateResponse[nodeId].Set(std::move(ev));
1588-
BSGroupRequestDone();
1593+
if (BSGroupStateResponse[nodeId].Set(std::move(ev))) {
1594+
BSGroupRequestDone();
1595+
}
15891596
}
15901597

15911598
void Handle(TEvWhiteboard::TEvVDiskStateResponse::TPtr& ev) {
15921599
ui64 nodeId = ev.Get()->Cookie;
15931600
auto& vDiskStateResponse = VDiskStateResponse[nodeId];
1594-
vDiskStateResponse.Set(std::move(ev));
1595-
for (const NKikimrWhiteboard::TVDiskStateInfo& info : vDiskStateResponse->Record.GetVDiskStateInfo()) {
1596-
for (const auto& vSlotId : info.GetDonors()) {
1597-
SendWhiteboardDisksRequest(vSlotId.GetNodeId());
1601+
if (vDiskStateResponse.Set(std::move(ev))) {
1602+
for (const NKikimrWhiteboard::TVDiskStateInfo& info : vDiskStateResponse->Record.GetVDiskStateInfo()) {
1603+
for (const auto& vSlotId : info.GetDonors()) {
1604+
SendWhiteboardDisksRequest(vSlotId.GetNodeId());
1605+
}
15981606
}
1607+
VDiskRequestDone();
15991608
}
1600-
VDiskRequestDone();
16011609
}
16021610

16031611
void Handle(TEvWhiteboard::TEvPDiskStateResponse::TPtr& ev) {
16041612
ui64 nodeId = ev.Get()->Cookie;
1605-
PDiskStateResponse[nodeId].Set(std::move(ev));
1606-
PDiskRequestDone();
1613+
if (PDiskStateResponse[nodeId].Set(std::move(ev))) {
1614+
PDiskRequestDone();
1615+
}
16071616
}
16081617

16091618
void ProcessWhiteboardGroups() {

ydb/core/viewer/viewer_cluster.h

Lines changed: 38 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -566,65 +566,75 @@ class TJsonCluster : public TViewerPipeClient {
566566
}
567567

568568
void Handle(TEvInterconnect::TEvNodesInfo::TPtr& ev) {
569-
NodesInfoResponse->Set(std::move(ev));
570-
ProcessResponses();
571-
RequestDone();
569+
if (NodesInfoResponse->Set(std::move(ev))) {
570+
ProcessResponses();
571+
RequestDone();
572+
}
572573
}
573574

574575
void Handle(TEvWhiteboard::TEvNodeStateResponse::TPtr& ev) {
575-
NodeStateResponse->Set(std::move(ev));
576-
ProcessResponses();
577-
RequestDone();
576+
if (NodeStateResponse->Set(std::move(ev))) {
577+
ProcessResponses();
578+
RequestDone();
579+
}
578580
}
579581

580582
void Handle(NConsole::TEvConsole::TEvListTenantsResponse::TPtr& ev) {
581-
ListTenantsResponse->Set(std::move(ev));
582-
ProcessResponses();
583-
RequestDone();
583+
if (ListTenantsResponse->Set(std::move(ev))) {
584+
ProcessResponses();
585+
RequestDone();
586+
}
584587
}
585588

586589
void Handle(NSysView::TEvSysView::TEvGetPDisksResponse::TPtr& ev) {
587-
PDisksResponse->Set(std::move(ev));
588-
ProcessResponses();
589-
RequestDone();
590+
if (PDisksResponse->Set(std::move(ev))) {
591+
ProcessResponses();
592+
RequestDone();
593+
}
590594
}
591595

592596
void Handle(NSysView::TEvSysView::TEvGetStorageStatsResponse::TPtr& ev) {
593-
StorageStatsResponse->Set(std::move(ev));
594-
ProcessResponses();
595-
RequestDone();
597+
if (StorageStatsResponse->Set(std::move(ev))) {
598+
ProcessResponses();
599+
RequestDone();
600+
}
596601
}
597602

598603
void Handle(TEvHive::TEvResponseHiveNodeStats::TPtr& ev) {
599-
HiveNodeStatsResponse->Set(std::move(ev));
600-
ProcessResponses();
601-
RequestDone();
604+
if (HiveNodeStatsResponse->Set(std::move(ev))) {
605+
ProcessResponses();
606+
RequestDone();
607+
}
602608
}
603609

604610
void Handle(TEvWhiteboard::TEvSystemStateResponse::TPtr& ev) {
605611
ui64 nodeId = ev.Get()->Cookie;
606-
SystemStateResponse[nodeId].Set(std::move(ev));
607-
WhiteboardRequestDone();
612+
if (SystemStateResponse[nodeId].Set(std::move(ev))) {
613+
WhiteboardRequestDone();
614+
}
608615
}
609616

610617
void Handle(TEvWhiteboard::TEvTabletStateResponse::TPtr& ev) {
611618
ui64 nodeId = ev.Get()->Cookie;
612-
TabletStateResponse[nodeId].Set(std::move(ev));
613-
WhiteboardRequestDone();
619+
if (TabletStateResponse[nodeId].Set(std::move(ev))) {
620+
WhiteboardRequestDone();
621+
}
614622
}
615623

616624
void Handle(TEvViewer::TEvViewerResponse::TPtr& ev) {
617625
ui64 nodeId = ev.Get()->Cookie;
618626
switch (ev->Get()->Record.Response_case()) {
619627
case NKikimrViewer::TEvViewerResponse::ResponseCase::kSystemResponse:
620-
SystemViewerResponse[nodeId].Set(std::move(ev));
621-
NodeBatches.erase(nodeId);
622-
WhiteboardRequestDone();
628+
if (SystemViewerResponse[nodeId].Set(std::move(ev))) {
629+
NodeBatches.erase(nodeId);
630+
WhiteboardRequestDone();
631+
}
623632
return;
624633
case NKikimrViewer::TEvViewerResponse::ResponseCase::kTabletResponse:
625-
TabletViewerResponse[nodeId].Set(std::move(ev));
626-
NodeBatches.erase(nodeId);
627-
WhiteboardRequestDone();
634+
if (TabletViewerResponse[nodeId].Set(std::move(ev))) {
635+
NodeBatches.erase(nodeId);
636+
WhiteboardRequestDone();
637+
}
628638
return;
629639
default:
630640
break;

0 commit comments

Comments
 (0)