chrislu
3 years ago
3 changed files with 101 additions and 12 deletions
@ -0,0 +1,59 @@ |
|||||
|
package mount |
||||
|
|
||||
|
import ( |
||||
|
"context" |
||||
|
"github.com/chrislusf/seaweedfs/weed/filer" |
||||
|
"github.com/chrislusf/seaweedfs/weed/filesys/meta_cache" |
||||
|
"github.com/chrislusf/seaweedfs/weed/glog" |
||||
|
"github.com/chrislusf/seaweedfs/weed/pb/filer_pb" |
||||
|
"github.com/hanwen/go-fuse/v2/fuse" |
||||
|
) |
||||
|
|
||||
|
// Lookup is called by the kernel when the VFS wants to know
|
||||
|
// about a file inside a directory. Many lookup calls can
|
||||
|
// occur in parallel, but only one call happens for each (dir,
|
||||
|
// name) pair.
|
||||
|
|
||||
|
func (wfs *WFS) Lookup(cancel <-chan struct{}, header *fuse.InHeader, name string, out *fuse.EntryOut) (code fuse.Status) { |
||||
|
|
||||
|
dirPath := wfs.inodeToPath.GetPath(header.NodeId) |
||||
|
|
||||
|
println("lookup", name, "dir inode", header.NodeId) |
||||
|
|
||||
|
fullFilePath := dirPath.Child(name) |
||||
|
|
||||
|
visitErr := meta_cache.EnsureVisited(wfs.metaCache, wfs, dirPath) |
||||
|
if visitErr != nil { |
||||
|
glog.Errorf("dir Lookup %s: %v", dirPath, visitErr) |
||||
|
return fuse.EIO |
||||
|
} |
||||
|
localEntry, cacheErr := wfs.metaCache.FindEntry(context.Background(), fullFilePath) |
||||
|
if cacheErr == filer_pb.ErrNotFound { |
||||
|
return fuse.ENOENT |
||||
|
} |
||||
|
|
||||
|
if localEntry == nil { |
||||
|
// glog.V(3).Infof("dir Lookup cache miss %s", fullFilePath)
|
||||
|
entry, err := filer_pb.GetEntry(wfs, fullFilePath) |
||||
|
if err != nil { |
||||
|
glog.V(1).Infof("dir GetEntry %s: %v", fullFilePath, err) |
||||
|
return fuse.ENOENT |
||||
|
} |
||||
|
localEntry = filer.FromPbEntry(string(dirPath), entry) |
||||
|
} else { |
||||
|
glog.V(4).Infof("dir Lookup cache hit %s", fullFilePath) |
||||
|
} |
||||
|
|
||||
|
if localEntry == nil { |
||||
|
return fuse.ENOENT |
||||
|
} |
||||
|
|
||||
|
inode := wfs.inodeToPath.GetInode(fullFilePath) |
||||
|
|
||||
|
println("found", name, "inode", inode) |
||||
|
|
||||
|
wfs.outputEntry(out, inode, localEntry) |
||||
|
|
||||
|
return fuse.OK |
||||
|
|
||||
|
} |
Write
Preview
Loading…
Cancel
Save
Reference in new issue