From b8d13afb3f735daccfb434ef10bd7847557a018c Mon Sep 17 00:00:00 2001 From: Chris Lu Date: Fri, 27 Feb 2026 16:42:08 -0800 Subject: [PATCH] fix shard assignment merge and mount errors --- .../erasure_coding/shard_distribution.go | 25 ++++++++++++++++++- 1 file changed, 24 insertions(+), 1 deletion(-) diff --git a/weed/storage/erasure_coding/shard_distribution.go b/weed/storage/erasure_coding/shard_distribution.go index 172b2584f..f97fc87a9 100644 --- a/weed/storage/erasure_coding/shard_distribution.go +++ b/weed/storage/erasure_coding/shard_distribution.go @@ -2,6 +2,7 @@ package erasure_coding import ( "context" + "errors" "fmt" "io" "os" @@ -112,13 +113,31 @@ func DistributeEcShards(volumeID uint32, collection string, targets []*worker_pb } } - shardAssignment[target.Node] = assignedShards + existing := shardAssignment[target.Node] + if len(existing) == 0 { + shardAssignment[target.Node] = assignedShards + continue + } + + seen := make(map[string]struct{}, len(existing)) + for _, shard := range existing { + seen[shard] = struct{}{} + } + for _, shard := range assignedShards { + if _, ok := seen[shard]; ok { + continue + } + seen[shard] = struct{}{} + existing = append(existing, shard) + } + shardAssignment[target.Node] = existing } if len(shardAssignment) == 0 { return nil, fmt.Errorf("no shard assignments found from planning phase") } + var mountErrors []error for destNode, assignedShards := range shardAssignment { withFields(log, map[string]interface{}{ "destination": destNode, @@ -215,6 +234,7 @@ func MountEcShards(volumeID uint32, collection string, shardAssignment map[strin }) if err != nil { + mountErrors = append(mountErrors, fmt.Errorf("mount %s shards %v: %w", destNode, shardIds, err)) withFields(log, map[string]interface{}{ "destination": destNode, "shard_ids": shardIds, @@ -230,6 +250,9 @@ func MountEcShards(volumeID uint32, collection string, shardAssignment map[strin } } + if len(mountErrors) > 0 { + return errors.Join(mountErrors...) + } return nil }