@@ -244,6 +244,8 @@ class TDataShard::TTxSplitSnapshotComplete : public NTabletFlatExecutor::TTransa
244
244
private:
245
245
TIntrusivePtr<TSplitSnapshotContext> SnapContext;
246
246
bool ChangeExchangeSplit;
247
+ THashSet<ui64> ActivationList;
248
+ THashSet<ui64> SplitList;
247
249
248
250
public:
249
251
TTxSplitSnapshotComplete (TDataShard* ds, TIntrusivePtr<TSplitSnapshotContext> snapContext)
@@ -378,13 +380,11 @@ class TDataShard::TTxSplitSnapshotComplete : public NTabletFlatExecutor::TTransa
378
380
proto->SetTimeoutMs (kv.second .Timeout .MilliSeconds ());
379
381
}
380
382
381
- if (Self-> ChangesQueue || tableInfo.HasCdcStreams ()) {
383
+ if (tableInfo. HasAsyncIndexes () || tableInfo.HasCdcStreams ()) {
382
384
snapshot->SetWaitForActivation (true );
383
- Self->ChangeSenderActivator .AddDst (dstTablet);
384
- db.Table <Schema::SrcChangeSenderActivations>().Key (dstTablet).Update ();
385
-
385
+ ActivationList.insert (dstTablet);
386
386
if (tableInfo.HasCdcStreams ()) {
387
- Self-> ChangeExchangeSplitter . AddDst (dstTablet);
387
+ SplitList. insert (dstTablet);
388
388
}
389
389
}
390
390
@@ -403,14 +403,23 @@ class TDataShard::TTxSplitSnapshotComplete : public NTabletFlatExecutor::TTransa
403
403
}
404
404
}
405
405
406
- ChangeExchangeSplit = !Self->ChangesQueue && !Self->ChangeExchangeSplitter .Done ();
407
-
408
406
if (needToReadPages) {
409
407
LOG_DEBUG_S (ctx, NKikimrServices::TX_DATASHARD, Self->TabletID () << " BorrowSnapshot is restarting for split OpId " << opId);
410
408
return false ;
411
409
} else {
412
410
txc.Env .DropSnapshot (SnapContext);
413
411
412
+ for (ui64 dstTabletId : ActivationList) {
413
+ Self->ChangeSenderActivator .AddDst (dstTabletId);
414
+ db.Table <Schema::SrcChangeSenderActivations>().Key (dstTabletId).Update ();
415
+ }
416
+
417
+ for (ui64 dstTabletId : SplitList) {
418
+ Self->ChangeExchangeSplitter .AddDst (dstTabletId);
419
+ }
420
+
421
+ ChangeExchangeSplit = !Self->ChangesQueue && !Self->ChangeExchangeSplitter .Done ();
422
+
414
423
Self->State = TShardState::SplitSrcSendingSnapshot;
415
424
Self->PersistSys (db, Schema::Sys_State, Self->State );
416
425
@@ -421,7 +430,7 @@ class TDataShard::TTxSplitSnapshotComplete : public NTabletFlatExecutor::TTransa
421
430
void Complete (const TActorContext &ctx) override {
422
431
LOG_DEBUG_S (ctx, NKikimrServices::TX_DATASHARD, Self->TabletID () << " Sending snapshots from src for split OpId " << Self->SrcSplitOpId );
423
432
Self->SplitSrcSnapshotSender .DoSend (ctx);
424
- if (ChangeExchangeSplit) {
433
+ if (ChangeExchangeSplit && !Self-> ChangesQueue ) { // double check queue
425
434
Self->KillChangeSender (ctx);
426
435
Self->ChangeExchangeSplitter .DoSplit (ctx);
427
436
}
@@ -438,14 +447,14 @@ class TDataShard::TTxSplitTransferSnapshotAck : public NTabletFlatExecutor::TTra
438
447
private:
439
448
TEvDataShard::TEvSplitTransferSnapshotAck::TPtr Ev;
440
449
bool AllDstAcksReceived;
441
- bool Activate ;
450
+ ui64 ActivateTabletId ;
442
451
443
452
public:
444
453
TTxSplitTransferSnapshotAck (TDataShard* ds, TEvDataShard::TEvSplitTransferSnapshotAck::TPtr& ev)
445
454
: NTabletFlatExecutor::TTransactionBase<TDataShard>(ds)
446
455
, Ev(ev)
447
456
, AllDstAcksReceived(false )
448
- , Activate( false )
457
+ , ActivateTabletId( 0 )
449
458
{}
450
459
451
460
TTxType GetTxType () const override { return TXTYPE_SPLIT_TRANSFER_SNAPSHOT_ACK; }
@@ -469,8 +478,8 @@ class TDataShard::TTxSplitTransferSnapshotAck : public NTabletFlatExecutor::TTra
469
478
// Remove the row for acked snapshot
470
479
db.Table <Schema::SplitSrcSnapshots>().Key (dstTabletId).Delete ();
471
480
472
- if (!Self->ChangesQueue && Self->ChangeExchangeSplitter .Done ()) {
473
- Activate = !Self-> ChangeSenderActivator . Acked ( dstTabletId) ;
481
+ if (!Self->ChangesQueue && Self->ChangeExchangeSplitter .Done () && !Self-> ChangeSenderActivator . Acked (dstTabletId) ) {
482
+ ActivateTabletId = dstTabletId;
474
483
}
475
484
476
485
return true ;
@@ -485,11 +494,8 @@ class TDataShard::TTxSplitTransferSnapshotAck : public NTabletFlatExecutor::TTra
485
494
}
486
495
}
487
496
488
- if (Activate) {
489
- const ui64 dstTabletId = Ev->Get ()->Record .GetTabletId ();
490
- if (!Self->ChangeSenderActivator .Acked (dstTabletId)) {
491
- Self->ChangeSenderActivator .DoSend (dstTabletId, ctx);
492
- }
497
+ if (ActivateTabletId && !Self->ChangesQueue ) { // double check queue
498
+ Self->ChangeSenderActivator .DoSend (ActivateTabletId, ctx);
493
499
}
494
500
}
495
501
};
0 commit comments