|
|
@ -208,17 +208,22 @@ func (c *commandVolumeServerEvacuate) moveAwayOneEcVolume(commandEnv *CommandEnv |
|
|
|
} |
|
|
|
|
|
|
|
func moveAwayOneNormalVolume(commandEnv *CommandEnv, volumeReplicas map[uint32][]*VolumeReplica, vol *master_pb.VolumeInformationMessage, thisNode *Node, otherNodes []*Node, applyChange bool) (hasMoved bool, err error) { |
|
|
|
fn := capacityByFreeVolumeCount(types.ToDiskType(vol.DiskType)) |
|
|
|
freeVolumeCountfn := capacityByFreeVolumeCount(types.ToDiskType(vol.DiskType)) |
|
|
|
maxVolumeCountFn := capacityByMaxVolumeCount(types.ToDiskType(vol.DiskType)) |
|
|
|
for _, n := range otherNodes { |
|
|
|
n.selectVolumes(func(v *master_pb.VolumeInformationMessage) bool { |
|
|
|
return v.DiskType == vol.DiskType |
|
|
|
}) |
|
|
|
} |
|
|
|
// most empty one is in the front
|
|
|
|
slices.SortFunc(otherNodes, func(a, b *Node) bool { |
|
|
|
return a.localVolumeRatio(fn) < b.localVolumeRatio(fn) |
|
|
|
return a.localVolumeRatio(maxVolumeCountFn) < b.localVolumeRatio(maxVolumeCountFn) |
|
|
|
}) |
|
|
|
for i := 0; i < len(otherNodes); i++ { |
|
|
|
emptyNode := otherNodes[i] |
|
|
|
if freeVolumeCountfn(emptyNode.info) < 0 { |
|
|
|
continue |
|
|
|
} |
|
|
|
hasMoved, err = maybeMoveOneVolume(commandEnv, volumeReplicas, thisNode, vol, emptyNode, applyChange) |
|
|
|
if err != nil { |
|
|
|
return |
|
|
|