]> Sergey Matveev's repositories - btrtrc.git/blobdiff - fs/file_handle.go
Fixes for storage tests on Windows
[btrtrc.git] / fs / file_handle.go
index f65400c6c1c6d593b93ff786d4e7ed38afbcc083..7c275c276fa785360b7d9a60c08a04a3a1ec29f4 100644 (file)
@@ -4,16 +4,16 @@ import (
        "context"
        "io"
 
-       "github.com/anacrolix/missinggo"
-       "github.com/anacrolix/torrent"
+       "github.com/anacrolix/fuse"
+       "github.com/anacrolix/fuse/fs"
+       "github.com/anacrolix/missinggo/v2"
 
-       "bazil.org/fuse"
-       "bazil.org/fuse/fs"
+       "github.com/anacrolix/torrent"
 )
 
 type fileHandle struct {
        fn fileNode
-       r  *torrent.Reader
+       r  torrent.Reader
 }
 
 var _ interface {
@@ -26,11 +26,12 @@ func (me fileHandle) Read(ctx context.Context, req *fuse.ReadRequest, resp *fuse
        if req.Dir {
                panic("read on directory")
        }
-       pos, err := me.r.Seek(me.fn.TorrentOffset+req.Offset, io.SeekStart)
+       r := me.r
+       pos, err := r.Seek(req.Offset, io.SeekStart)
        if err != nil {
                panic(err)
        }
-       if pos != me.fn.TorrentOffset+req.Offset {
+       if pos != req.Offset {
                panic("seek failed")
        }
        resp.Data = resp.Data[:req.Size]
@@ -44,10 +45,19 @@ func (me fileHandle) Read(ctx context.Context, req *fuse.ReadRequest, resp *fuse
                me.fn.FS.event.Broadcast()
                me.fn.FS.mu.Unlock()
                var n int
-               r := missinggo.ContextedReader{me.r, ctx}
-               n, readErr = r.Read(resp.Data)
-               if readErr == io.EOF {
-                       readErr = nil
+               r := missinggo.ContextedReader{r, ctx}
+               // log.Printf("reading %v bytes at %v", len(resp.Data), req.Offset)
+               if true {
+                       // A user reported on that on freebsd 12.2, the system requires that reads are
+                       // completely filled. Their system only asks for 64KiB at a time. I've seen systems that
+                       // can demand up to 16MiB at a time, so this gets tricky. For now, I'll restore the old
+                       // behaviour from before 2a7352a, which nobody reported problems with.
+                       n, readErr = io.ReadFull(r, resp.Data)
+               } else {
+                       n, readErr = r.Read(resp.Data)
+                       if readErr == io.EOF {
+                               readErr = nil
+                       }
                }
                resp.Data = resp.Data[:n]
        }()