mirror of
https://github.com/seaweedfs/seaweedfs.git
synced 2024-01-19 02:48:24 +00:00
better locking on file handle
This commit is contained in:
parent
2bfeb5d1c8
commit
1bd6d289d4
|
@ -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
|
||||||
|
|
Loading…
Reference in a new issue