diff --git a/server/schedulers/balance_region.go b/server/schedulers/balance_region.go index bfb73ef7f2f1..08b05b155ca4 100644 --- a/server/schedulers/balance_region.go +++ b/server/schedulers/balance_region.go @@ -167,6 +167,13 @@ func (s *balanceRegionScheduler) Schedule(cluster opt.Cluster) []*operator.Opera } log.Debug("select region", zap.String("scheduler", s.GetName()), zap.Uint64("region-id", region.GetID())) + // Skip the empty region + if region.GetApproximateSize() <= core.EmptyRegionApproximateSize { + log.Debug("region is empty", zap.String("scheduler", s.GetName()), zap.Uint64("region-id", region.GetID())) + schedulerCounter.WithLabelValues(s.GetName(), "empty-region").Inc() + continue + } + // Skip hot regions. if cluster.IsRegionHot(region) { log.Debug("region is hot", zap.String("scheduler", s.GetName()), zap.Uint64("region-id", region.GetID())) diff --git a/server/schedulers/balance_test.go b/server/schedulers/balance_test.go index 407eb658e1c3..49eebc0e2822 100644 --- a/server/schedulers/balance_test.go +++ b/server/schedulers/balance_test.go @@ -932,6 +932,37 @@ func (s *testBalanceRegionSchedulerSuite) TestShouldNotBalance(c *C) { } } +func (s *testBalanceRegionSchedulerSuite) TestEmptyRegion(c *C) { + opt := config.NewTestOptions() + tc := mockcluster.NewCluster(opt) + tc.DisableFeature(versioninfo.JointConsensus) + oc := schedule.NewOperatorController(s.ctx, nil, nil) + sb, err := schedule.CreateScheduler(BalanceRegionType, oc, core.NewStorage(kv.NewMemoryKV()), schedule.ConfigSliceDecoder(BalanceRegionType, []string{"", ""})) + c.Assert(err, IsNil) + tc.AddRegionStore(1, 10) + tc.AddRegionStore(2, 9) + tc.AddRegionStore(3, 10) + tc.AddRegionStore(4, 10) + region := core.NewRegionInfo( + &metapb.Region{ + Id: 5, + StartKey: []byte("a"), + EndKey: []byte("b"), + Peers: []*metapb.Peer{ + {Id: 6, StoreId: 1}, + {Id: 7, StoreId: 3}, + {Id: 8, StoreId: 4}, + }, + }, + &metapb.Peer{Id: 7, StoreId: 3}, + core.SetApproximateSize(1), + core.SetApproximateKeys(1), + ) + tc.PutRegion(region) + operators := sb.Schedule(tc) + c.Assert(operators, IsNil) +} + var _ = Suite(&testRandomMergeSchedulerSuite{}) type testRandomMergeSchedulerSuite struct{}