aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorchrislu <chris.lu@gmail.com>2023-01-05 11:19:21 -0800
committerchrislu <chris.lu@gmail.com>2023-01-05 11:19:21 -0800
commit2abf817580aa127fbd2943fe678567636147ebba (patch)
treeee307506290af4ce00636a1b27d6e98baecbca4b
parente367444586f338318e025c659aa8e11b8506aff2 (diff)
downloadseaweedfs-2abf817580aa127fbd2943fe678567636147ebba.tar.xz
seaweedfs-2abf817580aa127fbd2943fe678567636147ebba.zip
fix for stream reader
fix https://github.com/seaweedfs/seaweedfs/issues/4112
-rw-r--r--weed/filer/stream.go19
1 files changed, 13 insertions, 6 deletions
diff --git a/weed/filer/stream.go b/weed/filer/stream.go
index d49784686..d23a1aeab 100644
--- a/weed/filer/stream.go
+++ b/weed/filer/stream.go
@@ -187,6 +187,7 @@ func ReadAll(buffer []byte, masterClient *wdclient.MasterClient, chunks []*filer
// ---------------- ChunkStreamReader ----------------------------------
type ChunkStreamReader struct {
+ head *Interval[*ChunkView]
chunkView *Interval[*ChunkView]
totalSize int64
logicOffset int64
@@ -211,6 +212,7 @@ func doNewChunkStreamReader(lookupFileIdFn wdclient.LookupFileIdFunctionType, ch
}
return &ChunkStreamReader{
+ head: chunkViews.Front(),
chunkView: chunkViews.Front(),
lookupFileId: lookupFileIdFn,
totalSize: totalSize,
@@ -309,15 +311,20 @@ func (c *ChunkStreamReader) prepareBufferFor(offset int64) (err error) {
chunk := c.chunkView.Value
if insideChunk(offset, chunk) {
if c.isBufferEmpty() || c.bufferOffset != chunk.ViewOffset {
- if err = c.fetchChunkToBuffer(chunk); err != nil {
- return
- }
+ return c.fetchChunkToBuffer(chunk)
}
} else {
- // glog.Fatalf("unexpected3 offset %d in %s [%d,%d)", offset, chunk.FileId, chunk.ViewOffset, chunk.ViewOffset+int64(chunk.ViewSize))
- return fmt.Errorf("unexpected3 offset %d in %s [%d,%d)", offset, chunk.FileId, chunk.ViewOffset, chunk.ViewOffset+int64(chunk.ViewSize))
+ 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)
+ }
+ }
+ }
}
- return
+
+ return io.EOF
}
func (c *ChunkStreamReader) fetchChunkToBuffer(chunkView *ChunkView) error {