@@ -175,6 +175,8 @@ namespace NKikimr {
175
175
TEvResumeForce *ResumeForceToken = nullptr ;
176
176
TInstant ReplicationEndTime;
177
177
bool UnrecoveredNonphantomBlobs = false ;
178
+ bool RequestedReplicationToken = false ;
179
+ bool HoldingReplicationToken = false ;
178
180
179
181
TWatchdogTimer<TEvReplCheckProgress> ReplProgressWatchdog;
180
182
@@ -288,6 +290,12 @@ namespace NKikimr {
288
290
case Plan:
289
291
// this is a first quantum of replication, so we have to register it in the broker
290
292
State = AwaitToken;
293
+ Y_DEBUG_ABORT_UNLESS (!RequestedReplicationToken);
294
+ if (RequestedReplicationToken) {
295
+ STLOG (PRI_CRIT, BS_REPL, BSVR38, ReplCtx->VCtx ->VDiskLogPrefix << " excessive replication token requested" );
296
+ break ;
297
+ }
298
+ RequestedReplicationToken = true ;
291
299
if (!Send (MakeBlobStorageReplBrokerID (), new TEvQueryReplToken (ReplCtx->VDiskCfg ->BaseInfo .PDiskId ))) {
292
300
HandleReplToken ();
293
301
}
@@ -304,6 +312,10 @@ namespace NKikimr {
304
312
}
305
313
306
314
void HandleReplToken () {
315
+ Y_ABORT_UNLESS (RequestedReplicationToken);
316
+ RequestedReplicationToken = false ;
317
+ HoldingReplicationToken = true ;
318
+
307
319
// switch to replication state
308
320
Transition (AwaitToken, Replication);
309
321
if (!ResumeIfReady ()) {
@@ -410,6 +422,9 @@ namespace NKikimr {
410
422
if (State == WaitQueues || State == Replication) {
411
423
// release token as we have finished replicating
412
424
Send (MakeBlobStorageReplBrokerID (), new TEvReleaseReplToken);
425
+ Y_DEBUG_ABORT_UNLESS (!RequestedReplicationToken);
426
+ Y_DEBUG_ABORT_UNLESS (HoldingReplicationToken);
427
+ HoldingReplicationToken = false ;
413
428
}
414
429
ResetReplProgressTimer (true );
415
430
@@ -638,7 +653,15 @@ namespace NKikimr {
638
653
639
654
// return replication token if we have one
640
655
if (State == AwaitToken || State == WaitQueues || State == Replication) {
641
- Send (MakeBlobStorageReplBrokerID (), new TEvReleaseReplToken);
656
+ Y_DEBUG_ABORT_UNLESS (RequestedReplicationToken || HoldingReplicationToken);
657
+ if (RequestedReplicationToken || HoldingReplicationToken) {
658
+ Send (MakeBlobStorageReplBrokerID (), new TEvReleaseReplToken);
659
+ }
660
+ } else {
661
+ Y_DEBUG_ABORT_UNLESS (!RequestedReplicationToken && !HoldingReplicationToken);
662
+ if (RequestedReplicationToken || HoldingReplicationToken) {
663
+ STLOG (PRI_CRIT, BS_REPL, BSVR37, ReplCtx->VCtx ->VDiskLogPrefix << " stuck replication token" );
664
+ }
642
665
}
643
666
644
667
if (ReplJobActorId) {
0 commit comments