diff --git a/weed/worker/tasks/balance/detection.go b/weed/worker/tasks/balance/detection.go index 4e8c878fa..3af8d4b23 100644 --- a/weed/worker/tasks/balance/detection.go +++ b/weed/worker/tasks/balance/detection.go @@ -3,6 +3,7 @@ package balance import ( "fmt" "math" + "sort" "time" "github.com/seaweedfs/seaweedfs/weed/admin/topology" @@ -20,6 +21,9 @@ func Detection(metrics []*types.VolumeHealthMetrics, clusterInfo *types.ClusterI if !config.IsEnabled() { return nil, nil } + if clusterInfo == nil { + return nil, nil + } balanceConfig := config.(*Config) @@ -33,14 +37,22 @@ func Detection(metrics []*types.VolumeHealthMetrics, clusterInfo *types.ClusterI volumesByDiskType[metric.DiskType] = append(volumesByDiskType[metric.DiskType], metric) } + // Sort disk types for deterministic iteration order when maxResults + // spans multiple disk types. + diskTypes := make([]string, 0, len(volumesByDiskType)) + for dt := range volumesByDiskType { + diskTypes = append(diskTypes, dt) + } + sort.Strings(diskTypes) + var allParams []*types.TaskDetectionResult - for diskType, diskMetrics := range volumesByDiskType { + for _, diskType := range diskTypes { remaining := maxResults - len(allParams) if remaining <= 0 { break } - tasks := detectForDiskType(diskType, diskMetrics, balanceConfig, clusterInfo, remaining) + tasks := detectForDiskType(diskType, volumesByDiskType[diskType], balanceConfig, clusterInfo, remaining) allParams = append(allParams, tasks...) } diff --git a/weed/worker/tasks/balance/register.go b/weed/worker/tasks/balance/register.go index c7a79c1ca..cf9c7e1b8 100644 --- a/weed/worker/tasks/balance/register.go +++ b/weed/worker/tasks/balance/register.go @@ -59,7 +59,7 @@ func RegisterBalanceTask() { ), nil }, DetectionFunc: func(metrics []*types.VolumeHealthMetrics, info *types.ClusterInfo, config base.TaskConfig) ([]*types.TaskDetectionResult, error) { - return Detection(metrics, info, config, 1) + return Detection(metrics, info, config, 0) }, ScanInterval: 30 * time.Minute, SchedulingFunc: Scheduling,