feat(fsck): Add force clean function for fsck. #22944717

Signed-off-by: zhumingze <zhumingze@oppo.com>
This commit is contained in:
zhumingze 2025-01-03 19:55:24 +08:00 committed by zhumingze1108
parent 090e94bab8
commit a2a73616ca
4 changed files with 24 additions and 9 deletions

View File

@ -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)

View File

@ -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
}

View File

@ -30,6 +30,7 @@ var (
CleanS bool
CleanFlag string
isCheckApplyId bool
forceClean bool
)
const (

View File

@ -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
}