@@ -34,6 +34,7 @@ import (
3434 "github.com/tikv/pd/server/kv"
3535 "github.com/tikv/pd/server/schedule/opt"
3636 "github.com/tikv/pd/server/schedule/placement"
37+ "github.com/tikv/pd/server/statistics"
3738 "github.com/tikv/pd/server/versioninfo"
3839)
3940
@@ -651,6 +652,68 @@ func (s *testClusterInfoSuite) TestRegionSplitAndMerge(c *C) {
651652 }
652653}
653654
655+ func (s * testClusterInfoSuite ) TestOfflineAndMerge (c * C ) {
656+ _ , opt , err := newTestScheduleConfig ()
657+ c .Assert (err , IsNil )
658+ cluster := newTestRaftCluster (mockid .NewIDAllocator (), opt , core .NewStorage (kv .NewMemoryKV ()), core .NewBasicCluster ())
659+
660+ storage := core .NewStorage (kv .NewMemoryKV ())
661+ cluster .ruleManager = placement .NewRuleManager (storage , cluster )
662+ if opt .IsPlacementRulesEnabled () {
663+ err := cluster .ruleManager .Initialize (opt .GetMaxReplicas (), opt .GetLocationLabels ())
664+ if err != nil {
665+ panic (err )
666+ }
667+ }
668+ cluster .regionStats = statistics .NewRegionStatistics (cluster .GetOpts (), cluster .ruleManager )
669+
670+ // Put 3 stores.
671+ for _ , store := range newTestStores (4 , "5.0.0" ) {
672+ c .Assert (cluster .PutStore (store .GetMeta ()), IsNil )
673+ }
674+
675+ peers := []* metapb.Peer {
676+ {
677+ Id : 4 ,
678+ StoreId : 1 ,
679+ }, {
680+ Id : 5 ,
681+ StoreId : 2 ,
682+ }, {
683+ Id : 6 ,
684+ StoreId : 3 ,
685+ },
686+ }
687+ origin := core .NewRegionInfo (
688+ & metapb.Region {
689+ StartKey : []byte {},
690+ EndKey : []byte {},
691+ RegionEpoch : & metapb.RegionEpoch {ConfVer : 2 , Version : 2 },
692+ Id : 1 ,
693+ Peers : peers }, peers [0 ])
694+ regions := []* core.RegionInfo {origin }
695+
696+ // store 1: up -> offline
697+ c .Assert (cluster .RemoveStore (1 , false ), IsNil )
698+ store := cluster .GetStore (1 )
699+ c .Assert (store .IsOffline (), IsTrue )
700+
701+ // Split.
702+ n := 7
703+ for i := 0 ; i < n ; i ++ {
704+ regions = core .SplitRegions (regions )
705+ }
706+ heartbeatRegions (c , cluster , regions )
707+ c .Assert (cluster .GetOfflineRegionStatsByType (statistics .OfflinePeer ), HasLen , len (regions ))
708+
709+ // Merge.
710+ for i := 0 ; i < n ; i ++ {
711+ regions = core .MergeRegions (regions )
712+ heartbeatRegions (c , cluster , regions )
713+ c .Assert (cluster .GetOfflineRegionStatsByType (statistics .OfflinePeer ), HasLen , len (regions ))
714+ }
715+ }
716+
654717func (s * testClusterInfoSuite ) TestUpdateStorePendingPeerCount (c * C ) {
655718 _ , opt , err := newTestScheduleConfig ()
656719 c .Assert (err , IsNil )
0 commit comments