aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--weed/mount/inode_to_path.go13
-rw-r--r--weed/mount/inode_to_path_test.go79
2 files changed, 88 insertions, 4 deletions
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)
+ }
+ })
+ }
+}