mirror of
https://github.com/seaweedfs/seaweedfs.git
synced 2024-01-19 02:48:24 +00:00
mount: cache on reading remote storage
This commit is contained in:
parent
a7012d9729
commit
69655ba8e5
|
@ -360,3 +360,30 @@ func (file *File) saveEntry(entry *filer_pb.Entry) error {
|
||||||
func (file *File) getEntry() *filer_pb.Entry {
|
func (file *File) getEntry() *filer_pb.Entry {
|
||||||
return file.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
|
||||||
|
}
|
||||||
|
|
|
@ -114,6 +114,16 @@ func (fh *FileHandle) readFromChunks(buff []byte, offset int64) (int64, error) {
|
||||||
return 0, io.EOF
|
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))
|
fileSize := int64(filer.FileSize(entry))
|
||||||
fileFullPath := fh.f.fullpath()
|
fileFullPath := fh.f.fullpath()
|
||||||
|
|
||||||
|
|
|
@ -12,6 +12,10 @@ import (
|
||||||
"github.com/viant/ptrie"
|
"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) {
|
func ToFileIdObject(fileIdStr string) (*FileId, error) {
|
||||||
t, err := needle.ParseFileIdFromString(fileIdStr)
|
t, err := needle.ParseFileIdFromString(fileIdStr)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
|
|
|
@ -155,7 +155,7 @@ func (fs *FilerServer) DownloadToLocal(ctx context.Context, req *filer_pb.Downlo
|
||||||
|
|
||||||
fs.filer.NotifyUpdateEvent(ctx, entry, newEntry, true, false, nil)
|
fs.filer.NotifyUpdateEvent(ctx, entry, newEntry, true, false, nil)
|
||||||
|
|
||||||
resp.Entry = entry.ToProtoEntry()
|
resp.Entry = newEntry.ToProtoEntry()
|
||||||
|
|
||||||
return resp, nil
|
return resp, nil
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue