mirror of
https://github.com/chrislusf/seaweedfs
synced 2024-06-05 18:20:48 +02:00
weed/shell: Fix volume.balance logic (#5238)
This commit is contained in:
parent
0b71fae2e3
commit
a6aee847b9
|
@ -1,6 +1,7 @@
|
||||||
package shell
|
package shell
|
||||||
|
|
||||||
import (
|
import (
|
||||||
|
"cmp"
|
||||||
"flag"
|
"flag"
|
||||||
"fmt"
|
"fmt"
|
||||||
"io"
|
"io"
|
||||||
|
@ -244,7 +245,7 @@ func (n *Node) selectVolumes(fn func(v *master_pb.VolumeInformationMessage) bool
|
||||||
|
|
||||||
func sortWritableVolumes(volumes []*master_pb.VolumeInformationMessage) {
|
func sortWritableVolumes(volumes []*master_pb.VolumeInformationMessage) {
|
||||||
slices.SortFunc(volumes, func(a, b *master_pb.VolumeInformationMessage) int {
|
slices.SortFunc(volumes, func(a, b *master_pb.VolumeInformationMessage) int {
|
||||||
return int(a.Size - b.Size)
|
return cmp.Compare(a.Size, b.Size)
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -270,7 +271,7 @@ func balanceSelectedVolume(commandEnv *CommandEnv, diskType types.DiskType, volu
|
||||||
for hasMoved {
|
for hasMoved {
|
||||||
hasMoved = false
|
hasMoved = false
|
||||||
slices.SortFunc(nodesWithCapacity, func(a, b *Node) int {
|
slices.SortFunc(nodesWithCapacity, func(a, b *Node) int {
|
||||||
return int(a.localVolumeRatio(capacityFunc) - b.localVolumeRatio(capacityFunc))
|
return cmp.Compare(a.localVolumeRatio(capacityFunc), b.localVolumeRatio(capacityFunc))
|
||||||
})
|
})
|
||||||
if len(nodesWithCapacity) == 0 {
|
if len(nodesWithCapacity) == 0 {
|
||||||
fmt.Printf("no volume server found with capacity for %s", diskType.ReadableString())
|
fmt.Printf("no volume server found with capacity for %s", diskType.ReadableString())
|
||||||
|
@ -278,7 +279,8 @@ func balanceSelectedVolume(commandEnv *CommandEnv, diskType types.DiskType, volu
|
||||||
}
|
}
|
||||||
|
|
||||||
var fullNode *Node
|
var fullNode *Node
|
||||||
for fullNodeIndex := len(nodesWithCapacity) - 1; fullNodeIndex >= 0; fullNodeIndex-- {
|
var fullNodeIndex int
|
||||||
|
for fullNodeIndex = len(nodesWithCapacity) - 1; fullNodeIndex >= 0; fullNodeIndex-- {
|
||||||
fullNode = nodesWithCapacity[fullNodeIndex]
|
fullNode = nodesWithCapacity[fullNodeIndex]
|
||||||
if !fullNode.isOneVolumeOnly() {
|
if !fullNode.isOneVolumeOnly() {
|
||||||
break
|
break
|
||||||
|
@ -289,9 +291,7 @@ func balanceSelectedVolume(commandEnv *CommandEnv, diskType types.DiskType, volu
|
||||||
candidateVolumes = append(candidateVolumes, v)
|
candidateVolumes = append(candidateVolumes, v)
|
||||||
}
|
}
|
||||||
sortCandidatesFn(candidateVolumes)
|
sortCandidatesFn(candidateVolumes)
|
||||||
|
for _, emptyNode := range nodesWithCapacity[:fullNodeIndex] {
|
||||||
for i := 0; i < len(nodesWithCapacity)-1; i++ {
|
|
||||||
emptyNode := nodesWithCapacity[i]
|
|
||||||
if !(fullNode.localVolumeRatio(capacityFunc) > idealVolumeRatio && emptyNode.localVolumeNextRatio(capacityFunc) <= idealVolumeRatio) {
|
if !(fullNode.localVolumeRatio(capacityFunc) > idealVolumeRatio && emptyNode.localVolumeNextRatio(capacityFunc) <= idealVolumeRatio) {
|
||||||
// no more volume servers with empty slots
|
// no more volume servers with empty slots
|
||||||
break
|
break
|
||||||
|
|
Loading…
Reference in a new issue