diff options
| author | chrislu <chris.lu@gmail.com> | 2024-11-21 00:37:38 -0800 |
|---|---|---|
| committer | chrislu <chris.lu@gmail.com> | 2024-11-21 00:37:38 -0800 |
| commit | c9f344869246ca4d5c72f97f63226b41e0e9c190 (patch) | |
| tree | 42eca3055ffed84d8331aa5b5fa109df97dadf73 /weed/storage/erasure_coding | |
| parent | be09d08eb6bfb41266107e9ac3e29b2e60677680 (diff) | |
| download | seaweedfs-c9f344869246ca4d5c72f97f63226b41e0e9c190.tar.xz seaweedfs-c9f344869246ca4d5c72f97f63226b41e0e9c190.zip | |
ReadAt may return io.EOF t end of file
related to https://github.com/seaweedfs/seaweedfs/issues/6219
Diffstat (limited to 'weed/storage/erasure_coding')
| -rw-r--r-- | weed/storage/erasure_coding/ec_shard.go | 7 | ||||
| -rw-r--r-- | weed/storage/erasure_coding/ec_volume.go | 6 |
2 files changed, 10 insertions, 3 deletions
diff --git a/weed/storage/erasure_coding/ec_shard.go b/weed/storage/erasure_coding/ec_shard.go index 9fcb11525..0a7f4d09a 100644 --- a/weed/storage/erasure_coding/ec_shard.go +++ b/weed/storage/erasure_coding/ec_shard.go @@ -2,6 +2,7 @@ package erasure_coding import ( "fmt" + "io" "os" "path" "strconv" @@ -93,6 +94,10 @@ func (shard *EcVolumeShard) Destroy() { func (shard *EcVolumeShard) ReadAt(buf []byte, offset int64) (int, error) { - return shard.ecdFile.ReadAt(buf, offset) + n, err := shard.ecdFile.ReadAt(buf, offset) + if err == io.EOF && n == len(buf) { + err = nil + } + return n, err } diff --git a/weed/storage/erasure_coding/ec_volume.go b/weed/storage/erasure_coding/ec_volume.go index d3a76b561..385d30abe 100644 --- a/weed/storage/erasure_coding/ec_volume.go +++ b/weed/storage/erasure_coding/ec_volume.go @@ -255,8 +255,10 @@ func SearchNeedleFromSortedIndex(ecxFile *os.File, ecxFileSize int64, needleId t l, h := int64(0), ecxFileSize/types.NeedleMapEntrySize for l < h { m := (l + h) / 2 - if _, err := ecxFile.ReadAt(buf, m*types.NeedleMapEntrySize); err != nil { - return types.Offset{}, types.TombstoneFileSize, fmt.Errorf("ecx file %d read at %d: %v", ecxFileSize, m*types.NeedleMapEntrySize, err) + if n, err := ecxFile.ReadAt(buf, m*types.NeedleMapEntrySize); err != nil { + if n != types.NeedleMapEntrySize { + return types.Offset{}, types.TombstoneFileSize, fmt.Errorf("ecx file %d read at %d: %v", ecxFileSize, m*types.NeedleMapEntrySize, err) + } } key, offset, size = idx.IdxFileEntry(buf) if key == needleId { |
