mirror of
https://github.com/talent-plan/tinykv.git
synced 2025-01-13 13:50:43 +08:00
e9462775d3
Signed-off-by: Connor1996 <zbk602423539@gmail.com>
83 lines
2.5 KiB
Go
83 lines
2.5 KiB
Go
// Copyright 2017 PingCAP, Inc.
|
|
//
|
|
// Licensed under the Apache License, Version 2.0 (the "License");
|
|
// you may not use this file except in compliance with the License.
|
|
// You may obtain a copy of the License at
|
|
//
|
|
// http://www.apache.org/licenses/LICENSE-2.0
|
|
//
|
|
// Unless required by applicable law or agreed to in writing, software
|
|
// distributed under the License is distributed on an "AS IS" BASIS,
|
|
// See the License for the specific language governing permissions and
|
|
// limitations under the License.
|
|
|
|
package schedulers
|
|
|
|
import (
|
|
"github.com/pingcap-incubator/tinykv/scheduler/server/core"
|
|
"github.com/pingcap-incubator/tinykv/scheduler/server/schedule"
|
|
"github.com/pingcap-incubator/tinykv/scheduler/server/schedule/operator"
|
|
"github.com/pingcap-incubator/tinykv/scheduler/server/schedule/opt"
|
|
)
|
|
|
|
func init() {
|
|
schedule.RegisterSliceDecoderBuilder("balance-region", func(args []string) schedule.ConfigDecoder {
|
|
return func(v interface{}) error {
|
|
return nil
|
|
}
|
|
})
|
|
schedule.RegisterScheduler("balance-region", func(opController *schedule.OperatorController, storage *core.Storage, decoder schedule.ConfigDecoder) (schedule.Scheduler, error) {
|
|
return newBalanceRegionScheduler(opController), nil
|
|
})
|
|
}
|
|
|
|
const (
|
|
// balanceRegionRetryLimit is the limit to retry schedule for selected store.
|
|
balanceRegionRetryLimit = 10
|
|
balanceRegionName = "balance-region-scheduler"
|
|
)
|
|
|
|
type balanceRegionScheduler struct {
|
|
*baseScheduler
|
|
name string
|
|
opController *schedule.OperatorController
|
|
}
|
|
|
|
// newBalanceRegionScheduler creates a scheduler that tends to keep regions on
|
|
// each store balanced.
|
|
func newBalanceRegionScheduler(opController *schedule.OperatorController, opts ...BalanceRegionCreateOption) schedule.Scheduler {
|
|
base := newBaseScheduler(opController)
|
|
s := &balanceRegionScheduler{
|
|
baseScheduler: base,
|
|
opController: opController,
|
|
}
|
|
for _, opt := range opts {
|
|
opt(s)
|
|
}
|
|
return s
|
|
}
|
|
|
|
// BalanceRegionCreateOption is used to create a scheduler with an option.
|
|
type BalanceRegionCreateOption func(s *balanceRegionScheduler)
|
|
|
|
func (s *balanceRegionScheduler) GetName() string {
|
|
if s.name != "" {
|
|
return s.name
|
|
}
|
|
return balanceRegionName
|
|
}
|
|
|
|
func (s *balanceRegionScheduler) GetType() string {
|
|
return "balance-region"
|
|
}
|
|
|
|
func (s *balanceRegionScheduler) IsScheduleAllowed(cluster opt.Cluster) bool {
|
|
return s.opController.OperatorCount(operator.OpRegion) < cluster.GetRegionScheduleLimit()
|
|
}
|
|
|
|
func (s *balanceRegionScheduler) Schedule(cluster opt.Cluster) *operator.Operator {
|
|
// Your Code Here (3C).
|
|
|
|
return nil
|
|
}
|