better locking on file handle
This commit is contained in:
@@ -26,7 +26,6 @@ type FileHandle struct {
|
|||||||
contentType string
|
contentType string
|
||||||
handle uint64
|
handle uint64
|
||||||
sync.Mutex
|
sync.Mutex
|
||||||
sync.WaitGroup
|
|
||||||
|
|
||||||
f *File
|
f *File
|
||||||
RequestId fuse.RequestID // unique ID for request
|
RequestId fuse.RequestID // unique ID for request
|
||||||
@@ -63,9 +62,6 @@ var _ = fs.HandleReleaser(&FileHandle{})
|
|||||||
|
|
||||||
func (fh *FileHandle) Read(ctx context.Context, req *fuse.ReadRequest, resp *fuse.ReadResponse) error {
|
func (fh *FileHandle) Read(ctx context.Context, req *fuse.ReadRequest, resp *fuse.ReadResponse) error {
|
||||||
|
|
||||||
fh.Add(1)
|
|
||||||
defer fh.Done()
|
|
||||||
|
|
||||||
fh.Lock()
|
fh.Lock()
|
||||||
defer fh.Unlock()
|
defer fh.Unlock()
|
||||||
|
|
||||||
@@ -173,9 +169,6 @@ func (fh *FileHandle) readFromChunks(buff []byte, offset int64) (int64, error) {
|
|||||||
// Write to the file handle
|
// Write to the file handle
|
||||||
func (fh *FileHandle) Write(ctx context.Context, req *fuse.WriteRequest, resp *fuse.WriteResponse) error {
|
func (fh *FileHandle) Write(ctx context.Context, req *fuse.WriteRequest, resp *fuse.WriteResponse) error {
|
||||||
|
|
||||||
fh.Add(1)
|
|
||||||
defer fh.Done()
|
|
||||||
|
|
||||||
fh.dirtyPages.writerPattern.MonitorWriteAt(req.Offset, len(req.Data))
|
fh.dirtyPages.writerPattern.MonitorWriteAt(req.Offset, len(req.Data))
|
||||||
|
|
||||||
fh.Lock()
|
fh.Lock()
|
||||||
@@ -217,8 +210,6 @@ func (fh *FileHandle) Release(ctx context.Context, req *fuse.ReleaseRequest) err
|
|||||||
|
|
||||||
glog.V(4).Infof("Release %v fh %d open=%d", fh.f.fullpath(), fh.handle, fh.f.isOpen)
|
glog.V(4).Infof("Release %v fh %d open=%d", fh.f.fullpath(), fh.handle, fh.f.isOpen)
|
||||||
|
|
||||||
fh.Wait()
|
|
||||||
|
|
||||||
fh.f.wfs.handlesLock.Lock()
|
fh.f.wfs.handlesLock.Lock()
|
||||||
fh.f.isOpen--
|
fh.f.isOpen--
|
||||||
fh.f.wfs.handlesLock.Unlock()
|
fh.f.wfs.handlesLock.Unlock()
|
||||||
@@ -250,9 +241,6 @@ func (fh *FileHandle) Flush(ctx context.Context, req *fuse.FlushRequest) error {
|
|||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
fh.Add(1)
|
|
||||||
defer fh.Done()
|
|
||||||
|
|
||||||
fh.Lock()
|
fh.Lock()
|
||||||
defer fh.Unlock()
|
defer fh.Unlock()
|
||||||
|
|
||||||
|
|||||||
@@ -187,15 +187,15 @@ func (wfs *WFS) Fsync(file *File, header fuse.Header) error {
|
|||||||
existingHandle, found := wfs.handles[inodeId]
|
existingHandle, found := wfs.handles[inodeId]
|
||||||
wfs.handlesLock.Unlock()
|
wfs.handlesLock.Unlock()
|
||||||
|
|
||||||
if found && existingHandle != nil && existingHandle.f.isOpen > 0 {
|
if found && existingHandle != nil {
|
||||||
|
|
||||||
existingHandle.Add(1)
|
|
||||||
defer existingHandle.Done()
|
|
||||||
|
|
||||||
existingHandle.Lock()
|
existingHandle.Lock()
|
||||||
defer existingHandle.Unlock()
|
defer existingHandle.Unlock()
|
||||||
|
|
||||||
return existingHandle.doFlush(context.Background(), header)
|
if existingHandle.f.isOpen > 0 {
|
||||||
|
return existingHandle.doFlush(context.Background(), header)
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
return nil
|
return nil
|
||||||
|
|||||||
Reference in New Issue
Block a user