From 392656d59e5d768cbed9b0a92cbf8b815f342d1e Mon Sep 17 00:00:00 2001 From: Lisandro Pin Date: Mon, 10 Feb 2025 18:49:58 +0100 Subject: [PATCH] `ec.encode`: Explictly mount EC shards after volume conversion. (#6528) This guarantees EC shards are immediately available after encoding, even if not affected by subsequent re-balancing. --- weed/shell/command_ec_encode.go | 14 ++++++++++++-- 1 file changed, 12 insertions(+), 2 deletions(-) diff --git a/weed/shell/command_ec_encode.go b/weed/shell/command_ec_encode.go index da0a94f0f..e341f7828 100644 --- a/weed/shell/command_ec_encode.go +++ b/weed/shell/command_ec_encode.go @@ -143,6 +143,7 @@ func doEcEncode(commandEnv *CommandEnv, collection string, vid needle.VolumeId, if !found { return fmt.Errorf("volume %d not found", vid) } + target := locations[0] // mark the volume as readonly ewg = NewErrorWaitGroup(maxParallelization) @@ -159,8 +160,8 @@ func doEcEncode(commandEnv *CommandEnv, collection string, vid needle.VolumeId, } // generate ec shards - if err := generateEcShards(commandEnv.option.GrpcDialOption, vid, collection, locations[0].ServerAddress()); err != nil { - return fmt.Errorf("generate ec shards for volume %d on %s: %v", vid, locations[0].Url, err) + if err := generateEcShards(commandEnv.option.GrpcDialOption, vid, collection, target.ServerAddress()); err != nil { + return fmt.Errorf("generate ec shards for volume %d on %s: %v", vid, target.Url, err) } // ask the source volume server to delete the original volume @@ -178,6 +179,15 @@ func doEcEncode(commandEnv *CommandEnv, collection string, vid needle.VolumeId, return err } + // mount all ec shards for the converted volume + shardIds := make([]uint32, erasure_coding.TotalShardsCount) + for i := range shardIds { + shardIds[i] = uint32(i) + } + if err := mountEcShards(commandEnv.option.GrpcDialOption, collection, vid, target.ServerAddress(), shardIds); err != nil { + return fmt.Errorf("mount ec shards for volume %d on %s: %v", vid, target.Url, err) + } + return nil }