@@ -3811,6 +3811,71 @@ Y_UNIT_TEST_SUITE(TFlatTableExecutor_Follower) {
3811
3811
UNIT_ASSERT_C (!blockedSnapshot.empty (), " expected tablet to make a log snapshot after part switch" );
3812
3812
}
3813
3813
3814
+ Y_UNIT_TEST (FollowerPromoteToLeaderWhileLoadingPages) {
3815
+ TMyEnvBase env;
3816
+ TRowsModel rows;
3817
+
3818
+ env->SetLogPriority (NKikimrServices::TABLET_EXECUTOR, NActors::NLog::PRI_DEBUG);
3819
+
3820
+ // Start the source tablet
3821
+ env.FireTablet (env.Edge , env.Tablet , [&env](const TActorId &tablet, TTabletStorageInfo *info) {
3822
+ return new TTestFlatTablet (env.Edge , tablet, info);
3823
+ });
3824
+ env.WaitForWakeUp ();
3825
+
3826
+ Cerr << " ... initializing schema" << Endl;
3827
+ env.SendSync (rows.MakeScheme (new TCompactionPolicy ()));
3828
+
3829
+ Cerr << " ... inserting rows" << Endl;
3830
+ env.SendSync (rows.MakeRows (10 , 0 , 10 ));
3831
+
3832
+ Cerr << " ...compacting table" << Endl;
3833
+ env.SendSync (new NFake::TEvCompact (TRowsModel::TableId));
3834
+ env.WaitFor <NFake::TEvCompacted>();
3835
+
3836
+ Cerr << " ... starting follower" << Endl;
3837
+ TActorId followerSysActor;
3838
+ auto followerBootObserver = env->AddObserver <TEvTablet::TEvFBoot>([&](auto & ev) {
3839
+ followerSysActor = ev->Sender ;
3840
+ Cerr << " ... observed TEvTablet::TEvFBoot" << Endl;
3841
+ });
3842
+ TBlockEvents<NSharedCache::TEvRequest> blockedFollowerRequests (env.Env );
3843
+ env.FireFollower (env.Edge , env.Tablet , [&env](const TActorId &tablet, TTabletStorageInfo *info) {
3844
+ return new TTestFlatTablet (env.Edge , tablet, info);
3845
+ }, /* followerId */ 1 );
3846
+ env->WaitFor (" follower shared cache requests" , [&]{ return blockedFollowerRequests.size () > 0 ; });
3847
+
3848
+ Cerr << " ... stopping leader" << Endl;
3849
+ env.SendSync (new TEvents::TEvPoison, false , true );
3850
+ env.WaitForGone ();
3851
+
3852
+ blockedFollowerRequests.Stop ();
3853
+ TBlockEvents<NSharedCache::TEvRequest> blockedLeaderRequests (env.Env );
3854
+
3855
+ TActorId leaderSysActor;
3856
+ auto leaderBootObserver = env->AddObserver <TEvTablet::TEvBoot>([&](auto & ev) {
3857
+ leaderSysActor = ev->Sender ;
3858
+ Cerr << " ... observed TEvTablet::TEvBoot" << Endl;
3859
+ });
3860
+ Cerr << " ... promoting follower" << Endl;
3861
+ {
3862
+ NFake::TStarter starter;
3863
+ auto * info = starter.MakeTabletInfo (env.Tablet , env.StorageGroupCount );
3864
+ auto * promote = new TEvTablet::TEvPromoteToLeader (0 , info);
3865
+ env->Send (new IEventHandle (followerSysActor, followerSysActor, promote), 0 , /* viaActorSystem */ true );
3866
+ }
3867
+ env->WaitFor (" promoted shared cache requests" , [&]{ return blockedLeaderRequests.size () > 0 ; });
3868
+
3869
+ Cerr << " ... unblocking promoted requests" << Endl;
3870
+ blockedLeaderRequests.Stop ().Unblock ();
3871
+ env->SimulateSleep (TDuration::MilliSeconds (10 ));
3872
+
3873
+ // Simulate reordering replies by reordering requests
3874
+ Cerr << " ... unblocking earlier requests" << Endl;
3875
+ blockedFollowerRequests.Unblock ();
3876
+ env->SimulateSleep (TDuration::MilliSeconds (10 ));
3877
+ }
3878
+
3814
3879
}
3815
3880
3816
3881
Y_UNIT_TEST_SUITE (TFlatTableExecutor_RejectProbability) {
0 commit comments