diff --git a/samples/mount_readbenchfs/mount.go b/samples/mount_readbenchfs/mount.go index c378544..5da3ad4 100644 --- a/samples/mount_readbenchfs/mount.go +++ b/samples/mount_readbenchfs/mount.go @@ -11,6 +11,7 @@ import ( var fMountPoint = flag.String("mount_point", "", "Path to mount point.") var fReadOnly = flag.Bool("read_only", false, "Mount in read-only mode.") +var fVectored = flag.Bool("vectored", false, "Use vectored read.") var fDebug = flag.Bool("debug", false, "Enable debug logging.") func main() { @@ -28,6 +29,7 @@ func main() { cfg := &fuse.MountConfig{ ReadOnly: *fReadOnly, + UseVectoredRead: *fVectored, } if *fDebug { diff --git a/samples/readbenchfs/readbenchfs.go b/samples/readbenchfs/readbenchfs.go index 5d8211d..702750f 100644 --- a/samples/readbenchfs/readbenchfs.go +++ b/samples/readbenchfs/readbenchfs.go @@ -34,14 +34,12 @@ const FILE_SIZE = 1024*1024*1024*1024 var _ fuseutil.FileSystem = &readBenchFS{} -// Create a file system that mirrors an existing physical path, in a readonly mode - func NewReadBenchServer() (server fuse.Server, err error) { // 1 GB of random data to exceed CPU cache buf := make([]byte, 1024*1024*1024) rand.Read(buf) server = fuseutil.NewFileSystemServer(&readBenchFS{ - buf: buf, + buf: buf, }) return } @@ -150,7 +148,30 @@ func (fs *readBenchFS) ReadFile( copy(op.Dst[pos-op.Offset : ], fs.buf[s : ]) pos = op.Offset+e } - //op.Data = [][]byte{ contents[op.Offset : end] } + op.BytesRead = int(end-op.Offset) + return nil +} + +func (fs *readBenchFS) VectoredRead( + ctx context.Context, + op *fuseops.VectoredReadOp) error { + if op.Offset > FILE_SIZE { + return io.EOF + } + end := op.Offset+op.Size + if end > FILE_SIZE { + end = FILE_SIZE + } + buflen := int64(len(fs.buf)) + for pos := op.Offset; pos < end; { + s := pos % buflen + e := buflen + if e-s > end-pos { + e = s+end-pos + } + op.Data = append(op.Data, fs.buf[s : e]) + pos = op.Offset+e + } op.BytesRead = int(end-op.Offset) return nil }