diff options
| author | chrislu <chris.lu@gmail.com> | 2023-02-17 01:30:55 -0800 |
|---|---|---|
| committer | chrislu <chris.lu@gmail.com> | 2023-02-17 01:30:55 -0800 |
| commit | 545d5d0cc39956b5bec0df3ee62e57af4d9c22c6 (patch) | |
| tree | 334283b57bbef4a1fc842f8244bc937fe081422f | |
| parent | a9aa2d581fcb246d01bad603cd1164d992ad2cfc (diff) | |
| download | seaweedfs-545d5d0cc39956b5bec0df3ee62e57af4d9c22c6.tar.xz seaweedfs-545d5d0cc39956b5bec0df3ee62e57af4d9c22c6.zip | |
fix for io.ReaderAt used in filer.remote.sync
fix https://github.com/seaweedfs/seaweedfs/issues/4194
| -rw-r--r-- | weed/filer/stream.go | 39 |
1 files changed, 16 insertions, 23 deletions
diff --git a/weed/filer/stream.go b/weed/filer/stream.go index dba1dc908..395d797cc 100644 --- a/weed/filer/stream.go +++ b/weed/filer/stream.go @@ -300,31 +300,24 @@ func (c *ChunkStreamReader) prepareBufferFor(offset int64) (err error) { if c.bufferOffset <= offset && offset < c.bufferOffset+int64(len(c.buffer)) { return nil } - if c.chunkView == nil { - return io.EOF - } - - // fmt.Printf("fetch for offset %d\n", offset) - c.chunkView = c.chunkView.Next - if c.chunkView == nil { - return io.EOF - } - - // positioning within the new chunk - chunk := c.chunkView.Value - if insideChunk(offset, chunk) { - if c.isBufferEmpty() || c.bufferOffset != chunk.ViewOffset { - return c.fetchChunkToBuffer(chunk) - } - } else { - for p := c.head; p != nil; p = p.Next { - chunk = p.Value - if insideChunk(offset, chunk) { - if c.isBufferEmpty() || c.bufferOffset != chunk.ViewOffset { - return c.fetchChunkToBuffer(chunk) - } + glog.V(2).Infof("c.chunkView: %v buffer:[%d,%d) offset:%d totalSize:%d", c.chunkView, c.bufferOffset, c.bufferOffset+int64(len(c.buffer)), offset, c.totalSize) + + // find a possible chunk view + p := c.chunkView + for p != nil { + chunk := p.Value + glog.V(2).Infof("prepareBufferFor check chunk:[%d,%d)", chunk.ViewOffset, chunk.ViewOffset+int64(chunk.ViewSize)) + if insideChunk(offset, chunk) { + if c.isBufferEmpty() || c.bufferOffset != chunk.ViewOffset { + c.chunkView = p + return c.fetchChunkToBuffer(chunk) } } + if offset < c.bufferOffset { + p = p.Prev + } else { + p = p.Next + } } return io.EOF |
