diff --git a/weed/filer2/filechunks.go b/weed/filer2/filechunks.go index 9de888d50..1d546bad0 100644 --- a/weed/filer2/filechunks.go +++ b/weed/filer2/filechunks.go @@ -7,6 +7,7 @@ import ( "sort" "sync" + "github.com/chrislusf/seaweedfs/weed/glog" "github.com/chrislusf/seaweedfs/weed/pb/filer_pb" ) @@ -134,17 +135,19 @@ func ViewFromVisibleIntervals(visibles []VisibleInterval, offset int64, size int for _, chunk := range visibles { - if chunk.start <= offset && offset < chunk.stop && offset < stop { + glog.V(1).Infof("visible [%d,%d)", chunk.start, chunk.stop) + chunkStart, chunkStop := max(offset, chunk.start), min(stop, chunk.stop) + + if chunkStart < chunkStop { views = append(views, &ChunkView{ FileId: chunk.fileId, - Offset: offset - chunk.start, // offset is the data starting location in this file id - Size: uint64(min(chunk.stop, stop) - offset), - LogicOffset: offset, + Offset: chunkStart-chunk.start, + Size: uint64(chunkStop - chunkStart), + LogicOffset: chunk.start, ChunkSize: chunk.chunkSize, CipherKey: chunk.cipherKey, IsGzipped: chunk.isGzipped, }) - offset = min(chunk.stop, stop) } } @@ -266,3 +269,9 @@ func min(x, y int64) int64 { } return y } +func max(x, y int64) int64 { + if x <= y { + return y + } + return x +} diff --git a/weed/filer2/filechunks_test.go b/weed/filer2/filechunks_test.go index bfee59198..c1b0427a4 100644 --- a/weed/filer2/filechunks_test.go +++ b/weed/filer2/filechunks_test.go @@ -2,9 +2,13 @@ package filer2 import ( "log" + "math" "testing" "fmt" + + "github.com/stretchr/testify/assert" + "github.com/chrislusf/seaweedfs/weed/pb/filer_pb" ) @@ -418,3 +422,30 @@ func BenchmarkCompactFileChunks(b *testing.B) { CompactFileChunks(nil, chunks) } } + +func TestViewFromVisibleIntervals(t *testing.T) { + visibles := []VisibleInterval{ + { + start: 0, + stop: 25, + fileId: "fid1", + }, + { + start: 4096, + stop: 8192, + fileId: "fid2", + }, + { + start: 16384, + stop: 18551, + fileId: "fid3", + }, + } + + views := ViewFromVisibleIntervals(visibles, 0, math.MaxInt32) + + if len(views) != len(visibles) { + assert.Equal(t, len(visibles), len(views), "ViewFromVisibleIntervals error") + } + +} \ No newline at end of file