diff --git a/pkg/mock/mockcluster/mockcluster.go b/pkg/mock/mockcluster/mockcluster.go index a96aec60fe9..198d526cf6b 100644 --- a/pkg/mock/mockcluster/mockcluster.go +++ b/pkg/mock/mockcluster/mockcluster.go @@ -69,11 +69,6 @@ func NewCluster(ctx context.Context, opts *config.PersistOptions) *Cluster { return clus } -// GetClusterType returns the cluster type -func (mc *Cluster) GetClusterType() core.ClusterType { - return core.MockCluster -} - // GetOpts returns the cluster configuration. func (mc *Cluster) GetOpts() *config.PersistOptions { return mc.PersistOptions diff --git a/server/cluster/cluster.go b/server/cluster/cluster.go index e0d2359ebc5..f769d752660 100644 --- a/server/cluster/cluster.go +++ b/server/cluster/cluster.go @@ -460,11 +460,6 @@ func (c *RaftCluster) SetStorage(s *core.Storage) { c.storage = s } -// GetClusterType returns the cluster type -func (c *RaftCluster) GetClusterType() core.ClusterType { - return core.RaftCluster -} - // GetOpts returns cluster's configuration. func (c *RaftCluster) GetOpts() *config.PersistOptions { return c.opt diff --git a/server/core/kind.go b/server/core/kind.go index 639ca3f1d52..517514f293e 100644 --- a/server/core/kind.go +++ b/server/core/kind.go @@ -130,14 +130,3 @@ func StringToKeyType(input string) KeyType { } } -// ClusterType means the type of cluster -type ClusterType int - -const ( - // RaftCluster means the ClusterType of RaftCluster - RaftCluster ClusterType = iota - // RangeCluster means the ClusterType of RangeCluster - RangeCluster - // MockCluster means the ClusterType of MockCluster - MockCluster -) diff --git a/server/schedule/opt/healthy.go b/server/schedule/opt/healthy.go index 7fdf192cd0d..420911a6557 100644 --- a/server/schedule/opt/healthy.go +++ b/server/schedule/opt/healthy.go @@ -53,13 +53,7 @@ func HealthAllowPending(cluster Cluster) func(*core.RegionInfo) bool { // AllowBalanceEmptyRegion returns a function that checks if a region is an empty region and can be balanced. func AllowBalanceEmptyRegion(cluster Cluster) func(*core.RegionInfo) bool { - switch cluster.GetClusterType() { - case core.RangeCluster: - // allow empty region to be scheduled in range cluster - return func(region *core.RegionInfo) bool { return true } - default: - return func(region *core.RegionInfo) bool { return IsEmptyRegionAllowBalance(cluster, region) } - } + return func(region *core.RegionInfo) bool { return IsEmptyRegionAllowBalance(cluster, region) } } // IsRegionReplicated checks if a region is fully replicated. When placement diff --git a/server/schedule/opt/opts.go b/server/schedule/opt/opts.go index e98b071e11f..c100b12b111 100644 --- a/server/schedule/opt/opts.go +++ b/server/schedule/opt/opts.go @@ -38,7 +38,6 @@ type Cluster interface { statistics.RegionStatInformer statistics.StoreStatInformer - GetClusterType() core.ClusterType GetOpts() *config.PersistOptions AllocID() (uint64, error) FitRegion(*core.RegionInfo) *placement.RegionFit diff --git a/server/schedule/range_cluster.go b/server/schedule/range_cluster.go index 6f37a6ad3a3..9d51b3e4a20 100644 --- a/server/schedule/range_cluster.go +++ b/server/schedule/range_cluster.go @@ -40,11 +40,6 @@ func GenRangeCluster(cluster opt.Cluster, startKey, endKey []byte) *RangeCluster } } -// GetClusterType returns the cluster type -func (r *RangeCluster) GetClusterType() core.ClusterType { - return core.RangeCluster -} - func (r *RangeCluster) updateStoreInfo(s *core.StoreInfo) *core.StoreInfo { id := s.GetID() diff --git a/server/schedulers/balance_region.go b/server/schedulers/balance_region.go index 27e039f8b21..f1ad5b38b56 100644 --- a/server/schedulers/balance_region.go +++ b/server/schedulers/balance_region.go @@ -149,23 +149,34 @@ func (s *balanceRegionScheduler) Schedule(cluster opt.Cluster) []*operator.Opera return stores[i].RegionScore(opts.GetRegionScoreFormulaVersion(), opts.GetHighSpaceRatio(), opts.GetLowSpaceRatio(), iOp) > stores[j].RegionScore(opts.GetRegionScoreFormulaVersion(), opts.GetHighSpaceRatio(), opts.GetLowSpaceRatio(), jOp) }) + + var allowBalanceEmptyRegion func(*core.RegionInfo) bool + + switch cluster.(type) { + case *schedule.RangeCluster: + // allow empty region to be scheduled in range cluster + allowBalanceEmptyRegion = func(region *core.RegionInfo) bool { return true } + default: + allowBalanceEmptyRegion = opt.AllowBalanceEmptyRegion(cluster) + } + for _, plan.source = range stores { for i := 0; i < balanceRegionRetryLimit; i++ { schedulerCounter.WithLabelValues(s.GetName(), "total").Inc() // Priority pick the region that has a pending peer. // Pending region may means the disk is overload, remove the pending region firstly. - plan.region = cluster.RandPendingRegion(plan.SourceStoreID(), s.conf.Ranges, opt.HealthAllowPending(cluster), opt.ReplicatedRegion(cluster), opt.AllowBalanceEmptyRegion(cluster)) + plan.region = cluster.RandPendingRegion(plan.SourceStoreID(), s.conf.Ranges, opt.HealthAllowPending(cluster), opt.ReplicatedRegion(cluster), allowBalanceEmptyRegion) if plan.region == nil { // Then pick the region that has a follower in the source store. - plan.region = cluster.RandFollowerRegion(plan.SourceStoreID(), s.conf.Ranges, opt.HealthRegion(cluster), opt.ReplicatedRegion(cluster), opt.AllowBalanceEmptyRegion(cluster)) + plan.region = cluster.RandFollowerRegion(plan.SourceStoreID(), s.conf.Ranges, opt.HealthRegion(cluster), opt.ReplicatedRegion(cluster), allowBalanceEmptyRegion) } if plan.region == nil { // Then pick the region has the leader in the source store. - plan.region = cluster.RandLeaderRegion(plan.SourceStoreID(), s.conf.Ranges, opt.HealthRegion(cluster), opt.ReplicatedRegion(cluster), opt.AllowBalanceEmptyRegion(cluster)) + plan.region = cluster.RandLeaderRegion(plan.SourceStoreID(), s.conf.Ranges, opt.HealthRegion(cluster), opt.ReplicatedRegion(cluster), allowBalanceEmptyRegion) } if plan.region == nil { // Finally pick learner. - plan.region = cluster.RandLearnerRegion(plan.SourceStoreID(), s.conf.Ranges, opt.HealthRegion(cluster), opt.ReplicatedRegion(cluster), opt.AllowBalanceEmptyRegion(cluster)) + plan.region = cluster.RandLearnerRegion(plan.SourceStoreID(), s.conf.Ranges, opt.HealthRegion(cluster), opt.ReplicatedRegion(cluster), allowBalanceEmptyRegion) } if plan.region == nil { schedulerCounter.WithLabelValues(s.GetName(), "no-region").Inc() diff --git a/server/schedulers/utils.go b/server/schedulers/utils.go index 1c5c4b151e7..458d733658b 100644 --- a/server/schedulers/utils.go +++ b/server/schedulers/utils.go @@ -150,10 +150,10 @@ func (p *balancePlan) getTolerantResource() int64 { func adjustTolerantRatio(cluster opt.Cluster, kind core.ScheduleKind) float64 { var tolerantSizeRatio float64 - switch cluster.GetClusterType() { - case core.RangeCluster: + switch c := cluster.(type) { + case *schedule.RangeCluster: // range cluster use a separate configuration - tolerantSizeRatio = cluster.(*schedule.RangeCluster).GetTolerantSizeRatio() + tolerantSizeRatio = c.GetTolerantSizeRatio() default: tolerantSizeRatio = cluster.GetOpts().GetTolerantSizeRatio() }