mirror of
https://github.com/seaweedfs/seaweedfs.git
synced 2024-01-19 02:48:24 +00:00
mount2: invalidate fuse cache for replaced inode
This commit is contained in:
parent
4ddcbaab57
commit
9ef5bb20f6
|
@ -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)) {
|
||||||
|
|
|
@ -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 {
|
||||||
|
|
|
@ -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…
Reference in a new issue