Skip to content

Commit

Permalink
server: add max one peer count balance support. (#173)
Browse files Browse the repository at this point in the history
  • Loading branch information
qiuyesuifeng authored Jul 1, 2016
1 parent dee804c commit 098669f
Show file tree
Hide file tree
Showing 2 changed files with 61 additions and 5 deletions.
21 changes: 16 additions & 5 deletions server/balancer.go
Original file line number Diff line number Diff line change
Expand Up @@ -247,18 +247,29 @@ func (rb *resourceBalancer) selectRemovePeer(cluster *clusterInfo, peers map[uin
}

func (rb *resourceBalancer) doLeaderBalance(cluster *clusterInfo, stores []*storeInfo, region *metapb.Region, leader *metapb.Peer, newPeer *metapb.Peer) (*balanceOperator, error) {
if !rb.checkScore(cluster, leader, newPeer) {
return nil, nil
}

regionID := region.GetId()

// If cluster max peer count config is 1, we cannot do leader transfer,
// only need to add new peer and remove leader peer.
meta := cluster.getMeta()
if meta.GetMaxPeerCount() == 1 {
addPeerOperator := newAddPeerOperator(regionID, newPeer)
removePeerOperator := newRemovePeerOperator(regionID, leader)

return newBalanceOperator(region, addPeerOperator, removePeerOperator), nil
}

followerPeers, _ := getFollowerPeers(region, leader)
newLeader := rb.selectNewLeaderPeer(cluster, followerPeers)
if newLeader == nil {
log.Warn("new leader peer cannot be found to do balance, try to do follower peer balance")
return nil, nil
}

if !rb.checkScore(cluster, leader, newPeer) {
return nil, nil
}

regionID := region.GetId()
leaderTransferOperator := newTransferLeaderOperator(regionID, leader, newLeader, maxWaitCount)
addPeerOperator := newAddPeerOperator(regionID, newPeer)
removePeerOperator := newRemovePeerOperator(regionID, leader)
Expand Down
45 changes: 45 additions & 0 deletions server/balancer_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -330,4 +330,49 @@ func (s *testBalancerSuite) TestResourceBalancer(c *C) {
bop, err = cb.Balance(clusterInfo)
c.Assert(err, IsNil)
c.Assert(bop, IsNil)

// If cluster max peer count config is 1, we can only add peer and remove leader peer.
s.updateStore(c, clusterInfo, 1, 100, 60, 0, 0)
s.updateStore(c, clusterInfo, 2, 100, 70, 0, 0)
s.updateStore(c, clusterInfo, 3, 100, 80, 0, 0)
s.updateStore(c, clusterInfo, 4, 100, 90, 0, 0)

// Set cluster config.
oldMeta := clusterInfo.getMeta()
meta := &metapb.Cluster{
Id: proto.Uint64(0),
MaxPeerCount: proto.Uint32(1),
}
clusterInfo.setMeta(meta)

testCfg.MinCapacityUsedRatio = 0.3
testCfg.MaxCapacityUsedRatio = 0.9
cb = newResourceBalancer(testCfg)
bop, err = cb.Balance(clusterInfo)
c.Assert(err, IsNil)
c.Assert(bop, IsNil)

// Set region peers to one peer.
peers := region.GetPeers()
region.Peers = []*metapb.Peer{leaderPeer}
clusterInfo.regions.updateRegion(region)

cb = newResourceBalancer(testCfg)
bop, err = cb.Balance(clusterInfo)
c.Assert(err, IsNil)
c.Assert(bop, NotNil)

newOp1 = bop.Ops[0].(*changePeerOperator)
c.Assert(newOp1.ChangePeer.GetChangeType(), Equals, raftpb.ConfChangeType_AddNode)
c.Assert(newOp1.ChangePeer.GetPeer().GetStoreId(), Equals, uint64(4))

newOp2 = bop.Ops[1].(*changePeerOperator)
c.Assert(newOp2.ChangePeer.GetChangeType(), Equals, raftpb.ConfChangeType_RemoveNode)
c.Assert(newOp2.ChangePeer.GetPeer().GetStoreId(), Equals, uint64(1))

// Reset cluster config and region peers.
clusterInfo.setMeta(oldMeta)

region.Peers = peers
clusterInfo.regions.updateRegion(region)
}

0 comments on commit 098669f

Please sign in to comment.