aboutsummaryrefslogtreecommitdiff
path: root/weed/storage/erasure_coding
diff options
context:
space:
mode:
authorchrislu <chris.lu@gmail.com>2024-11-21 00:37:38 -0800
committerchrislu <chris.lu@gmail.com>2024-11-21 00:37:38 -0800
commitc9f344869246ca4d5c72f97f63226b41e0e9c190 (patch)
tree42eca3055ffed84d8331aa5b5fa109df97dadf73 /weed/storage/erasure_coding
parentbe09d08eb6bfb41266107e9ac3e29b2e60677680 (diff)
downloadseaweedfs-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.go7
-rw-r--r--weed/storage/erasure_coding/ec_volume.go6
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 {