diff options
Diffstat (limited to 'weed/filesys/file.go')
| -rw-r--r-- | weed/filesys/file.go | 48 |
1 files changed, 35 insertions, 13 deletions
diff --git a/weed/filesys/file.go b/weed/filesys/file.go index e4c79c055..b4a447fa6 100644 --- a/weed/filesys/file.go +++ b/weed/filesys/file.go @@ -9,6 +9,9 @@ import ( "bazil.org/fuse/fs" "github.com/chrislusf/seaweedfs/weed/glog" "github.com/chrislusf/seaweedfs/weed/pb/filer_pb" + "path/filepath" + "os" + "time" ) var _ = fs.Node(&File{}) @@ -22,29 +25,48 @@ var _ = fs.HandleWriter(&File{}) type File struct { FileId filer.FileId Name string + dir *Dir wfs *WFS } func (file *File) Attr(context context.Context, attr *fuse.Attr) error { - attr.Mode = 0444 - return file.wfs.withFilerClient(func(client filer_pb.SeaweedFilerClient) error { + fullPath := filepath.Join(file.dir.Path, file.Name) + item := file.wfs.listDirectoryEntriesCache.Get(fullPath) + var attributes *filer_pb.FuseAttributes + if item != nil { + attributes = item.Value().(*filer_pb.FuseAttributes) + glog.V(1).Infof("read cached file %v attributes", file.Name) + } else { + err := file.wfs.withFilerClient(func(client filer_pb.SeaweedFilerClient) error { + + request := &filer_pb.GetFileAttributesRequest{ + Name: file.Name, + ParentDir: file.dir.Path, + } + + glog.V(1).Infof("read file size: %v", request) + resp, err := client.GetFileAttributes(context, request) + if err != nil { + return err + } + + attributes = resp.Attributes + + return nil + }) - request := &filer_pb.GetFileAttributesRequest{ - Name: file.Name, - ParentDir: "", //TODO add parent folder - FileId: string(file.FileId), - } - - glog.V(1).Infof("read file size: %v", request) - resp, err := client.GetFileAttributes(context, request) if err != nil { return err } + } - attr.Size = resp.Attributes.FileSize + attr.Mode = os.FileMode(attributes.FileMode) + attr.Size = attributes.FileSize + attr.Mtime = time.Unix(attributes.Mtime, 0) + attr.Gid = attributes.Gid + attr.Uid = attributes.Uid + return nil - return nil - }) } func (file *File) ReadAll(ctx context.Context) (content []byte, err error) { |
