Skip to content

Commit

Permalink
schedule: not limit remove peer of the down store (#4097) (#4114)
Browse files Browse the repository at this point in the history
* This is an automated cherry-pick of #4097

Signed-off-by: ti-chi-bot <ti-community-prow-bot@tidb.io>

* resolve conflicts

close #4090

Signed-off-by: Ryan Leung <rleungx@gmail.com>

Co-authored-by: Ryan Leung <rleungx@gmail.com>
  • Loading branch information
ti-chi-bot and rleungx authored Nov 30, 2021
1 parent fcecc89 commit 581ee38
Show file tree
Hide file tree
Showing 5 changed files with 61 additions and 4 deletions.
41 changes: 41 additions & 0 deletions server/cluster/coordinator_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -1033,6 +1033,47 @@ func (s *testOperatorControllerSuite) TestStoreOverloadedWithReplace(c *C) {
c.Assert(lb.Schedule(tc), NotNil)
}

func (s *testOperatorControllerSuite) TestDownStoreLimit(c *C) {
tc, co, cleanup := prepare(nil, nil, nil, c)
defer cleanup()
oc := co.opController
rc := co.checkers.GetRuleChecker()

tc.addRegionStore(1, 100)
tc.addRegionStore(2, 100)
tc.addRegionStore(3, 100)
tc.addLeaderRegion(1, 1, 2, 3)

region := tc.GetRegion(1)
tc.setStoreDown(1)
tc.SetStoreLimit(1, storelimit.RemovePeer, 1)

region = region.Clone(core.WithDownPeers([]*pdpb.PeerStats{
{
Peer: region.GetStorePeer(1),
DownSeconds: 24 * 60 * 60,
},
}), core.SetApproximateSize(1))
tc.putRegion(region)
for i := uint64(1); i < 20; i++ {
tc.addRegionStore(i+3, 100)
op := rc.Check(region)
c.Assert(op, NotNil)
c.Assert(oc.AddOperator(op), IsTrue)
oc.RemoveOperator(op)
}

region = region.Clone(core.SetApproximateSize(100))
tc.putRegion(region)
for i := uint64(20); i < 25; i++ {
tc.addRegionStore(i+3, 100)
op := rc.Check(region)
c.Assert(op, NotNil)
c.Assert(oc.AddOperator(op), IsTrue)
oc.RemoveOperator(op)
}
}

var _ = Suite(&testScheduleControllerSuite{})

type testScheduleControllerSuite struct {
Expand Down
5 changes: 5 additions & 0 deletions server/schedule/checker_controller.go
Original file line number Diff line number Diff line change
Expand Up @@ -108,6 +108,11 @@ func (c *CheckerController) GetMergeChecker() *checker.MergeChecker {
return c.mergeChecker
}

// GetRuleChecker returns the rule checker.
func (c *CheckerController) GetRuleChecker() *checker.RuleChecker {
return c.ruleChecker
}

// GetWaitingRegions returns the regions in the waiting list.
func (c *CheckerController) GetWaitingRegions() []*cache.Item {
return c.regionWaitingList.Elems()
Expand Down
12 changes: 9 additions & 3 deletions server/schedule/operator/builder.go
Original file line number Diff line number Diff line change
Expand Up @@ -663,9 +663,15 @@ func (b *Builder) execAddPeer(peer *metapb.Peer) {
}

func (b *Builder) execRemovePeer(peer *metapb.Peer) {
b.steps = append(b.steps, RemovePeer{FromStore: peer.GetStoreId(), PeerID: peer.GetId()})
delete(b.currentPeers, peer.GetStoreId())
delete(b.toRemove, peer.GetStoreId())
removeStoreID := peer.GetStoreId()
var isDownStore bool
store := b.cluster.GetStore(removeStoreID)
if store != nil {
isDownStore = store.DownTime() > b.cluster.GetOpts().GetMaxStoreDownTime()
}
b.steps = append(b.steps, RemovePeer{FromStore: removeStoreID, PeerID: peer.GetId(), IsDownStore: isDownStore})
delete(b.currentPeers, removeStoreID)
delete(b.toRemove, removeStoreID)
}

func (b *Builder) execChangePeerV2(needEnter bool, needTransferLeader bool) {
Expand Down
2 changes: 1 addition & 1 deletion server/schedule/operator/influence.go
Original file line number Diff line number Diff line change
Expand Up @@ -80,7 +80,7 @@ func (s *StoreInfluence) addStepCost(limitType storelimit.Type, cost int64) {
func (s *StoreInfluence) AdjustStepCost(limitType storelimit.Type, regionSize int64) {
if regionSize > storelimit.SmallRegionThreshold {
s.addStepCost(limitType, storelimit.RegionInfluence[limitType])
} else if regionSize <= storelimit.SmallRegionThreshold && regionSize > core.EmptyRegionApproximateSize {
} else if regionSize > core.EmptyRegionApproximateSize {
s.addStepCost(limitType, storelimit.SmallRegionInfluence[limitType])
}
}
5 changes: 5 additions & 0 deletions server/schedule/operator/step.go
Original file line number Diff line number Diff line change
Expand Up @@ -219,6 +219,7 @@ func (pl PromoteLearner) Influence(opInfluence OpInfluence, region *core.RegionI
// RemovePeer is an OpStep that removes a region peer.
type RemovePeer struct {
FromStore, PeerID uint64
IsDownStore bool
}

// ConfVerChanged returns the delta value for version increased by this step.
Expand Down Expand Up @@ -259,6 +260,10 @@ func (rp RemovePeer) Influence(opInfluence OpInfluence, region *core.RegionInfo)
regionSize := region.GetApproximateSize()
from.RegionSize -= regionSize
from.RegionCount--

if rp.IsDownStore && regionSize > storelimit.SmallRegionThreshold {
regionSize = storelimit.SmallRegionThreshold
}
from.AdjustStepCost(storelimit.RemovePeer, regionSize)
}

Expand Down

0 comments on commit 581ee38

Please sign in to comment.