From 02c2d81cde7cc35a8f86947591ff51199abf45f9 Mon Sep 17 00:00:00 2001 From: chrislu Date: Sat, 23 Jul 2022 13:21:42 -0700 Subject: [PATCH] fix removePathFromInode2Path --- weed/mount/inode_to_path.go | 13 ++++-- weed/mount/inode_to_path_test.go | 79 ++++++++++++++++++++++++++++++++ 2 files changed, 88 insertions(+), 4 deletions(-) create mode 100644 weed/mount/inode_to_path_test.go diff --git a/weed/mount/inode_to_path.go b/weed/mount/inode_to_path.go index 79c016a15..39733a1fe 100644 --- a/weed/mount/inode_to_path.go +++ b/weed/mount/inode_to_path.go @@ -174,10 +174,15 @@ func (i *InodeToPath) RemovePath(path util.FullPath) { } func (i *InodeToPath) removePathFromInode2Path(inode uint64, path util.FullPath) { - if ie, found := i.inode2path[inode]; found { - if ie.removeOnePath(path) && len(ie.paths) == 0 { - delete(i.inode2path, inode) - } + ie, found := i.inode2path[inode] + if !found { + return + } + if !ie.removeOnePath(path) { + return + } + if len(ie.paths) == 0 { + delete(i.inode2path, inode) } } diff --git a/weed/mount/inode_to_path_test.go b/weed/mount/inode_to_path_test.go new file mode 100644 index 000000000..b9723c4c5 --- /dev/null +++ b/weed/mount/inode_to_path_test.go @@ -0,0 +1,79 @@ +package mount + +import ( + "github.com/chrislusf/seaweedfs/weed/util" + "testing" +) + +func TestInodeEntry_removeOnePath(t *testing.T) { + tests := []struct { + name string + entry InodeEntry + p util.FullPath + want bool + count int + }{ + { + name: "empty", + entry: InodeEntry{}, + p: "x", + want: false, + count: 0, + }, + { + name: "single", + entry: InodeEntry{ + paths: []util.FullPath{"/x"}, + }, + p: "/x", + want: true, + count: 0, + }, + { + name: "first", + entry: InodeEntry{ + paths: []util.FullPath{"/x", "/y", "/z"}, + }, + p: "/x", + want: true, + count: 2, + }, + { + name: "middle", + entry: InodeEntry{ + paths: []util.FullPath{"/x", "/y", "/z"}, + }, + p: "/y", + want: true, + count: 2, + }, + { + name: "last", + entry: InodeEntry{ + paths: []util.FullPath{"/x", "/y", "/z"}, + }, + p: "/z", + want: true, + count: 2, + }, + { + name: "not found", + entry: InodeEntry{ + paths: []util.FullPath{"/x", "/y", "/z"}, + }, + p: "/t", + want: false, + count: 3, + }, + } + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + if got := tt.entry.removeOnePath(tt.p); got != tt.want { + t.Errorf("removeOnePath() = %v, want %v", got, tt.want) + } + if tt.count != len(tt.entry.paths) { + t.Errorf("removeOnePath path count = %v, want %v", len(tt.entry.paths), tt.count) + } + }) + } +}