This commit is contained in:
Chris Lu 2020-08-15 17:01:42 -07:00
parent 0d60e67816
commit a22ee30596
3 changed files with 36 additions and 7 deletions

View file

@ -101,7 +101,7 @@ func (dir *Dir) Fsync(ctx context.Context, req *fuse.FsyncRequest) error {
} }
func (dir *Dir) newFile(name string, entry *filer_pb.Entry) fs.Node { func (dir *Dir) newFile(name string, entry *filer_pb.Entry) fs.Node {
return dir.wfs.fsNodeCache.EnsureFsNode(util.NewFullPath(dir.FullPath(), name), func() fs.Node { f := dir.wfs.fsNodeCache.EnsureFsNode(util.NewFullPath(dir.FullPath(), name), func() fs.Node {
return &File{ return &File{
Name: name, Name: name,
dir: dir, dir: dir,
@ -110,14 +110,17 @@ func (dir *Dir) newFile(name string, entry *filer_pb.Entry) fs.Node {
entryViewCache: nil, entryViewCache: nil,
} }
}) })
f.(*File).dir = dir // in case dir node was created later
return f
} }
func (dir *Dir) newDirectory(fullpath util.FullPath, entry *filer_pb.Entry) fs.Node { func (dir *Dir) newDirectory(fullpath util.FullPath, entry *filer_pb.Entry) fs.Node {
return dir.wfs.fsNodeCache.EnsureFsNode(fullpath, func() fs.Node { d := dir.wfs.fsNodeCache.EnsureFsNode(fullpath, func() fs.Node {
return &Dir{name: entry.Name, wfs: dir.wfs, entry: entry, parent: dir} return &Dir{name: entry.Name, wfs: dir.wfs, entry: entry, parent: dir}
}) })
d.(*Dir).parent = dir // in case dir node was created later
return d
} }
func (dir *Dir) Create(ctx context.Context, req *fuse.CreateRequest, func (dir *Dir) Create(ctx context.Context, req *fuse.CreateRequest,

View file

@ -3,8 +3,9 @@ package filesys
import ( import (
"sync" "sync"
"github.com/chrislusf/seaweedfs/weed/util"
"github.com/seaweedfs/fuse/fs" "github.com/seaweedfs/fuse/fs"
"github.com/chrislusf/seaweedfs/weed/util"
) )
type FsCache struct { type FsCache struct {
@ -118,7 +119,6 @@ func (c *FsCache) Move(oldPath util.FullPath, newPath util.FullPath) *FsNode {
target = target.ensureChild(p) target = target.ensureChild(p)
} }
parent := target.parent parent := target.parent
src.name = target.name
if dir, ok := src.node.(*Dir); ok { if dir, ok := src.node.(*Dir); ok {
dir.name = target.name // target is not Dir, but a shortcut dir.name = target.name // target is not Dir, but a shortcut
} }
@ -132,6 +132,7 @@ func (c *FsCache) Move(oldPath util.FullPath, newPath util.FullPath) *FsNode {
target.deleteSelf() target.deleteSelf()
src.name = target.name
src.connectToParent(parent) src.connectToParent(parent)
return src return src
@ -144,10 +145,14 @@ func (n *FsNode) connectToParent(parent *FsNode) {
oldNode.deleteSelf() oldNode.deleteSelf()
} }
if dir, ok := n.node.(*Dir); ok { if dir, ok := n.node.(*Dir); ok {
dir.parent = parent.node.(*Dir) if parent.node != nil {
dir.parent = parent.node.(*Dir)
}
} }
if f, ok := n.node.(*File); ok { if f, ok := n.node.(*File); ok {
f.dir = parent.node.(*Dir) if parent.node != nil {
f.dir = parent.node.(*Dir)
}
} }
n.childrenLock.Lock() n.childrenLock.Lock()
parent.children[n.name] = n parent.children[n.name] = n

View file

@ -94,3 +94,24 @@ func TestFsCacheMove(t *testing.T) {
} }
} }
func TestFsCacheMove2(t *testing.T) {
cache := newFsCache(nil)
cache.SetFsNode(util.FullPath("/a/b/d"), &File{Name: "dd"})
cache.SetFsNode(util.FullPath("/a/b/e"), &File{Name: "ee"})
cache.Move(util.FullPath("/a/b/d"), util.FullPath("/a/b/e"))
d := cache.GetFsNode(util.FullPath("/a/b/e"))
if d == nil {
t.Errorf("unexpected nil node!")
}
if d.(*File).Name != "e" {
t.Errorf("unexpected node!")
}
}