aboutsummaryrefslogtreecommitdiff
path: root/weed/mount/weedfs_file_read.go
diff options
context:
space:
mode:
Diffstat (limited to 'weed/mount/weedfs_file_read.go')
-rw-r--r--weed/mount/weedfs_file_read.go29
1 files changed, 27 insertions, 2 deletions
diff --git a/weed/mount/weedfs_file_read.go b/weed/mount/weedfs_file_read.go
index d9ad1f4ea..00143a5b4 100644
--- a/weed/mount/weedfs_file_read.go
+++ b/weed/mount/weedfs_file_read.go
@@ -1,7 +1,9 @@
package mount
import (
+ "github.com/chrislusf/seaweedfs/weed/glog"
"github.com/hanwen/go-fuse/v2/fuse"
+ "io"
)
/**
@@ -29,6 +31,29 @@ import (
* @param off offset to read from
* @param fi file information
*/
-func (wfs *WFS) Read(cancel <-chan struct{}, in *fuse.ReadIn, buf []byte) (fuse.ReadResult, fuse.Status) {
- return nil, fuse.ENOSYS
+func (wfs *WFS) Read(cancel <-chan struct{}, in *fuse.ReadIn, buff []byte) (fuse.ReadResult, fuse.Status) {
+ fh := wfs.GetHandle(FileHandleId(in.Fh))
+ if fh == nil {
+ return nil, fuse.ENOENT
+ }
+
+ offset := int64(in.Offset)
+ fh.lockForRead(offset, len(buff))
+ defer fh.unlockForRead(offset, len(buff))
+
+ totalRead, err := fh.readFromChunks(buff, offset)
+ if err == nil || err == io.EOF {
+ maxStop := fh.readFromDirtyPages(buff, offset)
+ totalRead = max(maxStop-offset, totalRead)
+ }
+ if err == io.EOF {
+ err = nil
+ }
+
+ if err != nil {
+ glog.Warningf("file handle read %s %d: %v", fh.FullPath(), totalRead, err)
+ return nil, fuse.EIO
+ }
+
+ return fuse.ReadResultData(buff[:totalRead]), fuse.OK
}