@@ -34,11 +34,11 @@ constexpr auto ExternalDrainTimeout = TDuration::Seconds(30);
34
34
35
35
constexpr auto ReleaseShadowDiskRetryTimeout = TDuration::Seconds(5 );
36
36
37
- constexpr auto ReleaseForAnyWriter = 1 ;
38
-
39
- constexpr auto ReleaseForAnyReader = 2 ;
40
-
41
- constexpr auto ExternalDrainTimeoutTag = 3 ;
37
+ enum class EReleaseSessionKind
38
+ {
39
+ AnyReader = 1 ,
40
+ AnyWriter = 2 ,
41
+ } ;
42
42
43
43
struct TPartitionDescr
44
44
{
@@ -174,7 +174,8 @@ class TCheckpointActor final
174
174
ui32 Responses = 0 ;
175
175
NProto::TError Error;
176
176
TString ShadowDiskId;
177
- bool OneReleaseShadowDiskRequestFinished = false ;
177
+ bool ReleaseShadowDiskRequestForAnyReaderFinished = false ;
178
+ bool ReleaseShadowDiskRequestForAnyWriterFinished = false ;
178
179
179
180
TVector<TCallContextPtr> ChildCallContexts;
180
181
@@ -215,7 +216,7 @@ class TCheckpointActor final
215
216
void ForkTraces (TCallContextPtr callContext);
216
217
void JoinTraces (ui32 cookie);
217
218
std::unique_ptr<TEvDiskRegistry::TEvReleaseDiskRequest>
218
- MakeReleaseDiskRequest (const TString& clientId ) const ;
219
+ MakeReleaseDiskRequest (EReleaseSessionKind releaseSessionKind ) const ;
219
220
220
221
private:
221
222
STFUNC (StateDrain);
@@ -263,13 +264,9 @@ class TCheckpointActor final
263
264
const TEvents::TEvPoisonPill::TPtr& ev,
264
265
const TActorContext& ctx);
265
266
266
- void HandleReleaseShadowDisk (
267
+ void HandleReleaseDiskResponse (
267
268
const TEvDiskRegistry::TEvReleaseDiskResponse::TPtr& ev,
268
269
const TActorContext& ctx);
269
-
270
- void HandleReleaseShadowDiskRetry (
271
- const TEvents::TEvWakeup::TPtr& ev,
272
- const TActorContext& ctx);
273
270
};
274
271
275
272
// //////////////////////////////////////////////////////////////////////////////
@@ -346,9 +343,7 @@ void TCheckpointActor<TMethod>::ExternalDrain(const TActorContext& ctx)
346
343
" [%lu] Wait for external drain event" ,
347
344
VolumeTabletId);
348
345
349
- ctx.Schedule (
350
- ExternalDrainTimeout,
351
- new TEvents::TEvWakeup (ExternalDrainTimeoutTag));
346
+ ctx.Schedule (ExternalDrainTimeout, new TEvents::TEvWakeup ());
352
347
353
348
TBase::Become (&TThis::StateDrain);
354
349
}
@@ -443,8 +438,20 @@ void TCheckpointActor<TMethod>::JoinTraces(ui32 cookie)
443
438
444
439
template <typename TMethod>
445
440
std::unique_ptr<TEvDiskRegistry::TEvReleaseDiskRequest>
446
- TCheckpointActor<TMethod>::MakeReleaseDiskRequest(const TString& clientId) const
441
+ TCheckpointActor<TMethod>::MakeReleaseDiskRequest(
442
+ EReleaseSessionKind releaseSessionKind) const
447
443
{
444
+ TString clientId = " " ;
445
+
446
+ switch (releaseSessionKind) {
447
+ case EReleaseSessionKind::AnyReader:
448
+ clientId = AnyReaderClientId;
449
+ break ;
450
+ case EReleaseSessionKind::AnyWriter:
451
+ clientId = AnyWriterClientId;
452
+ break ;
453
+ }
454
+
448
455
auto request = std::make_unique<TEvDiskRegistry::TEvReleaseDiskRequest>();
449
456
request->Record .SetDiskId (ShadowDiskId);
450
457
request->Record .MutableHeaders ()->SetClientId (clientId);
@@ -521,19 +528,20 @@ void TCheckpointActor<TMethod>::HandleExternalDrainDone(
521
528
VolumeTabletId);
522
529
523
530
ShadowDiskId = ev->Get ()->ShadowDiskId ;
524
- OneReleaseShadowDiskRequestFinished = false ;
531
+ ReleaseShadowDiskRequestForAnyReaderFinished = false ;
532
+ ReleaseShadowDiskRequestForAnyWriterFinished = false ;
525
533
526
534
NCloud::Send (
527
535
ctx,
528
536
MakeDiskRegistryProxyServiceId (),
529
- MakeReleaseDiskRequest (TString (AnyWriterClientId) ),
530
- ReleaseForAnyWriter );
537
+ MakeReleaseDiskRequest (EReleaseSessionKind::AnyReader ),
538
+ static_cast <ui64>(EReleaseSessionKind::AnyReader) );
531
539
532
540
NCloud::Send (
533
541
ctx,
534
542
MakeDiskRegistryProxyServiceId (),
535
- MakeReleaseDiskRequest (TString (AnyReaderClientId) ),
536
- ReleaseForAnyReader );
543
+ MakeReleaseDiskRequest (EReleaseSessionKind::AnyWriter ),
544
+ static_cast <ui64>(EReleaseSessionKind::AnyWriter) );
537
545
538
546
TBase::Become (&TThis::StateReleaseShadowDisk);
539
547
}
@@ -543,14 +551,11 @@ void TCheckpointActor<TMethod>::HandleExternalDrainTimeout(
543
551
const TEvents::TEvWakeup::TPtr& ev,
544
552
const TActorContext& ctx)
545
553
{
546
- auto tag = ev->Get ()->Tag ;
547
-
548
- if (tag != ExternalDrainTimeoutTag) {
549
- return ;
550
- }
551
554
552
555
STORAGE_CHECK_PRECONDITION (DrainSource == EDrainSource::External);
553
556
557
+ Y_UNUSED (ev);
558
+
554
559
LOG_WARN (
555
560
ctx,
556
561
TBlockStoreComponents::VOLUME,
@@ -709,31 +714,47 @@ void TCheckpointActor<TMethod>::HandlePoisonPill(
709
714
// //////////////////////////////////////////////////////////////////////////////
710
715
711
716
template <typename TMethod>
712
- void TCheckpointActor<TMethod>::HandleReleaseShadowDisk (
717
+ void TCheckpointActor<TMethod>::HandleReleaseDiskResponse (
713
718
const TEvDiskRegistry::TEvReleaseDiskResponse::TPtr& ev,
714
719
const TActorContext& ctx)
715
720
{
716
- auto & record = ev->Get ()->Record ;
721
+ const auto & record = ev->Get ()->Record ;
722
+
723
+ const auto releaseSessionKind =
724
+ static_cast <EReleaseSessionKind>(ev->Cookie );
717
725
718
726
if (record.HasError ()) {
719
727
if (GetErrorKind (record.GetError ()) == EErrorKind::ErrorRetriable) {
720
- ctx.Schedule (
728
+ ctx.ExecutorThread . Schedule (
721
729
ReleaseShadowDiskRetryTimeout,
722
- new TEvents::TEvWakeup (ev->Cookie ));
730
+ new IEventHandle (
731
+ MakeDiskRegistryProxyServiceId (),
732
+ TBase::SelfId (),
733
+ MakeReleaseDiskRequest (releaseSessionKind).release (),
734
+ 0 , // flags
735
+ ev->Cookie ));
723
736
724
737
return ;
725
738
}
726
739
727
- auto errorMsg = record.GetError ().GetMessage ().data ();
728
740
ReportReleaseShadowDiskError (
729
741
TStringBuilder ()
730
- << " Error: " << errorMsg
731
- << " while trying to release shadow disk with id : "
732
- << ShadowDiskId);
742
+ << " Could not release shadow disk " << ShadowDiskId.Quote ()
743
+ << " Error: " << FormatError (record.GetError ()));
733
744
}
734
745
735
- if (!OneReleaseShadowDiskRequestFinished) {
736
- OneReleaseShadowDiskRequestFinished = true ;
746
+ switch (releaseSessionKind) {
747
+ case EReleaseSessionKind::AnyReader:
748
+ ReleaseShadowDiskRequestForAnyReaderFinished = true ;
749
+ break ;
750
+ case EReleaseSessionKind::AnyWriter:
751
+ ReleaseShadowDiskRequestForAnyWriterFinished = true ;
752
+ break ;
753
+ }
754
+
755
+ if (!ReleaseShadowDiskRequestForAnyReaderFinished ||
756
+ !ReleaseShadowDiskRequestForAnyWriterFinished)
757
+ {
737
758
return ;
738
759
}
739
760
@@ -746,35 +767,6 @@ void TCheckpointActor<TMethod>::HandleReleaseShadowDisk(
746
767
}
747
768
}
748
769
749
- template <typename TMethod>
750
- void TCheckpointActor<TMethod>::HandleReleaseShadowDiskRetry(
751
- const TEvents::TEvWakeup::TPtr& ev,
752
- const TActorContext& ctx)
753
- {
754
- auto tag = ev->Get ()->Tag ;
755
-
756
- if (tag != ReleaseForAnyReader && tag != ReleaseForAnyWriter) {
757
- return ;
758
- }
759
-
760
- TString clientId;
761
-
762
- switch (tag) {
763
- case ReleaseForAnyReader:
764
- clientId = AnyReaderClientId;
765
- break ;
766
- case ReleaseForAnyWriter:
767
- clientId = AnyWriterClientId;
768
- break ;
769
- }
770
-
771
- NCloud::Send (
772
- ctx,
773
- MakeDiskRegistryProxyServiceId (),
774
- MakeReleaseDiskRequest (clientId),
775
- tag);
776
- }
777
-
778
770
// /////////////////////////////////////////////////////////////////////////////
779
771
780
772
template <typename TMethod>
@@ -848,8 +840,7 @@ template <typename TMethod>
848
840
STFUNC (TCheckpointActor<TMethod>::StateReleaseShadowDisk)
849
841
{
850
842
switch (ev->GetTypeRewrite ()) {
851
- HFunc (TEvDiskRegistry::TEvReleaseDiskResponse, HandleReleaseShadowDisk);
852
- HFunc (TEvents::TEvWakeup, HandleReleaseShadowDiskRetry);
843
+ HFunc (TEvDiskRegistry::TEvReleaseDiskResponse, HandleReleaseDiskResponse);
853
844
HFunc (TEvents::TEvPoisonPill, HandlePoisonPill);
854
845
855
846
default :
0 commit comments