@@ -578,7 +578,7 @@ func TestRaftClusterRestart(t *testing.T) {
578578 re .NotNil (rc )
579579 rc .Stop ()
580580
581- err = rc .Start (leaderServer .GetServer ())
581+ err = rc .Start (leaderServer .GetServer (), false )
582582 re .NoError (err )
583583
584584 rc = leaderServer .GetRaftCluster ()
@@ -619,14 +619,105 @@ func TestRaftClusterMultipleRestart(t *testing.T) {
619619 for range 100 {
620620 // See https://github.com/tikv/pd/issues/8543
621621 rc .Wait ()
622- err = rc .Start (leaderServer .GetServer ())
622+ err = rc .Start (leaderServer .GetServer (), false )
623623 re .NoError (err )
624624 time .Sleep (time .Millisecond )
625625 rc .Stop ()
626626 }
627627 re .NoError (failpoint .Disable ("github.com/tikv/pd/server/cluster/highFrequencyClusterJobs" ))
628628}
629629
630+ // TestRaftClusterStartTSOJob is used to test whether tso job service is normally closed
631+ // when raft cluster is stopped ahead of time.
632+ // Ref: https://github.com/tikv/pd/issues/8836
633+ func TestRaftClusterStartTSOJob (t * testing.T ) {
634+ re := require .New (t )
635+ name := "pd1"
636+ // case 1: normal start
637+ ctx , cancel := context .WithCancel (context .Background ())
638+ tc , err := tests .NewTestCluster (ctx , 1 , func (conf * config.Config , _ string ) {
639+ conf .LeaderLease = 300
640+ })
641+ re .NoError (err )
642+ re .NoError (tc .RunInitialServers ())
643+ re .NotEmpty (tc .WaitLeader ())
644+ leaderServer := tc .GetLeaderServer ()
645+ re .NotNil (leaderServer )
646+ leaderServer .BootstrapCluster ()
647+ testutil .Eventually (re , func () bool {
648+ allocator := tc .GetServer (name ).GetServer ().GetGlobalTSOAllocator ()
649+ return allocator .IsInitialize ()
650+ })
651+ tc .Destroy ()
652+ cancel ()
653+ // case 2: return ahead of time but no error when start raft cluster
654+ re .NoError (failpoint .Enable ("github.com/tikv/pd/server/cluster/raftClusterReturn" , `return(false)` ))
655+ ctx , cancel = context .WithCancel (context .Background ())
656+ tc , err = tests .NewTestCluster (ctx , 1 , func (conf * config.Config , _ string ) {
657+ conf .LeaderLease = 300
658+ })
659+ re .NoError (err )
660+ err = tc .RunInitialServers ()
661+ re .NoError (err )
662+ tc .WaitLeader ()
663+ testutil .Eventually (re , func () bool {
664+ allocator := tc .GetServer (name ).GetServer ().GetGlobalTSOAllocator ()
665+ return allocator .IsInitialize ()
666+ })
667+ re .NoError (failpoint .Disable ("github.com/tikv/pd/server/cluster/raftClusterReturn" ))
668+ tc .Destroy ()
669+ cancel ()
670+ // case 3: meet error when start raft cluster
671+ re .NoError (failpoint .Enable ("github.com/tikv/pd/server/cluster/raftClusterReturn" , `return(true)` ))
672+ ctx , cancel = context .WithCancel (context .Background ())
673+ tc , err = tests .NewTestCluster (ctx , 1 , func (conf * config.Config , _ string ) {
674+ conf .LeaderLease = 300
675+ })
676+ re .NoError (err )
677+ err = tc .RunInitialServers ()
678+ re .NoError (err )
679+ tc .WaitLeader ()
680+ testutil .Eventually (re , func () bool {
681+ allocator := tc .GetServer (name ).GetServer ().GetGlobalTSOAllocator ()
682+ return ! allocator .IsInitialize ()
683+ })
684+ re .NoError (failpoint .Disable ("github.com/tikv/pd/server/cluster/raftClusterReturn" ))
685+ tc .Destroy ()
686+ cancel ()
687+ // case 4: multiple bootstrap in 3 pd cluster
688+ ctx , cancel = context .WithCancel (context .Background ())
689+ tc , err = tests .NewTestCluster (ctx , 3 , func (conf * config.Config , _ string ) {
690+ conf .LeaderLease = 300
691+ })
692+ re .NoError (err )
693+ re .NoError (tc .RunInitialServers ())
694+ re .NotEmpty (tc .WaitLeader ())
695+ leaderServer = tc .GetLeaderServer ()
696+ re .NotNil (leaderServer )
697+ name = leaderServer .GetLeader ().GetName ()
698+ wg := sync.WaitGroup {}
699+ for range 3 {
700+ wg .Add (1 )
701+ go func () {
702+ leaderServer .BootstrapCluster ()
703+ wg .Done ()
704+ }()
705+ }
706+ wg .Wait ()
707+ testutil .Eventually (re , func () bool {
708+ allocator := leaderServer .GetServer ().GetGlobalTSOAllocator ()
709+ return allocator .IsInitialize ()
710+ })
711+ re .NoError (tc .ResignLeader ())
712+ re .NotEmpty (tc .WaitLeader ())
713+ testutil .Eventually (re , func () bool {
714+ allocator := tc .GetServer (name ).GetServer ().GetGlobalTSOAllocator ()
715+ return ! allocator .IsInitialize ()
716+ })
717+ tc .Destroy ()
718+ cancel ()
719+ }
720+
630721func newMetaStore (storeID uint64 , addr , version string , state metapb.StoreState , deployPath string ) * metapb.Store {
631722 return & metapb.Store {Id : storeID , Address : addr , Version : version , State : state , DeployPath : deployPath }
632723}
@@ -1435,7 +1526,7 @@ func TestTransferLeaderForScheduler(t *testing.T) {
14351526 tc .WaitLeader ()
14361527 leaderServer = tc .GetLeaderServer ()
14371528 rc1 := leaderServer .GetServer ().GetRaftCluster ()
1438- rc1 .Start (leaderServer .GetServer ())
1529+ rc1 .Start (leaderServer .GetServer (), false )
14391530 re .NoError (err )
14401531 re .NotNil (rc1 )
14411532 // region heartbeat
@@ -1455,7 +1546,7 @@ func TestTransferLeaderForScheduler(t *testing.T) {
14551546 tc .WaitLeader ()
14561547 leaderServer = tc .GetLeaderServer ()
14571548 rc = leaderServer .GetServer ().GetRaftCluster ()
1458- rc .Start (leaderServer .GetServer ())
1549+ rc .Start (leaderServer .GetServer (), false )
14591550 re .NotNil (rc )
14601551 // region heartbeat
14611552 id = leaderServer .GetAllocator ()
0 commit comments