aboutsummaryrefslogtreecommitdiff
path: root/weed/filesys
diff options
context:
space:
mode:
authorChris Lu <chris.lu@gmail.com>2021-04-17 10:48:22 -0700
committerChris Lu <chris.lu@gmail.com>2021-04-18 13:07:28 -0700
commit6cbd786db9b96833248444c42992c239f2424d95 (patch)
treed9ff8c06b5664858d14e16cfdf04b7eca95aabe0 /weed/filesys
parentd41e6826d3a0a51750e3f9c14b33a6aa9953bb09 (diff)
downloadseaweedfs-6cbd786db9b96833248444c42992c239f2424d95.tar.xz
seaweedfs-6cbd786db9b96833248444c42992c239f2424d95.zip
correctly runs git clone
Diffstat (limited to 'weed/filesys')
-rw-r--r--weed/filesys/dir.go25
-rw-r--r--weed/filesys/dir_rename.go11
-rw-r--r--weed/filesys/file.go26
-rw-r--r--weed/filesys/filehandle.go10
-rw-r--r--weed/filesys/wfs.go25
5 files changed, 64 insertions, 33 deletions
diff --git a/weed/filesys/dir.go b/weed/filesys/dir.go
index b3577dcf0..3588a5951 100644
--- a/weed/filesys/dir.go
+++ b/weed/filesys/dir.go
@@ -24,6 +24,7 @@ type Dir struct {
wfs *WFS
entry *filer_pb.Entry
parent *Dir
+ id uint64
}
var _ = fs.Node(&Dir{})
@@ -44,7 +45,7 @@ var _ = fs.NodeListxattrer(&Dir{})
var _ = fs.NodeForgetter(&Dir{})
func (dir *Dir) Id() uint64 {
- return util.FullPath(dir.FullPath()).AsInode()
+ return dir.id
}
func (dir *Dir) Attr(ctx context.Context, attr *fuse.Attr) error {
@@ -64,7 +65,7 @@ func (dir *Dir) Attr(ctx context.Context, attr *fuse.Attr) error {
return err
}
- attr.Inode = util.FullPath(dir.FullPath()).AsInode()
+ attr.Inode = dir.Id()
attr.Mode = os.FileMode(entry.Attributes.FileMode) | os.ModeDir
attr.Mtime = time.Unix(entry.Attributes.Mtime, 0)
attr.Crtime = time.Unix(entry.Attributes.Crtime, 0)
@@ -110,16 +111,28 @@ func (dir *Dir) Fsync(ctx context.Context, req *fuse.FsyncRequest) error {
}
func (dir *Dir) newFile(name string) fs.Node {
+
+ fileFullPath := util.NewFullPath(dir.FullPath(), name)
+ fileId := fileFullPath.AsInode()
+ dir.wfs.handlesLock.Lock()
+ existingHandle, found := dir.wfs.handles[fileId]
+ dir.wfs.handlesLock.Unlock()
+
+ if found {
+ glog.V(4).Infof("newFile found opened file handle: %+v", fileFullPath)
+ return existingHandle.f
+ }
return &File{
- Name: name,
- dir: dir,
- wfs: dir.wfs,
+ Name: name,
+ dir: dir,
+ wfs: dir.wfs,
+ id: fileId,
}
}
func (dir *Dir) newDirectory(fullpath util.FullPath) fs.Node {
- return &Dir{name: fullpath.Name(), wfs: dir.wfs, parent: dir}
+ return &Dir{name: fullpath.Name(), wfs: dir.wfs, parent: dir, id: fullpath.AsInode()}
}
diff --git a/weed/filesys/dir_rename.go b/weed/filesys/dir_rename.go
index 7bc705102..b07710d17 100644
--- a/weed/filesys/dir_rename.go
+++ b/weed/filesys/dir_rename.go
@@ -64,11 +64,22 @@ func (dir *Dir) Rename(ctx context.Context, req *fuse.RenameRequest, newDirector
return fuse.EIO
}
+ oldFsNode := NodeWithId(oldPath.AsInode())
+ newFsNode := NodeWithId(newPath.AsInode())
+ dir.wfs.Server.InvalidateInternalNode(oldFsNode, newFsNode, func(internalNode fs.Node) {
+ if file, ok := internalNode.(*File); ok {
+ glog.V(4).Infof("internal node %s", file.Name)
+ file.Name = req.NewName
+ file.id = uint64(newFsNode)
+ }
+ })
+
// change file handle
dir.wfs.handlesLock.Lock()
defer dir.wfs.handlesLock.Unlock()
inodeId := oldPath.AsInode()
existingHandle, found := dir.wfs.handles[inodeId]
+ glog.V(4).Infof("has open filehandle %s: %v", oldPath, found)
if !found || existingHandle == nil {
return nil
}
diff --git a/weed/filesys/file.go b/weed/filesys/file.go
index b3e5cc72d..2e37c6e0e 100644
--- a/weed/filesys/file.go
+++ b/weed/filesys/file.go
@@ -35,6 +35,7 @@ type File struct {
entry *filer_pb.Entry
isOpen int
dirtyMetadata bool
+ id uint64
}
func (file *File) fullpath() util.FullPath {
@@ -42,25 +43,23 @@ func (file *File) fullpath() util.FullPath {
}
func (file *File) Id() uint64 {
- return file.fullpath().AsInode()
+ return file.id
}
func (file *File) Attr(ctx context.Context, attr *fuse.Attr) (err error) {
glog.V(4).Infof("file Attr %s, open:%v existing:%v", file.fullpath(), file.isOpen, attr)
- entry := file.getEntry()
- if file.isOpen <= 0 || entry == nil {
- if entry, err = file.maybeLoadEntry(ctx); err != nil {
- return err
- }
+ entry, err := file.maybeLoadEntry(ctx)
+ if err != nil {
+ return err
}
if entry == nil {
return fuse.ENOENT
}
- attr.Inode = file.fullpath().AsInode()
+ attr.Inode = file.Id()
attr.Valid = time.Second
attr.Mode = os.FileMode(entry.Attributes.FileMode)
attr.Size = filer.FileSize(entry)
@@ -118,7 +117,7 @@ func (file *File) Setattr(ctx context.Context, req *fuse.SetattrRequest, resp *f
}
if file.isOpen > 0 {
file.wfs.handlesLock.Lock()
- fileHandle := file.wfs.handles[file.fullpath().AsInode()]
+ fileHandle := file.wfs.handles[file.Id()]
file.wfs.handlesLock.Unlock()
if fileHandle != nil {
@@ -262,10 +261,15 @@ func (file *File) Forget() {
}
func (file *File) maybeLoadEntry(ctx context.Context) (entry *filer_pb.Entry, err error) {
- entry = file.getEntry()
- if file.isOpen > 0 {
- return entry, nil
+
+ file.wfs.handlesLock.Lock()
+ handle, found := file.wfs.handles[file.Id()]
+ file.wfs.handlesLock.Unlock()
+ if found {
+ glog.V(4).Infof("maybeLoadEntry found opened file %s/%s: %v %v", file.dir.FullPath(), file.Name, handle.f.entry, entry)
+ entry = handle.f.entry
}
+
if entry != nil {
if len(entry.HardLinkId) == 0 {
// only always reload hard link
diff --git a/weed/filesys/filehandle.go b/weed/filesys/filehandle.go
index 5b9a1748a..3f4ee69f4 100644
--- a/weed/filesys/filehandle.go
+++ b/weed/filesys/filehandle.go
@@ -193,20 +193,20 @@ func (fh *FileHandle) Write(ctx context.Context, req *fuse.WriteRequest, resp *f
func (fh *FileHandle) Release(ctx context.Context, req *fuse.ReleaseRequest) error {
- glog.V(4).Infof("Release %v fh %d", fh.f.fullpath(), fh.handle)
+ glog.V(4).Infof("Release %v fh %d open=%d", fh.f.fullpath(), fh.handle, fh.f.isOpen)
fh.Lock()
defer fh.Unlock()
- if fh.f.isOpen <= 0 {
+ fh.f.isOpen--
+
+ if fh.f.isOpen < 0 {
glog.V(0).Infof("Release reset %s open count %d => %d", fh.f.Name, fh.f.isOpen, 0)
fh.f.isOpen = 0
return nil
}
- if fh.f.isOpen == 1 {
-
- fh.f.isOpen--
+ if fh.f.isOpen == 0 {
fh.f.entry = nil
fh.entryViewCache = nil
fh.reader = nil
diff --git a/weed/filesys/wfs.go b/weed/filesys/wfs.go
index 7019a464b..42816d23d 100644
--- a/weed/filesys/wfs.go
+++ b/weed/filesys/wfs.go
@@ -103,6 +103,7 @@ func NewSeaweedFileSystem(option *Option) *WFS {
}
wfs.metaCache = meta_cache.NewMetaCache(path.Join(cacheDir, "meta"), util.FullPath(option.FilerMountRootPath), option.UidGidMapper, func(filePath util.FullPath) {
+
fsNode := NodeWithId(filePath.AsInode())
if err := wfs.Server.InvalidateNodeData(fsNode); err != nil {
glog.V(4).Infof("InvalidateNodeData %s : %v", filePath, err)
@@ -139,16 +140,15 @@ func (wfs *WFS) AcquireHandle(file *File, uid, gid uint32) (fileHandle *FileHand
fullpath := file.fullpath()
glog.V(4).Infof("AcquireHandle %s uid=%d gid=%d", fullpath, uid, gid)
- wfs.handlesLock.Lock()
- defer wfs.handlesLock.Unlock()
+ inodeId := file.Id()
- inodeId := file.fullpath().AsInode()
- if file.isOpen > 0 {
- existingHandle, found := wfs.handles[inodeId]
- if found && existingHandle != nil {
- file.isOpen++
- return existingHandle
- }
+ wfs.handlesLock.Lock()
+ existingHandle, found := wfs.handles[inodeId]
+ wfs.handlesLock.Unlock()
+ if found && existingHandle != nil {
+ existingHandle.f.isOpen++
+ glog.V(4).Infof("Acquired Handle %s open %d", fullpath, existingHandle.f.isOpen)
+ return existingHandle
}
entry, _ := file.maybeLoadEntry(context.Background())
@@ -156,9 +156,12 @@ func (wfs *WFS) AcquireHandle(file *File, uid, gid uint32) (fileHandle *FileHand
fileHandle = newFileHandle(file, uid, gid)
file.isOpen++
+ wfs.handlesLock.Lock()
wfs.handles[inodeId] = fileHandle
+ wfs.handlesLock.Unlock()
fileHandle.handle = inodeId
+ glog.V(4).Infof("Acquired new Handle %s open %d", fullpath, file.isOpen)
return
}
@@ -166,9 +169,9 @@ func (wfs *WFS) ReleaseHandle(fullpath util.FullPath, handleId fuse.HandleID) {
wfs.handlesLock.Lock()
defer wfs.handlesLock.Unlock()
- glog.V(4).Infof("%s ReleaseHandle id %d current handles length %d", fullpath, handleId, len(wfs.handles))
+ glog.V(4).Infof("ReleaseHandle %s id %d current handles length %d", fullpath, handleId, len(wfs.handles))
- delete(wfs.handles, fullpath.AsInode())
+ delete(wfs.handles, uint64(handleId))
return
}