mount: rename also clear the cache

fix https://github.com/chrislusf/seaweedfs/issues/1182
This commit is contained in:
Chris Lu 2020-01-19 12:31:56 -08:00
parent 04019aa161
commit 2f15e93466
3 changed files with 14 additions and 6 deletions

View file

@ -182,7 +182,7 @@ func (dir *Dir) Lookup(ctx context.Context, req *fuse.LookupRequest, resp *fuse.
glog.V(4).Infof("dir Lookup %s: %s", dir.Path, req.Name) glog.V(4).Infof("dir Lookup %s: %s", dir.Path, req.Name)
var entry *filer_pb.Entry var entry *filer_pb.Entry
fullFilePath := path.Join(dir.Path, req.Name) fullFilePath := string(filer2.NewFullPath(dir.Path, req.Name))
item := dir.wfs.listDirectoryEntriesCache.Get(fullFilePath) item := dir.wfs.listDirectoryEntriesCache.Get(fullFilePath)
if item != nil && !item.Expired() { if item != nil && !item.Expired() {
@ -233,7 +233,7 @@ func (dir *Dir) ReadDirAll(ctx context.Context) (ret []fuse.Dirent, err error) {
cacheTtl := 5 * time.Minute cacheTtl := 5 * time.Minute
readErr := filer2.ReadDirAllEntries(ctx, dir.wfs, dir.Path, "", func(entry *filer_pb.Entry, isLast bool) { readErr := filer2.ReadDirAllEntries(ctx, dir.wfs, dir.Path, "", func(entry *filer_pb.Entry, isLast bool) {
fullpath := path.Join(dir.Path, entry.Name) fullpath := string(filer2.NewFullPath(dir.Path, entry.Name))
inode := uint64(util.HashStringToLong(fullpath)) inode := uint64(util.HashStringToLong(fullpath))
if entry.IsDirectory { if entry.IsDirectory {
dirent := fuse.Dirent{Inode: inode, Name: entry.Name, Type: fuse.DT_Dir} dirent := fuse.Dirent{Inode: inode, Name: entry.Name, Type: fuse.DT_Dir}
@ -295,7 +295,7 @@ func (dir *Dir) removeOneFile(ctx context.Context, req *fuse.RemoveRequest) erro
func (dir *Dir) removeFolder(ctx context.Context, req *fuse.RemoveRequest) error { func (dir *Dir) removeFolder(ctx context.Context, req *fuse.RemoveRequest) error {
dir.wfs.listDirectoryEntriesCache.Delete(path.Join(dir.Path, req.Name)) dir.wfs.listDirectoryEntriesCache.Delete(string(filer2.NewFullPath(dir.Path, req.Name)))
return dir.wfs.WithFilerClient(ctx, func(client filer_pb.SeaweedFilerClient) error { return dir.wfs.WithFilerClient(ctx, func(client filer_pb.SeaweedFilerClient) error {

View file

@ -4,6 +4,7 @@ import (
"context" "context"
"fmt" "fmt"
"github.com/chrislusf/seaweedfs/weed/filer2"
"github.com/chrislusf/seaweedfs/weed/glog" "github.com/chrislusf/seaweedfs/weed/glog"
"github.com/chrislusf/seaweedfs/weed/pb/filer_pb" "github.com/chrislusf/seaweedfs/weed/pb/filer_pb"
"github.com/seaweedfs/fuse" "github.com/seaweedfs/fuse"
@ -15,7 +16,7 @@ func (dir *Dir) Rename(ctx context.Context, req *fuse.RenameRequest, newDirector
newDir := newDirectory.(*Dir) newDir := newDirectory.(*Dir)
glog.V(4).Infof("dir Rename %s/%s => %s/%s", dir.Path, req.OldName, newDir.Path, req.NewName) glog.V(4).Infof("dir Rename %s/%s => %s/%s", dir.Path, req.OldName, newDir.Path, req.NewName)
return dir.wfs.WithFilerClient(ctx, func(client filer_pb.SeaweedFilerClient) error { err := dir.wfs.WithFilerClient(ctx, func(client filer_pb.SeaweedFilerClient) error {
request := &filer_pb.AtomicRenameEntryRequest{ request := &filer_pb.AtomicRenameEntryRequest{
OldDirectory: dir.Path, OldDirectory: dir.Path,
@ -33,4 +34,12 @@ func (dir *Dir) Rename(ctx context.Context, req *fuse.RenameRequest, newDirector
}) })
if err == nil {
oldpath := string(filer2.NewFullPath(dir.Path, req.OldName))
newpath := string(filer2.NewFullPath(newDir.Path, req.NewName))
dir.wfs.listDirectoryEntriesCache.Delete(oldpath)
dir.wfs.listDirectoryEntriesCache.Delete(newpath)
}
return err
} }

View file

@ -2,7 +2,6 @@ package filesys
import ( import (
"context" "context"
"path/filepath"
"github.com/chrislusf/seaweedfs/weed/filer2" "github.com/chrislusf/seaweedfs/weed/filer2"
"github.com/chrislusf/seaweedfs/weed/glog" "github.com/chrislusf/seaweedfs/weed/glog"
@ -110,7 +109,7 @@ func listxattr(entry *filer_pb.Entry, req *fuse.ListxattrRequest, resp *fuse.Lis
func (wfs *WFS) maybeLoadEntry(ctx context.Context, dir, name string) (entry *filer_pb.Entry, err error) { func (wfs *WFS) maybeLoadEntry(ctx context.Context, dir, name string) (entry *filer_pb.Entry, err error) {
fullpath := filepath.Join(dir, name) fullpath := string(filer2.NewFullPath(dir, name))
item := wfs.listDirectoryEntriesCache.Get(fullpath) item := wfs.listDirectoryEntriesCache.Get(fullpath)
if item != nil && !item.Expired() { if item != nil && !item.Expired() {
entry = item.Value().(*filer_pb.Entry) entry = item.Value().(*filer_pb.Entry)