From a2a73616ca87dbefc18d43688f91bb143b3096af Mon Sep 17 00:00:00 2001 From: zhumingze Date: Fri, 3 Jan 2025 19:55:24 +0800 Subject: [PATCH] feat(fsck): Add force clean function for fsck. #22944717 Signed-off-by: zhumingze --- sdk/meta/api.go | 2 ++ tool/fsck/cmd/clean.go | 29 ++++++++++++++++++++--------- tool/fsck/cmd/common.go | 1 + tool/fsck/cmd/root.go | 1 + 4 files changed, 24 insertions(+), 9 deletions(-) diff --git a/sdk/meta/api.go b/sdk/meta/api.go index 0501a663d..e9f03bcbb 100644 --- a/sdk/meta/api.go +++ b/sdk/meta/api.go @@ -1959,6 +1959,8 @@ func (mw *MetaWrapper) Evict(inode uint64, fullPath string) error { return syscall.EINVAL } + log.LogDebugf("Evict: ino(%v) mp(%v)", inode, mp.PartitionID) + status, err := mw.ievict(mp, inode, fullPath) if err != nil || status != statusOK { log.LogWarnf("Evict: ino(%v) err(%v) status(%v)", inode, err, status) diff --git a/tool/fsck/cmd/clean.go b/tool/fsck/cmd/clean.go index df252efb7..9f484579c 100644 --- a/tool/fsck/cmd/clean.go +++ b/tool/fsck/cmd/clean.go @@ -29,7 +29,6 @@ import ( "github.com/cubefs/cubefs/proto" "github.com/cubefs/cubefs/sdk/meta" "github.com/cubefs/cubefs/util/log" - "github.com/cubefs/cubefs/util/ump" ) const ( @@ -64,7 +63,6 @@ func newCleanInodeCmd() *cobra.Command { } }, } - return c } @@ -97,18 +95,18 @@ func newEvictInodeCmd() *cobra.Command { } func Clean(opt string) error { - defer log.LogFlush() + // defer log.LogFlush() if MasterAddr == "" || VolName == "" { return fmt.Errorf("Lack of parameters: master(%v) vol(%v)", MasterAddr, VolName) } - ump.InitUmp("fsck", "") + // ump.InitUmp("fsck", "") - _, err := log.InitLog("fscklog", "fsck", log.InfoLevel, nil, log.DefaultLogLeftSpaceLimitRatio) - if err != nil { - return fmt.Errorf("Init log failed: %v", err) - } + // _, err := log.InitLog("fscklog", "fsck", log.InfoLevel, nil, log.DefaultLogLeftSpaceLimitRatio) + // if err != nil { + // return fmt.Errorf("Init log failed: %v", err) + // } masters := strings.Split(MasterAddr, meta.HostsSeparator) metaConfig := &meta.MetaConfig{ @@ -116,6 +114,7 @@ func Clean(opt string) error { Masters: masters, } + var err error gMetaWrapper, err = meta.NewMetaWrapper(metaConfig) if err != nil { return fmt.Errorf("NewMetaWrapper failed: %v", err) @@ -215,16 +214,28 @@ func cleanInodes() error { } func doEvictInode(inode *Inode) error { + if forceClean { + _, err := gMetaWrapper.InodeUnlink_ll(inode.Inode, inode.Path) + if err != nil { + log.LogWarnf("doEvictInode: unlink inode err(%v)", err) + return err + } + inode.NLink = 0 + } + if inode.NLink != 0 || time.Since(time.Unix(inode.ModifyTime, 0)) < 24*time.Hour || !proto.IsRegular(inode.Type) { + log.LogWarnf("doEvictInode: ino(%v) can't be deleted", inode.Inode) return nil } + err := gMetaWrapper.Evict(inode.Inode, inode.Path) if err != nil { + log.LogWarnf("doEvictInode: evict inode err(%v)", err) if err != syscall.ENOENT { return err } } - log.LogWritef("%v", inode) + log.LogWarnf("doEvictInode success: ino(%v)", inode) return nil } diff --git a/tool/fsck/cmd/common.go b/tool/fsck/cmd/common.go index f22f62f71..a55265b89 100644 --- a/tool/fsck/cmd/common.go +++ b/tool/fsck/cmd/common.go @@ -30,6 +30,7 @@ var ( CleanS bool CleanFlag string isCheckApplyId bool + forceClean bool ) const ( diff --git a/tool/fsck/cmd/root.go b/tool/fsck/cmd/root.go index 0b41909de..98dfbf576 100644 --- a/tool/fsck/cmd/root.go +++ b/tool/fsck/cmd/root.go @@ -58,5 +58,6 @@ func NewRootCmd() *cobra.Command { c.PersistentFlags().Uint64VarP(&InodeID, "inode", "", 0, "inode id of a file") c.Flags().BoolVarP(&optShowVersion, "version", "v", false, "Show version information") c.PersistentFlags().StringVarP(&CleanFlag, "clean", "", "false", "whether clean gc data.") + c.PersistentFlags().BoolVarP(&forceClean, "force", "f", false, "force clean dirty inode") return c }