aboutsummaryrefslogtreecommitdiff
path: root/weed/filesys/wfs.go
diff options
context:
space:
mode:
authorChris Lu <chris.lu@gmail.com>2018-06-06 02:09:57 -0700
committerChris Lu <chris.lu@gmail.com>2018-06-06 02:09:57 -0700
commit6816661b0f7948bb77de986398f7b892a58bbd11 (patch)
tree06577a5bdc319a7e011b05c424ac496b5da421dd /weed/filesys/wfs.go
parent299312c8057c5b96f67a8ac825ee026fe01dd8fc (diff)
downloadseaweedfs-6816661b0f7948bb77de986398f7b892a58bbd11.tar.xz
seaweedfs-6816661b0f7948bb77de986398f7b892a58bbd11.zip
fixed file handle by file full path
Diffstat (limited to 'weed/filesys/wfs.go')
-rw-r--r--weed/filesys/wfs.go66
1 files changed, 66 insertions, 0 deletions
diff --git a/weed/filesys/wfs.go b/weed/filesys/wfs.go
index ac7333695..127252058 100644
--- a/weed/filesys/wfs.go
+++ b/weed/filesys/wfs.go
@@ -6,6 +6,9 @@ import (
"github.com/chrislusf/seaweedfs/weed/pb/filer_pb"
"github.com/karlseguin/ccache"
"google.golang.org/grpc"
+ "sync"
+ "bazil.org/fuse"
+ "github.com/chrislusf/seaweedfs/weed/glog"
)
type WFS struct {
@@ -14,6 +17,11 @@ type WFS struct {
collection string
replication string
chunkSizeLimit int64
+
+ // contains all open handles
+ handles []*FileHandle
+ pathToHandleIndex map[string]int
+ pathToHandleLock sync.Mutex
}
func NewSeaweedFileSystem(filerGrpcAddress string, collection string, replication string, chunkSizeLimitMB int) *WFS {
@@ -23,6 +31,7 @@ func NewSeaweedFileSystem(filerGrpcAddress string, collection string, replicatio
collection: collection,
replication: replication,
chunkSizeLimit: int64(chunkSizeLimitMB) * 1024 * 1024,
+ pathToHandleIndex: make(map[string]int),
}
}
@@ -42,3 +51,60 @@ func (wfs *WFS) withFilerClient(fn func(filer_pb.SeaweedFilerClient) error) erro
return fn(client)
}
+
+func (wfs *WFS) AcquireHandle(file *File, uid, gid uint32) (handle *FileHandle) {
+ wfs.pathToHandleLock.Lock()
+ defer wfs.pathToHandleLock.Unlock()
+
+ fullpath := file.fullpath()
+
+ index, found := wfs.pathToHandleIndex[fullpath]
+ if found && wfs.handles[index] != nil {
+ glog.V(4).Infoln(fullpath, "found handle id", index)
+ return wfs.handles[index]
+ }
+
+ // create a new handler
+ handle = &FileHandle{
+ f: file,
+ dirtyPages: newDirtyPages(file),
+ Uid: uid,
+ Gid: gid,
+ }
+
+ if found && wfs.handles[index] != nil {
+ glog.V(4).Infoln(fullpath, "reuse previous handle id", index)
+ wfs.handles[index] = handle
+ handle.handle = uint64(index)
+ return
+ }
+
+ for i, h := range wfs.handles {
+ if h == nil {
+ wfs.handles[i] = handle
+ handle.handle = uint64(i)
+ wfs.pathToHandleIndex[fullpath] = i
+ glog.V(4).Infoln(fullpath, "reuse handle id", handle.handle)
+ return
+ }
+ }
+
+ wfs.handles = append(wfs.handles, handle)
+ handle.handle = uint64(len(wfs.handles) - 1)
+ println(fullpath, "new handle id", handle.handle)
+ wfs.pathToHandleIndex[fullpath] = int(handle.handle)
+
+ return
+}
+
+func (wfs *WFS) ReleaseHandle(handleId fuse.HandleID) {
+ wfs.pathToHandleLock.Lock()
+ defer wfs.pathToHandleLock.Unlock()
+
+ glog.V(4).Infoln("releasing handle id", handleId, "current handles lengh", len(wfs.handles))
+ if int(handleId) < len(wfs.handles) {
+ wfs.handles[int(handleId)] = nil
+ }
+
+ return
+}