Skip to content

Commit

Permalink
scheduler: hot write scheduler randomly select the balance strategy (#…
Browse files Browse the repository at this point in the history
  • Loading branch information
nolouch authored and disksing committed Apr 19, 2018
1 parent 986c3ef commit 5bc920f
Show file tree
Hide file tree
Showing 2 changed files with 35 additions and 19 deletions.
20 changes: 14 additions & 6 deletions server/schedulers/balance_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -904,16 +904,24 @@ func (s *testBalanceHotWriteRegionSchedulerSuite) TestBalance(c *C) {
tc.addLeaderRegionWithWriteInfo(3, 1, 512*1024*schedule.RegionHeartBeatReportInterval, 2, 4)
opt.HotRegionLowThreshold = 0

// Will transfer a hot region from store 1 to store 6, because the total count of peers
// Will transfer a hot region from store 1, because the total count of peers
// which is hot for store 1 is more larger than other stores.
op := hb.Schedule(tc, schedule.NewOpInfluence(nil, tc))
c.Assert(op, NotNil)
if op[0].RegionID() == 2 {
checkTransferPeerWithLeaderTransferFrom(c, op[0], schedule.OpHotRegion, 1)
} else {
checkTransferPeerWithLeaderTransfer(c, op[0], schedule.OpHotRegion, 1, 6)
switch op[0].Len() {
case 1:
// balance by leader selected
checkTransferLeaderFrom(c, op[0], schedule.OpHotRegion, 1)
case 3:
// balance by peer selected
if op[0].RegionID() == 2 {
// peer in store 1 of the region 2 can transfer to store 5 or store 6 because of the label
checkTransferPeerWithLeaderTransferFrom(c, op[0], schedule.OpHotRegion, 1)
} else {
// peer in store 1 of the region 1,2 can only transfer to store 6
checkTransferPeerWithLeaderTransfer(c, op[0], schedule.OpHotRegion, 1, 6)
}
}

// After transfer a hot region from store 1 to store 5
//| region_id | leader_sotre | follower_store | follower_store | written_bytes |
//|-----------|--------------|----------------|----------------|---------------|
Expand Down
34 changes: 21 additions & 13 deletions server/schedulers/hot_region.go
Original file line number Diff line number Diff line change
Expand Up @@ -161,20 +161,28 @@ func (h *balanceHotRegionsScheduler) balanceHotReadRegions(cluster schedule.Clus
return nil
}

func (h *balanceHotRegionsScheduler) balanceHotWriteRegions(cluster schedule.Cluster) []*schedule.Operator {
// balance by peer
srcRegion, srcPeer, destPeer := h.balanceByPeer(cluster, h.stats.writeStatAsPeer)
if srcRegion != nil {
schedulerCounter.WithLabelValues(h.GetName(), "move_peer").Inc()
return []*schedule.Operator{schedule.CreateMovePeerOperator("moveHotWriteRegion", cluster, srcRegion, schedule.OpHotRegion, srcPeer.GetStoreId(), destPeer.GetStoreId(), destPeer.GetId())}
}
// balanceHotRetryLimit is the limit to retry schedule for selected balance strategy.
const balanceHotRetryLimit = 10

// balance by leader
srcRegion, newLeader := h.balanceByLeader(cluster, h.stats.writeStatAsLeader)
if srcRegion != nil {
schedulerCounter.WithLabelValues(h.GetName(), "move_leader").Inc()
step := schedule.TransferLeader{FromStore: srcRegion.Leader.GetStoreId(), ToStore: newLeader.GetStoreId()}
return []*schedule.Operator{schedule.NewOperator("transferHotWriteLeader", srcRegion.GetId(), schedule.OpHotRegion|schedule.OpLeader, step)}
func (h *balanceHotRegionsScheduler) balanceHotWriteRegions(cluster schedule.Cluster) []*schedule.Operator {
for i := 0; i < balanceHotRetryLimit; i++ {
switch h.r.Int() % 2 {
case 0:
// balance by peer
srcRegion, srcPeer, destPeer := h.balanceByPeer(cluster, h.stats.writeStatAsPeer)
if srcRegion != nil {
schedulerCounter.WithLabelValues(h.GetName(), "move_peer").Inc()
return []*schedule.Operator{schedule.CreateMovePeerOperator("moveHotWriteRegion", cluster, srcRegion, schedule.OpHotRegion, srcPeer.GetStoreId(), destPeer.GetStoreId(), destPeer.GetId())}
}
case 1:
// balance by leader
srcRegion, newLeader := h.balanceByLeader(cluster, h.stats.writeStatAsLeader)
if srcRegion != nil {
schedulerCounter.WithLabelValues(h.GetName(), "move_leader").Inc()
step := schedule.TransferLeader{FromStore: srcRegion.Leader.GetStoreId(), ToStore: newLeader.GetStoreId()}
return []*schedule.Operator{schedule.NewOperator("transferHotWriteLeader", srcRegion.GetId(), schedule.OpHotRegion|schedule.OpLeader, step)}
}
}
}

schedulerCounter.WithLabelValues(h.GetName(), "skip").Inc()
Expand Down

0 comments on commit 5bc920f

Please sign in to comment.