From ff3efb5646437ac77c6b75e0452b239d154928c5 Mon Sep 17 00:00:00 2001 From: Steven Allen Date: Wed, 27 Jun 2018 17:08:50 -0700 Subject: [PATCH] always prefetch at least 5 blocks ahead This should reduce stuttering when streaming. License: MIT Signed-off-by: Steven Allen --- unixfs/io/pbdagreader.go | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-) diff --git a/unixfs/io/pbdagreader.go b/unixfs/io/pbdagreader.go index 8d21f8da3..9c3909577 100644 --- a/unixfs/io/pbdagreader.go +++ b/unixfs/io/pbdagreader.go @@ -68,8 +68,7 @@ func NewPBFileReader(ctx context.Context, n *mdag.ProtoNode, pb *ftpb.Data, serv const preloadSize = 10 -func (dr *PBDagReader) preloadNextNodes(ctx context.Context) { - beg := dr.linkPosition +func (dr *PBDagReader) preload(ctx context.Context, beg int) { end := beg + preloadSize if end >= len(dr.links) { end = len(dr.links) @@ -90,8 +89,13 @@ func (dr *PBDagReader) precalcNextBuf(ctx context.Context) error { return io.EOF } - if dr.promises[dr.linkPosition] == nil { - dr.preloadNextNodes(ctx) + // If we drop to <= preloadSize/2 preloading nodes, preload the next 10. + for i := dr.linkPosition; i < dr.linkPosition+preloadSize/2 && i < len(dr.promises); i++ { + // TODO: check if canceled. + if dr.promises[i] == nil { + dr.preload(ctx, i) + break + } } nxt, err := dr.promises[dr.linkPosition].Get(ctx)