aboutsummaryrefslogtreecommitdiff
path: root/weed/filesys/filehandle.go
diff options
context:
space:
mode:
authorchrislu <chris.lu@gmail.com>2022-01-17 22:24:44 -0800
committerchrislu <chris.lu@gmail.com>2022-01-17 22:24:44 -0800
commitf4ad63528a35b8602060eb4d741532c840e4b2c2 (patch)
treeaf700ea5678ee393d69c484902aabd90df631a9d /weed/filesys/filehandle.go
parent0a3f95ca01a3667116b0a7420325bb523886ff75 (diff)
downloadseaweedfs-f4ad63528a35b8602060eb4d741532c840e4b2c2.tar.xz
seaweedfs-f4ad63528a35b8602060eb4d741532c840e4b2c2.zip
wait for reading threads to complete before dropping sealed chunks
Diffstat (limited to 'weed/filesys/filehandle.go')
-rw-r--r--weed/filesys/filehandle.go9
1 files changed, 9 insertions, 0 deletions
diff --git a/weed/filesys/filehandle.go b/weed/filesys/filehandle.go
index 8606ac0d2..d3b37a5b9 100644
--- a/weed/filesys/filehandle.go
+++ b/weed/filesys/filehandle.go
@@ -75,6 +75,8 @@ func (fh *FileHandle) Read(ctx context.Context, req *fuse.ReadRequest, resp *fus
buff = make([]byte, req.Size)
}
+ fh.lockForRead(req.Offset, len(buff))
+ defer fh.unlockForRead(req.Offset, len(buff))
totalRead, err := fh.readFromChunks(buff, req.Offset)
if err == nil || err == io.EOF {
maxStop := fh.readFromDirtyPages(buff, req.Offset)
@@ -101,6 +103,13 @@ func (fh *FileHandle) Read(ctx context.Context, req *fuse.ReadRequest, resp *fus
return err
}
+func (fh *FileHandle) lockForRead(startOffset int64, size int) {
+ fh.dirtyPages.LockForRead(startOffset, startOffset+int64(size))
+}
+func (fh *FileHandle) unlockForRead(startOffset int64, size int) {
+ fh.dirtyPages.UnlockForRead(startOffset, startOffset+int64(size))
+}
+
func (fh *FileHandle) readFromDirtyPages(buff []byte, startOffset int64) (maxStop int64) {
maxStop = fh.dirtyPages.ReadDirtyDataAt(buff, startOffset)
return