|
|
@ -54,9 +54,8 @@ type WFS struct { |
|
|
|
listDirectoryEntriesCache *ccache.Cache |
|
|
|
|
|
|
|
// contains all open handles, protected by handlesLock
|
|
|
|
handlesLock sync.Mutex |
|
|
|
handles []*FileHandle |
|
|
|
pathToHandleIndex map[util.FullPath]int |
|
|
|
handlesLock sync.Mutex |
|
|
|
handles map[uint64]*FileHandle |
|
|
|
|
|
|
|
bufPool sync.Pool |
|
|
|
|
|
|
@ -76,7 +75,7 @@ func NewSeaweedFileSystem(option *Option) *WFS { |
|
|
|
wfs := &WFS{ |
|
|
|
option: option, |
|
|
|
listDirectoryEntriesCache: ccache.New(ccache.Configure().MaxSize(option.DirListCacheLimit * 3).ItemsToPrune(100)), |
|
|
|
pathToHandleIndex: make(map[util.FullPath]int), |
|
|
|
handles: make(map[uint64]*FileHandle), |
|
|
|
bufPool: sync.Pool{ |
|
|
|
New: func() interface{} { |
|
|
|
return make([]byte, option.ChunkSizeLimit) |
|
|
@ -117,26 +116,15 @@ func (wfs *WFS) AcquireHandle(file *File, uid, gid uint32) (fileHandle *FileHand |
|
|
|
wfs.handlesLock.Lock() |
|
|
|
defer wfs.handlesLock.Unlock() |
|
|
|
|
|
|
|
index, found := wfs.pathToHandleIndex[fullpath] |
|
|
|
if found && wfs.handles[index] != nil { |
|
|
|
glog.V(2).Infoln(fullpath, "found fileHandle id", index) |
|
|
|
return wfs.handles[index] |
|
|
|
inodeId := file.fullpath().AsInode() |
|
|
|
existingHandle, found := wfs.handles[inodeId] |
|
|
|
if found && existingHandle != nil { |
|
|
|
return existingHandle |
|
|
|
} |
|
|
|
|
|
|
|
fileHandle = newFileHandle(file, uid, gid) |
|
|
|
for i, h := range wfs.handles { |
|
|
|
if h == nil { |
|
|
|
wfs.handles[i] = fileHandle |
|
|
|
fileHandle.handle = uint64(i) |
|
|
|
wfs.pathToHandleIndex[fullpath] = i |
|
|
|
glog.V(4).Infof("%s reuse fh %d", fullpath, fileHandle.handle) |
|
|
|
return |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
wfs.handles = append(wfs.handles, fileHandle) |
|
|
|
fileHandle.handle = uint64(len(wfs.handles) - 1) |
|
|
|
wfs.pathToHandleIndex[fullpath] = int(fileHandle.handle) |
|
|
|
wfs.handles[inodeId] = fileHandle |
|
|
|
fileHandle.handle = inodeId |
|
|
|
glog.V(4).Infof("%s new fh %d", fullpath, fileHandle.handle) |
|
|
|
|
|
|
|
return |
|
|
@ -147,10 +135,8 @@ func (wfs *WFS) ReleaseHandle(fullpath util.FullPath, handleId fuse.HandleID) { |
|
|
|
defer wfs.handlesLock.Unlock() |
|
|
|
|
|
|
|
glog.V(4).Infof("%s ReleaseHandle id %d current handles length %d", fullpath, handleId, len(wfs.handles)) |
|
|
|
delete(wfs.pathToHandleIndex, fullpath) |
|
|
|
if int(handleId) < len(wfs.handles) { |
|
|
|
wfs.handles[int(handleId)] = nil |
|
|
|
} |
|
|
|
|
|
|
|
delete(wfs.handles, fullpath.AsInode()) |
|
|
|
|
|
|
|
return |
|
|
|
} |
|
|
|