diff --git a/weed/filer2/filechunks.go b/weed/filer2/filechunks.go index 6bdfbd48e..5877f2f71 100644 --- a/weed/filer2/filechunks.go +++ b/weed/filer2/filechunks.go @@ -66,7 +66,7 @@ func ReadFromChunks(chunks []*filer_pb.FileChunk, offset int64, size int) (views stop := offset + int64(size) for _, chunk := range visibles { - if chunk.start <= offset && offset < chunk.stop { + if chunk.start <= offset && offset < chunk.stop && offset < stop { views = append(views, &ChunkView{ FileId: chunk.fileId, Offset: offset - chunk.start, // offset is the data starting location in this file id diff --git a/weed/filer2/filechunks_test.go b/weed/filer2/filechunks_test.go index 24897215e..033e66b1e 100644 --- a/weed/filer2/filechunks_test.go +++ b/weed/filer2/filechunks_test.go @@ -249,6 +249,20 @@ func TestChunksReading(t *testing.T) { {Offset: 0, Size: 100, FileId: "abc", LogicOffset:0}, }, }, + // case 7: edge cases + { + Chunks: []*filer_pb.FileChunk{ + {Offset: 0, Size: 100, FileId: "abc", Mtime: 123}, + {Offset: 100, Size: 100, FileId: "asdf", Mtime: 134}, + {Offset: 200, Size: 100, FileId: "fsad", Mtime: 353}, + }, + Offset: 0, + Size: 200, + Expected: []*ChunkView{ + {Offset: 0, Size: 100, FileId: "abc", LogicOffset:0}, + {Offset: 0, Size: 100, FileId: "asdf", LogicOffset:100}, + }, + }, } for i, testcase := range testcases {