32
32
#include < util/generic/algorithm.h>
33
33
#include < util/string/split.h>
34
34
#include < util/system/sanitizers.h>
35
+ #include < util/generic/variant.h>
35
36
36
37
namespace NKikimr {
37
38
namespace NPDisk {
@@ -56,46 +57,12 @@ void CreatePDiskActor(TExecutorThread& executorThread,
56
57
// //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
57
58
58
59
class TPDiskActor : public TActorBootstrapped <TPDiskActor> {
59
- struct TInitQueueItem {
60
- TOwnerRound OwnerRound = 0 ;
61
- TVDiskID VDisk = TVDiskID::InvalidId;
62
- ui32 SlotSizeInUnits = 0 ;
63
- ui64 PDiskGuid = 0 ;
64
- TActorId Sender;
65
- TActorId CutLogId;
66
- TActorId WhiteboardProxyId;
67
- ui32 SlotId = 0 ;
68
- bool IsShred = false ;
69
- ui64 ShredGeneration = 0 ;
70
- ui64 Cookie;
71
-
72
- TInitQueueItem (const TActorId sender, const ui64 shredGeneration, ui64 cookie)
73
- : Sender(sender)
74
- , IsShred(true )
75
- , ShredGeneration(shredGeneration)
76
- , Cookie(cookie)
77
- {}
78
-
79
- TInitQueueItem (
80
- TOwnerRound ownerRound,
81
- TVDiskID vDisk,
82
- ui32 slotSizeInUnits,
83
- ui64 pDiskGuid,
84
- TActorId sender,
85
- TActorId cutLogId,
86
- TActorId whiteboardProxyId,
87
- ui32 slotId
88
- )
89
- : OwnerRound(ownerRound)
90
- , VDisk(vDisk)
91
- , SlotSizeInUnits(slotSizeInUnits)
92
- , PDiskGuid(pDiskGuid)
93
- , Sender(sender)
94
- , CutLogId(cutLogId)
95
- , WhiteboardProxyId(whiteboardProxyId)
96
- , SlotId(slotId)
97
- {}
98
- };
60
+ using TInitQueueItem = std::variant<
61
+ NPDisk::TEvYardInit::TPtr,
62
+ NPDisk::TEvShredPDisk::TPtr,
63
+ NPDisk::TEvYardResize::TPtr,
64
+ NPDisk::TEvChangeExpectedSlotCount::TPtr
65
+ >;
99
66
100
67
TString StateErrorReason;
101
68
TIntrusivePtr<TPDiskConfig> Cfg;
@@ -313,17 +280,30 @@ class TPDiskActor : public TActorBootstrapped<TPDiskActor> {
313
280
void InitError (const TString &errorReason, bool allowMetadataHandling = false ) {
314
281
Become (&TThis::StateError);
315
282
for (TList<TInitQueueItem>::iterator it = InitQueue.begin (); it != InitQueue.end (); ++it) {
316
- if (it->IsShred ) {
317
- Send (it->Sender , new NPDisk::TEvShredPDiskResult (NKikimrProto::CORRUPTED, it->ShredGeneration , errorReason), 0 , it->Cookie );
318
- if (PDisk) {
319
- PDisk->Mon .ShredPDisk .CountResponse ();
320
- }
321
- } else {
322
- Send (it->Sender , new NPDisk::TEvYardInitResult (NKikimrProto::CORRUPTED, errorReason));
323
- if (PDisk) {
324
- PDisk->Mon .YardInit .CountResponse ();
283
+ std::visit ([this , &errorReason](const auto & ev) {
284
+ using T = std::decay_t <decltype (ev)>;
285
+ if constexpr (std::is_same_v<T, NPDisk::TEvShredPDisk::TPtr>) {
286
+ Send (ev->Sender , new NPDisk::TEvShredPDiskResult (NKikimrProto::CORRUPTED, ev->Get ()->ShredGeneration , errorReason), 0 , ev->Cookie );
287
+ if (PDisk) {
288
+ PDisk->Mon .ShredPDisk .CountResponse ();
289
+ }
290
+ } else if constexpr (std::is_same_v<T, NPDisk::TEvYardInit::TPtr>) {
291
+ Send (ev->Sender , new NPDisk::TEvYardInitResult (NKikimrProto::CORRUPTED, errorReason));
292
+ if (PDisk) {
293
+ PDisk->Mon .YardInit .CountResponse ();
294
+ }
295
+ } else if constexpr (std::is_same_v<T, NPDisk::TEvYardResize::TPtr>) {
296
+ Send (ev->Sender , new NPDisk::TEvYardResizeResult (NKikimrProto::CORRUPTED, {}, errorReason));
297
+ if (PDisk) {
298
+ PDisk->Mon .YardResize .CountResponse ();
299
+ }
300
+ } else if constexpr (std::is_same_v<T, NPDisk::TEvChangeExpectedSlotCount::TPtr>) {
301
+ Send (ev->Sender , new NPDisk::TEvChangeExpectedSlotCountResult (NKikimrProto::CORRUPTED, errorReason));
302
+ if (PDisk) {
303
+ PDisk->Mon .ChangeExpectedSlotCount .CountResponse ();
304
+ }
325
305
}
326
- }
306
+ }, *it);
327
307
}
328
308
InitQueue.clear ();
329
309
TStringStream str;
@@ -633,17 +613,23 @@ class TPDiskActor : public TActorBootstrapped<TPDiskActor> {
633
613
void InitSuccess () {
634
614
Become (&TThis::StateOnline);
635
615
for (TList<TInitQueueItem>::iterator it = InitQueue.begin (); it != InitQueue.end (); ++it) {
636
- if (it->IsShred ) {
637
- NPDisk::TEvShredPDisk evShredPDisk (it->ShredGeneration );
638
- auto * request = PDisk->ReqCreator .CreateFromEv <NPDisk::TShredPDisk>(evShredPDisk, it->Sender );
639
- request->Cookie = it->Cookie ;
640
- PDisk->InputRequest (request);
641
- } else {
642
- NPDisk::TEvYardInit evInit (it->OwnerRound , it->VDisk , it->PDiskGuid , it->CutLogId , it->WhiteboardProxyId ,
643
- it->SlotId , it->SlotSizeInUnits );
644
- auto * request = PDisk->ReqCreator .CreateFromEv <TYardInit>(evInit, it->Sender );
645
- PDisk->InputRequest (request);
646
- }
616
+ std::visit ([this ](const auto & ev) {
617
+ using T = std::decay_t <decltype (ev)>;
618
+ if constexpr (std::is_same_v<T, NPDisk::TEvShredPDisk::TPtr>) {
619
+ auto * request = PDisk->ReqCreator .CreateFromEv <NPDisk::TShredPDisk>(*ev->Get (), ev->Sender );
620
+ request->Cookie = ev->Cookie ;
621
+ PDisk->InputRequest (request);
622
+ } else if constexpr (std::is_same_v<T, NPDisk::TEvYardInit::TPtr>) {
623
+ auto * request = PDisk->ReqCreator .CreateFromEv <TYardInit>(*ev->Get (), ev->Sender );
624
+ PDisk->InputRequest (request);
625
+ } else if constexpr (std::is_same_v<T, NPDisk::TEvYardResize::TPtr>) {
626
+ auto * request = PDisk->ReqCreator .CreateFromEv <TYardResize>(*ev->Get (), ev->Sender );
627
+ PDisk->InputRequest (request);
628
+ } else if constexpr (std::is_same_v<T, NPDisk::TEvChangeExpectedSlotCount::TPtr>) {
629
+ auto * request = PDisk->ReqCreator .CreateFromEv <TChangeExpectedSlotCount>(*ev->Get (), ev->Sender );
630
+ PDisk->InputRequest (request);
631
+ }
632
+ }, *it);
647
633
}
648
634
InitQueue.clear ();
649
635
if (ControledStartResult) {
@@ -653,9 +639,7 @@ class TPDiskActor : public TActorBootstrapped<TPDiskActor> {
653
639
}
654
640
655
641
void InitHandle (NPDisk::TEvYardInit::TPtr &ev) {
656
- const NPDisk::TEvYardInit &evYardInit = *ev->Get ();
657
- InitQueue.emplace_back (evYardInit.OwnerRound , evYardInit.VDisk , evYardInit.GroupSizeInUnits , evYardInit.PDiskGuid ,
658
- ev->Sender , evYardInit.CutLogID , evYardInit.WhiteboardProxyId , evYardInit.SlotId );
642
+ InitQueue.emplace_back (ev);
659
643
}
660
644
661
645
void OnPDiskStop (TActorId &sender, void *cookie) {
@@ -700,19 +684,16 @@ class TPDiskActor : public TActorBootstrapped<TPDiskActor> {
700
684
701
685
void InitHandle (NPDisk::TEvYardResize::TPtr &ev) {
702
686
PDisk->Mon .YardResize .CountRequest ();
703
- Send (ev->Sender , new NPDisk::TEvYardResizeResult (NKikimrProto::CORRUPTED, {}, StateErrorReason));
704
- PDisk->Mon .YardResize .CountResponse ();
687
+ InitQueue.emplace_back (ev);
705
688
}
706
689
707
690
void InitHandle (NPDisk::TEvChangeExpectedSlotCount::TPtr &ev) {
708
691
PDisk->Mon .ChangeExpectedSlotCount .CountRequest ();
709
- Send (ev->Sender , new NPDisk::TEvChangeExpectedSlotCountResult (NKikimrProto::CORRUPTED, StateErrorReason));
710
- PDisk->Mon .ChangeExpectedSlotCount .CountResponse ();
692
+ InitQueue.emplace_back (ev);
711
693
}
712
694
713
695
void InitHandle (NPDisk::TEvShredPDisk::TPtr &ev) {
714
- const NPDisk::TEvShredPDisk &evShredPDisk = *ev->Get ();
715
- InitQueue.emplace_back (ev->Sender , evShredPDisk.ShredGeneration , ev->Cookie );
696
+ InitQueue.emplace_back (ev);
716
697
}
717
698
718
699
void InitHandle (NPDisk::TEvPreShredCompactVDiskResult::TPtr &ev) {
0 commit comments