aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--weed/filesys/dir.go46
-rw-r--r--weed/filesys/file.go2
-rw-r--r--weed/filesys/wfs.go2
3 files changed, 34 insertions, 16 deletions
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 {
+
+ request := &filer_pb.LookupDirectoryEntryRequest{
+ Directory: dir.Path,
+ Name: req.Name,
+ }
- entry = resp.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
+ }
- return nil
- })
+ 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),
}
}