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