diff --git a/pkg/meta/base_test.go b/pkg/meta/base_test.go index 4991b0d60906..95eb10984610 100644 --- a/pkg/meta/base_test.go +++ b/pkg/meta/base_test.go @@ -2146,11 +2146,11 @@ func testClone(t *testing.T, m Meta) { if eno := m.doCleanupDetachedNode(Background, cloneDstIno); eno != 0 { t.Fatalf("remove tree error rootInode: %v", cloneDstIno) } - time.Sleep(1 * time.Second) removedKeysStr := make([]string, len(removedItem)) for i, key := range removedItem { removedKeysStr[i] = key.(string) } + removedKeysStr = append(removedKeysStr, m.detachedNodes()) if exists := m.rdb.Exists(Background, removedKeysStr...).Val(); exists != 0 { t.Fatalf("has keys not removed: %v", removedItem) } @@ -2159,15 +2159,6 @@ func testClone(t *testing.T, m Meta) { m.rdb.ZAdd(Background, m.detachedNodes(), redis.Z{Member: dNode2.String(), Score: float64(time.Now().Add(-5 * time.Minute).Unix())}).Err() m.rdb.ZAdd(Background, m.detachedNodes(), redis.Z{Member: dNode3.String(), Score: float64(time.Now().Add(-48 * time.Hour).Unix())}).Err() m.rdb.ZAdd(Background, m.detachedNodes(), redis.Z{Member: dNode4.String(), Score: float64(time.Now().Add(-48 * time.Hour).Unix())}).Err() - - nodes := m.doFindDetachedNodes(time.Now()) - if len(nodes) != 4 { - t.Fatalf("find detached nodes error: %v", nodes) - } - nodes = m.doFindDetachedNodes(time.Now().Add(-24 * time.Hour)) - if len(nodes) != 2 { - t.Fatalf("find detached nodes error: %v", nodes) - } case *dbMeta: if n, err := m.db.Delete(&edge{Parent: cloneDstAttr.Parent, Name: []byte(cloneDstName)}); err != nil || n != 1 { t.Fatalf("del edge error: %v", err) @@ -2176,6 +2167,7 @@ func testClone(t *testing.T, m Meta) { if eno := m.doCleanupDetachedNode(Background, cloneDstIno); eno != 0 { t.Fatalf("remove tree error rootInode: %v", cloneDstIno) } + removedItem = append(removedItem, &detachedNode{Inode: cloneDstIno}) time.Sleep(1 * time.Second) if exists, err := m.db.Exist(removedItem...); err != nil || exists { t.Fatalf("has keys not removed: %v", removedItem) @@ -2188,14 +2180,6 @@ func testClone(t *testing.T, m Meta) { &detachedNode{Inode: dNode4, Added: time.Now().Add(-48 * time.Hour).Unix()}, ) }) - nodes := m.doFindDetachedNodes(time.Now()) - if len(nodes) != 4 { - t.Fatalf("find detached nodes error: %v", nodes) - } - nodes = m.doFindDetachedNodes(time.Now().Add(-24 * time.Hour)) - if len(nodes) != 2 { - t.Fatalf("find detached nodes error: %v", nodes) - } case *kvMeta: // del edge first if err := m.deleteKeys(m.entryKey(cloneDstAttr.Parent, cloneDstName)); err != nil { @@ -2205,7 +2189,7 @@ func testClone(t *testing.T, m Meta) { if eno := m.doCleanupDetachedNode(Background, cloneDstIno); eno != 0 { t.Fatalf("remove tree error rootInode: %v", cloneDstIno) } - time.Sleep(1 * time.Second) + removedItem = append(removedItem, m.detachedKey(cloneDstIno)) m.txn(func(tx *kvTxn) error { for _, key := range removedItem { if buf := tx.get(key.([]byte)); buf != nil { @@ -2218,19 +2202,20 @@ func testClone(t *testing.T, m Meta) { tx.set(m.detachedKey(dNode4), m.packInt64(time.Now().Add(-48*time.Hour).Unix())) return nil }) - nodes := m.doFindDetachedNodes(time.Now()) - if len(nodes) != 4 { - t.Fatalf("find detached nodes error: %v", nodes) - } - nodes = m.doFindDetachedNodes(time.Now().Add(-24 * time.Hour)) - if len(nodes) != 2 { - t.Fatalf("find detached nodes error: %v", nodes) - } + } time.Sleep(1 * time.Second) if !sli1del || !sli2del { t.Fatalf("slice should be deleted") } + nodes := m.(engine).doFindDetachedNodes(time.Now()) + if len(nodes) != 4 { + t.Fatalf("find detached nodes error: %v", nodes) + } + nodes = m.(engine).doFindDetachedNodes(time.Now().Add(-24 * time.Hour)) + if len(nodes) != 2 { + t.Fatalf("find detached nodes error: %v", nodes) + } } diff --git a/pkg/meta/redis.go b/pkg/meta/redis.go index 50eb837a7705..4b8275927962 100644 --- a/pkg/meta/redis.go +++ b/pkg/meta/redis.go @@ -4296,8 +4296,7 @@ func (m *redisMeta) mkNodeWithAttr(ctx Context, tx *redis.Tx, srcIno Ino, srcAtt tx.HSet(ctx, m.entryKey(dstParentIno), dstName, m.packEntry(srcAttr.Typ, *dstIno)) tx.IncrBy(ctx, m.usedSpaceKey(), align4K(0)) tx.Incr(ctx, m.totalInodesKey()) - } - if !attach { + } else { pipe.ZAdd(ctx, m.detachedNodes(), redis.Z{Member: dstIno.String(), Score: float64(time.Now().Unix())}) } return nil diff --git a/pkg/meta/sql.go b/pkg/meta/sql.go index 06f284fd4fdb..c6342594d867 100644 --- a/pkg/meta/sql.go +++ b/pkg/meta/sql.go @@ -4024,28 +4024,26 @@ func (m *dbMeta) doFindDetachedNodes(t time.Time) []Ino { return detachedNodes } -func (m *dbMeta) doCleanupDetachedNode(ctx Context, detachedNode Ino) syscall.Errno { - exist, err := m.db.Exist(&node{Inode: detachedNode}) +func (m *dbMeta) doCleanupDetachedNode(ctx Context, detachedIno Ino) syscall.Errno { + exist, err := m.db.Exist(&node{Inode: detachedIno}) if err != nil { return errno(err) } if exist { rmConcurrent := make(chan int, 10) - if eno := m.emptyDir(ctx, detachedNode, true, nil, rmConcurrent); eno != 0 { + if eno := m.emptyDir(ctx, detachedIno, true, nil, rmConcurrent); eno != 0 { return eno } if err := m.txn(func(s *xorm.Session) error { - if _, err := s.Delete(&node{Inode: detachedNode}); err != nil { + if _, err := s.Delete(&node{Inode: detachedIno}); err != nil { return err } - if _, err := s.Delete(&xattr{Inode: detachedNode}); err != nil { - return err - } - return nil + _, err = s.Delete(&xattr{Inode: detachedIno}) + return err }); err != nil { return errno(err) } } - _, err = m.db.Delete(&node{Inode: detachedNode}) + _, err = m.db.Delete(&detachedNode{Inode: detachedIno}) return errno(err) }