Browse Source

mount2: invalidate fuse cache for replaced inode

original_weed_mount
chrislu 3 years ago
parent
commit
9ef5bb20f6
  1. 3
      weed/mount/inode_to_path.go
  2. 5
      weed/mount/weedfs.go
  3. 8
      weed/mount/weedfs_rename.go

3
weed/mount/inode_to_path.go

@ -138,7 +138,7 @@ func (i *InodeToPath) RemovePath(path util.FullPath) {
} }
} }
func (i *InodeToPath) MovePath(sourcePath, targetPath util.FullPath) {
func (i *InodeToPath) MovePath(sourcePath, targetPath util.FullPath) (replacedInode uint64) {
i.Lock() i.Lock()
defer i.Unlock() defer i.Unlock()
sourceInode, sourceFound := i.path2inode[sourcePath] sourceInode, sourceFound := i.path2inode[sourcePath]
@ -157,6 +157,7 @@ func (i *InodeToPath) MovePath(sourcePath, targetPath util.FullPath) {
} else { } else {
i.inode2path[sourceInode].nlookup++ i.inode2path[sourceInode].nlookup++
} }
return targetInode
} }
func (i *InodeToPath) Forget(inode, nlookup uint64, onForgetDir func(dir util.FullPath)) { func (i *InodeToPath) Forget(inode, nlookup uint64, onForgetDir func(dir util.FullPath)) {

5
weed/mount/weedfs.go

@ -65,6 +65,7 @@ type WFS struct {
inodeToPath *InodeToPath inodeToPath *InodeToPath
fhmap *FileHandleToInode fhmap *FileHandleToInode
dhmap *DirectoryHandleToInode dhmap *DirectoryHandleToInode
fuseServer *fuse.Server
} }
func NewSeaweedFileSystem(option *Option) *WFS { func NewSeaweedFileSystem(option *Option) *WFS {
@ -109,6 +110,10 @@ func (wfs *WFS) String() string {
return "seaweedfs" return "seaweedfs"
} }
func (wfs *WFS) Init(server *fuse.Server) {
wfs.fuseServer = server
}
func (wfs *WFS) maybeReadEntry(inode uint64) (path util.FullPath, fh *FileHandle, entry *filer_pb.Entry, status fuse.Status) { func (wfs *WFS) maybeReadEntry(inode uint64) (path util.FullPath, fh *FileHandle, entry *filer_pb.Entry, status fuse.Status) {
path, status = wfs.inodeToPath.GetPath(inode) path, status = wfs.inodeToPath.GetPath(inode)
if status != fuse.OK { if status != fuse.OK {

8
weed/mount/weedfs_rename.go

@ -214,6 +214,8 @@ func (wfs *WFS) Rename(cancel <-chan struct{}, in *fuse.RenameIn, oldName string
func (wfs *WFS) handleRenameResponse(ctx context.Context, resp *filer_pb.StreamRenameEntryResponse) error { func (wfs *WFS) handleRenameResponse(ctx context.Context, resp *filer_pb.StreamRenameEntryResponse) error {
// comes from filer StreamRenameEntry, can only be create or delete entry // comes from filer StreamRenameEntry, can only be create or delete entry
glog.V(4).Infof("dir Rename %+v", resp.EventNotification)
if resp.EventNotification.NewEntry != nil { if resp.EventNotification.NewEntry != nil {
// with new entry, the old entry name also exists. This is the first step to create new entry // with new entry, the old entry name also exists. This is the first step to create new entry
newEntry := filer.FromPbEntry(resp.EventNotification.NewParentPath, resp.EventNotification.NewEntry) newEntry := filer.FromPbEntry(resp.EventNotification.NewParentPath, resp.EventNotification.NewEntry)
@ -227,7 +229,11 @@ func (wfs *WFS) handleRenameResponse(ctx context.Context, resp *filer_pb.StreamR
oldPath := oldParent.Child(oldName) oldPath := oldParent.Child(oldName)
newPath := newParent.Child(newName) newPath := newParent.Child(newName)
wfs.inodeToPath.MovePath(oldPath, newPath)
replacedInode := wfs.inodeToPath.MovePath(oldPath, newPath)
// invalidate attr and data
if replacedInode > 0 {
wfs.fuseServer.InodeNotify(replacedInode, 0, -1)
}
} else if resp.EventNotification.OldEntry != nil { } else if resp.EventNotification.OldEntry != nil {
// without new entry, only old entry name exists. This is the second step to delete old entry // without new entry, only old entry name exists. This is the second step to delete old entry

Loading…
Cancel
Save