diff options
| author | chrislu <chris.lu@gmail.com> | 2023-04-17 22:56:21 -0700 |
|---|---|---|
| committer | chrislu <chris.lu@gmail.com> | 2023-04-17 22:56:21 -0700 |
| commit | 0a22eea55df8462d8fdfc206f4995304ddaca5d9 (patch) | |
| tree | 6ddf9797c1e817e62522e69d4f149cae36e3e8ad /weed/server/volume_grpc_erasure_coding.go | |
| parent | d50d736e68feb8896b7d3776ffe000fe2ebd2e7c (diff) | |
| download | seaweedfs-0a22eea55df8462d8fdfc206f4995304ddaca5d9.tar.xz seaweedfs-0a22eea55df8462d8fdfc206f4995304ddaca5d9.zip | |
collect ec shard from multiple locations
fix https://github.com/seaweedfs/seaweedfs/issues/4365
Diffstat (limited to 'weed/server/volume_grpc_erasure_coding.go')
| -rw-r--r-- | weed/server/volume_grpc_erasure_coding.go | 12 |
1 files changed, 10 insertions, 2 deletions
diff --git a/weed/server/volume_grpc_erasure_coding.go b/weed/server/volume_grpc_erasure_coding.go index c780a6cdf..55659ca0f 100644 --- a/weed/server/volume_grpc_erasure_coding.go +++ b/weed/server/volume_grpc_erasure_coding.go @@ -408,7 +408,9 @@ func (vs *VolumeServer) VolumeEcShardsToVolume(ctx context.Context, req *volume_ glog.V(0).Infof("VolumeEcShardsToVolume: %v", req) - v, found := vs.store.FindEcVolume(needle.VolumeId(req.VolumeId)) + // collect .ec00 ~ .ec09 files + shardFileNames := make([]string, erasure_coding.DataShardsCount) + v, found := vs.store.CollectEcShards(needle.VolumeId(req.VolumeId), shardFileNames) if !found { return nil, fmt.Errorf("ec volume %d not found", req.VolumeId) } @@ -417,6 +419,12 @@ func (vs *VolumeServer) VolumeEcShardsToVolume(ctx context.Context, req *volume_ return nil, fmt.Errorf("existing collection:%v unexpected input: %v", v.Collection, req.Collection) } + for shardId := 0; shardId < DataShardsCount; shardId++ { + if shardFileNames[shardId] == "" { + return nil, fmt.Errorf("ec volume %d missing shard %d", req.VolumeId, shardId) + } + } + dataBaseFileName, indexBaseFileName := v.DataBaseFileName(), v.IndexBaseFileName() // calculate .dat file size datFileSize, err := erasure_coding.FindDatFileSize(dataBaseFileName, indexBaseFileName) @@ -425,7 +433,7 @@ func (vs *VolumeServer) VolumeEcShardsToVolume(ctx context.Context, req *volume_ } // write .dat file from .ec00 ~ .ec09 files - if err := erasure_coding.WriteDatFile(dataBaseFileName, datFileSize); err != nil { + if err := erasure_coding.WriteDatFile(dataBaseFileName, datFileSize, shardFileNames); err != nil { return nil, fmt.Errorf("WriteDatFile %s: %v", dataBaseFileName, err) } |
