diff --git a/weed/filesys/dir.go b/weed/filesys/dir.go index d8b0847d3..c1fa07ab3 100644 --- a/weed/filesys/dir.go +++ b/weed/filesys/dir.go @@ -70,6 +70,8 @@ func (dir *Dir) Attr(context context.Context, attr *fuse.Attr) error { dir.attributes = resp.Entry.Attributes } + dir.wfs.listDirectoryEntriesCache.Set(dir.Path, resp.Entry, 300*time.Millisecond) + return nil }) @@ -185,24 +187,34 @@ func (dir *Dir) Mkdir(ctx context.Context, req *fuse.MkdirRequest) (fs.Node, err func (dir *Dir) Lookup(ctx context.Context, req *fuse.LookupRequest, resp *fuse.LookupResponse) (node fs.Node, err error) { var entry *filer_pb.Entry - err = dir.wfs.withFilerClient(func(client filer_pb.SeaweedFilerClient) error { - request := &filer_pb.LookupDirectoryEntryRequest{ - Directory: dir.Path, - Name: req.Name, - } + item := dir.wfs.listDirectoryEntriesCache.Get(path.Join(dir.Path, req.Name)) + if item != nil && !item.Expired() { + entry = item.Value().(*filer_pb.Entry) + } - glog.V(4).Infof("lookup directory entry: %v", request) - resp, err := client.LookupDirectoryEntry(ctx, request) - if err != nil { - // glog.V(0).Infof("lookup %s/%s: %v", dir.Path, name, err) - return fuse.ENOENT - } + if entry == nil { + err = dir.wfs.withFilerClient(func(client filer_pb.SeaweedFilerClient) error { - entry = resp.Entry + request := &filer_pb.LookupDirectoryEntryRequest{ + Directory: dir.Path, + Name: req.Name, + } - return nil - }) + glog.V(4).Infof("lookup directory entry: %v", request) + resp, err := client.LookupDirectoryEntry(ctx, request) + if err != nil { + // glog.V(0).Infof("lookup %s/%s: %v", dir.Path, name, err) + return fuse.ENOENT + } + + entry = resp.Entry + + dir.wfs.listDirectoryEntriesCache.Set(path.Join(dir.Path, entry.Name), entry, 1000*time.Millisecond) + + return nil + }) + } if entry != nil { if entry.IsDirectory { @@ -248,7 +260,7 @@ func (dir *Dir) ReadDirAll(ctx context.Context) (ret []fuse.Dirent, err error) { dirent := fuse.Dirent{Name: entry.Name, Type: fuse.DT_File} ret = append(ret, dirent) } - dir.wfs.listDirectoryEntriesCache.Set(dir.Path+"/"+entry.Name, entry, 300*time.Millisecond) + dir.wfs.listDirectoryEntriesCache.Set(path.Join(dir.Path, entry.Name), entry, 300*time.Millisecond) } return nil @@ -275,6 +287,8 @@ func (dir *Dir) Remove(ctx context.Context, req *fuse.RemoveRequest) error { return fuse.EIO } + dir.wfs.listDirectoryEntriesCache.Delete(path.Join(dir.Path, req.Name)) + return nil }) @@ -317,6 +331,8 @@ func (dir *Dir) Setattr(ctx context.Context, req *fuse.SetattrRequest, resp *fus return fuse.EIO } + dir.wfs.listDirectoryEntriesCache.Delete(dir.Path) + return nil }) diff --git a/weed/filesys/file.go b/weed/filesys/file.go index db9cb0a0f..df02fe8f2 100644 --- a/weed/filesys/file.go +++ b/weed/filesys/file.go @@ -153,6 +153,8 @@ func (file *File) maybeLoadAttributes(ctx context.Context) error { glog.V(1).Infof("file attr %v %+v: %d", file.fullpath(), file.entry.Attributes, filer2.TotalSize(file.entry.Chunks)) + file.wfs.listDirectoryEntriesCache.Set(file.fullpath(), file.entry, 300*time.Millisecond) + return nil }) diff --git a/weed/filesys/wfs.go b/weed/filesys/wfs.go index 423ec54e4..fc5a9cf93 100644 --- a/weed/filesys/wfs.go +++ b/weed/filesys/wfs.go @@ -35,7 +35,7 @@ type WFS struct { func NewSeaweedFileSystem(option *Option) *WFS { return &WFS{ option: option, - listDirectoryEntriesCache: ccache.New(ccache.Configure().MaxSize(6000).ItemsToPrune(100)), + listDirectoryEntriesCache: ccache.New(ccache.Configure().MaxSize(int64(option.DirListingLimit) + 200).ItemsToPrune(100)), pathToHandleIndex: make(map[string]int), } }