fix balance channel (#23631)

Signed-off-by: Wei Liu <wei.liu@zilliz.com>
pull/23606/head^2
wei liu 2023-04-25 10:22:37 +08:00 committed by GitHub
parent 72485c9eeb
commit 6653e2c3b0
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
2 changed files with 37 additions and 9 deletions

View File

@ -267,24 +267,30 @@ func (b *RowCountBasedBalancer) genChannelPlan(replica *meta.Replica, onlineNode
}
for start < end {
sourceNode := nodes[start]
targetNode := nodes[end]
// segment to move in
targetNode := nodes[start]
// segment to move out
sourceNode := nodes[end]
if len(channelsOnNode[targetNode]) >= averageChannel {
break
}
// remove channel from end node
selectChannel := channelsOnNode[targetNode][0]
channelsOnNode[targetNode] = channelsOnNode[targetNode][1:]
selectChannel := channelsOnNode[sourceNode][0]
channelsOnNode[sourceNode] = channelsOnNode[sourceNode][1:]
// add channel to start node
if channelsOnNode[sourceNode] == nil {
channelsOnNode[sourceNode] = make([]*meta.DmChannel, 0)
if channelsOnNode[targetNode] == nil {
channelsOnNode[targetNode] = make([]*meta.DmChannel, 0)
}
channelsOnNode[sourceNode] = append(channelsOnNode[sourceNode], selectChannel)
channelsOnNode[targetNode] = append(channelsOnNode[targetNode], selectChannel)
// generate channel plan
plan := ChannelAssignPlan{
Channel: selectChannel,
From: targetNode,
To: sourceNode,
From: sourceNode,
To: targetNode,
ReplicaID: replica.ID,
}
channelPlans = append(channelPlans, plan)

View File

@ -272,6 +272,28 @@ func (suite *RowCountBasedBalancerTestSuite) TestBalance() {
{Channel: &meta.DmChannel{VchannelInfo: &datapb.VchannelInfo{CollectionID: 1, ChannelName: "v2"}, Node: 2}, From: 2, To: 3, ReplicaID: 1},
},
},
{
name: "unbalance stable view",
nodes: []int64{1, 2, 3},
segmentCnts: []int{0, 0, 0},
states: []session.State{session.NodeStateNormal, session.NodeStateNormal, session.NodeStateNormal},
shouldMock: true,
distributions: map[int64][]*meta.Segment{},
distributionChannels: map[int64][]*meta.DmChannel{
1: {
{VchannelInfo: &datapb.VchannelInfo{CollectionID: 1, ChannelName: "v1"}, Node: 2},
{VchannelInfo: &datapb.VchannelInfo{CollectionID: 1, ChannelName: "v2"}, Node: 2},
},
2: {
{VchannelInfo: &datapb.VchannelInfo{CollectionID: 1, ChannelName: "v3"}, Node: 2},
},
3: {
{VchannelInfo: &datapb.VchannelInfo{CollectionID: 1, ChannelName: "v4"}, Node: 2},
},
},
expectPlans: []SegmentAssignPlan{},
expectChannelPlans: []ChannelAssignPlan{},
},
{
name: "already balanced",
nodes: []int64{11, 22},