From 69655ba8e56c94cc1ef6fea5420c5a66d8fe650a Mon Sep 17 00:00:00 2001 From: Chris Lu Date: Mon, 9 Aug 2021 22:11:57 -0700 Subject: [PATCH] mount: cache on reading remote storage --- weed/filesys/file.go | 27 +++++++++++++++++++++++++ weed/filesys/filehandle.go | 10 +++++++++ weed/pb/filer_pb/filer_pb_helper.go | 4 ++++ weed/server/filer_grpc_server_remote.go | 2 +- 4 files changed, 42 insertions(+), 1 deletion(-) diff --git a/weed/filesys/file.go b/weed/filesys/file.go index 7f021619c..b990b20d1 100644 --- a/weed/filesys/file.go +++ b/weed/filesys/file.go @@ -360,3 +360,30 @@ func (file *File) saveEntry(entry *filer_pb.Entry) error { func (file *File) getEntry() *filer_pb.Entry { return file.entry } + +func (file *File) downloadRemoteEntry(entry *filer_pb.Entry) (*filer_pb.Entry, error) { + err := file.wfs.WithFilerClient(func(client filer_pb.SeaweedFilerClient) error { + + request := &filer_pb.DownloadToLocalRequest{ + Directory: file.dir.FullPath(), + Name: entry.Name, + } + + glog.V(4).Infof("download entry: %v", request) + resp, err := client.DownloadToLocal(context.Background(), request) + if err != nil { + glog.Errorf("DownloadToLocal file %s/%s: %v", file.dir.FullPath(), file.Name, err) + return fuse.EIO + } + + entry = resp.Entry + + file.wfs.metaCache.InsertEntry(context.Background(), filer.FromPbEntry(request.Directory, resp.Entry)) + + file.dirtyMetadata = false + + return nil + }) + + return entry, err +} diff --git a/weed/filesys/filehandle.go b/weed/filesys/filehandle.go index 9acede330..5cd7ca948 100644 --- a/weed/filesys/filehandle.go +++ b/weed/filesys/filehandle.go @@ -114,6 +114,16 @@ func (fh *FileHandle) readFromChunks(buff []byte, offset int64) (int64, error) { return 0, io.EOF } + if entry.IsInRemoteOnly() { + glog.V(4).Infof("download remote entry %s", fh.f.fullpath()) + newEntry, err := fh.f.downloadRemoteEntry(entry) + if err != nil { + glog.V(1).Infof("download remote entry %s: %v", fh.f.fullpath(), err) + return 0, err + } + entry = newEntry + } + fileSize := int64(filer.FileSize(entry)) fileFullPath := fh.f.fullpath() diff --git a/weed/pb/filer_pb/filer_pb_helper.go b/weed/pb/filer_pb/filer_pb_helper.go index ae282db75..7480d469a 100644 --- a/weed/pb/filer_pb/filer_pb_helper.go +++ b/weed/pb/filer_pb/filer_pb_helper.go @@ -12,6 +12,10 @@ import ( "github.com/viant/ptrie" ) +func (entry *Entry) IsInRemoteOnly() bool { + return len(entry.Chunks) == 0 && entry.RemoteEntry != nil && entry.RemoteEntry.RemoteSize > 0 +} + func ToFileIdObject(fileIdStr string) (*FileId, error) { t, err := needle.ParseFileIdFromString(fileIdStr) if err != nil { diff --git a/weed/server/filer_grpc_server_remote.go b/weed/server/filer_grpc_server_remote.go index 9cd3c296b..2cbfd3319 100644 --- a/weed/server/filer_grpc_server_remote.go +++ b/weed/server/filer_grpc_server_remote.go @@ -155,7 +155,7 @@ func (fs *FilerServer) DownloadToLocal(ctx context.Context, req *filer_pb.Downlo fs.filer.NotifyUpdateEvent(ctx, entry, newEntry, true, false, nil) - resp.Entry = entry.ToProtoEntry() + resp.Entry = newEntry.ToProtoEntry() return resp, nil