aboutsummaryrefslogtreecommitdiff
path: root/weed/filer/stream.go
diff options
context:
space:
mode:
Diffstat (limited to 'weed/filer/stream.go')
-rw-r--r--weed/filer/stream.go18
1 files changed, 18 insertions, 0 deletions
diff --git a/weed/filer/stream.go b/weed/filer/stream.go
index b2ee00555..b7857041c 100644
--- a/weed/filer/stream.go
+++ b/weed/filer/stream.go
@@ -374,6 +374,24 @@ func (c *ChunkStreamReader) fetchChunkToBuffer(chunkView *ChunkView) error {
glog.V(1).Infof("operation LookupFileId %s failed, err: %v", chunkView.FileId, err)
return err
}
+
+ // Fast path: for full, plain chunks, read directly into a single buffer to avoid
+ // the streaming loop (which stages 64KB at a time and adds an extra copy).
+ if chunkView.CipherKey == nil && !chunkView.IsGzipped && chunkView.IsFullChunk() {
+ buf := make([]byte, chunkView.ViewSize)
+ n, fetchErr := util_http.RetriedFetchChunkData(context.Background(), buf, urlStrings, nil, false, true, chunkView.OffsetInChunk, chunkView.FileId)
+ if fetchErr == nil && n == len(buf) {
+ c.buffer = buf
+ c.bufferOffset = chunkView.ViewOffset
+ c.chunk = chunkView.FileId
+ return nil
+ }
+ // Fall back to the streaming path on partial fill or error
+ if fetchErr != nil {
+ glog.V(1).Infof("read %s direct failed, err: %v, falling back to stream", chunkView.FileId, fetchErr)
+ }
+ }
+
var buffer bytes.Buffer
var shouldRetry bool
jwt := JwtForVolumeServer(chunkView.FileId)