aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorchrislu <chris.lu@gmail.com>2023-02-17 01:30:55 -0800
committerchrislu <chris.lu@gmail.com>2023-02-17 01:30:55 -0800
commit545d5d0cc39956b5bec0df3ee62e57af4d9c22c6 (patch)
tree334283b57bbef4a1fc842f8244bc937fe081422f
parenta9aa2d581fcb246d01bad603cd1164d992ad2cfc (diff)
downloadseaweedfs-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.go39
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