From fe89d6607ee77353c7041d9f99b8251dd38f5ad8 Mon Sep 17 00:00:00 2001 From: Daniil Forshev Date: Wed, 20 May 2026 13:39:04 +0500 Subject: [PATCH 1/2] chore(skipmaskmanager): remove skip mask files at startup if no frac --- skipmaskmanager/skip_mask_manager.go | 30 ++++++++++++++++++++++------ 1 file changed, 24 insertions(+), 6 deletions(-) diff --git a/skipmaskmanager/skip_mask_manager.go b/skipmaskmanager/skip_mask_manager.go index 8104ac4f..7b9d3e81 100644 --- a/skipmaskmanager/skip_mask_manager.go +++ b/skipmaskmanager/skip_mask_manager.go @@ -147,12 +147,13 @@ func New( func (smm *SkipMaskManager) Start(fracs fractionAcquirer) { smm.createDataDir() - err := smm.loadSkipMasks() + allFracs := fracs.Fractions() + err := smm.loadSkipMasks(allFracs.Names()) if err != nil { logger.Fatal("failed to load previous skip masks", zap.Error(err)) } - err = smm.buildQueue(fracs.Fractions()) + err = smm.buildQueue(allFracs) if err != nil { logger.Fatal("failed to build skip mask manager queue", zap.Error(err)) } @@ -334,7 +335,6 @@ func (smm *SkipMaskManager) RefreshFrac(fraction frac.Fraction) { // This should be called when a fraction is deleted from the system. // The removal is performed asynchronously in the background. func (smm *SkipMaskManager) RemoveFrac(fracName string) { - // TODO: we might want to have some kind of GC on startup to clean up missed files smm.bgWG.Go(func() { smm.fracsMu.RLock() fracsFiles, has := smm.fracs[fracName] @@ -386,12 +386,17 @@ func (smm *SkipMaskManager) addDoneFrac(fracName, fracPath string) { // - Registers completed skip masks (.skipmask files) // // This allows the manager to resume processing after a restart. -func (smm *SkipMaskManager) loadSkipMasks() error { +func (smm *SkipMaskManager) loadSkipMasks(fracNames []string) error { des, err := os.ReadDir(smm.config.DataDir) if err != nil { return err } + fracNamesSet := make(map[string]struct{}, len(fracNames)) + for _, fracName := range fracNames { + fracNamesSet[fracName] = struct{}{} + } + var anyRemove bool for _, de := range des { @@ -400,7 +405,7 @@ func (smm *SkipMaskManager) loadSkipMasks() error { } if _, ok := smm.skipMasks[de.Name()]; !ok { - logger.Info("there is skip mask folder on disk, but not in config. need to delete it.") + logger.Info("found skip mask folder on disk, but not in config. remove it", zap.String("path", de.Name())) err := os.RemoveAll(path.Join(smm.config.DataDir, de.Name())) if err != nil && !os.IsNotExist(err) { return err @@ -424,13 +429,26 @@ func (smm *SkipMaskManager) loadSkipMasks() error { if smde.IsDir() { continue } + name := smde.Name() + fracName := fracNameFromFilePath(name) + + // remove missed files + if _, ok := fracNamesSet[fracName]; !ok { + err := os.RemoveAll(path.Join(sm.dirPath, name)) + if err != nil && !os.IsNotExist(err) { + return err + } + logger.Info("found missed skip mask file. remove it", zap.String("path", name)) + anyRemove = true + continue + } switch path.Ext(name) { case fracInQueueExt: hasFracsInQueue = true case fracDoneExt: - smm.addDoneFrac(fracNameFromFilePath(name), path.Join(sm.dirPath, name)) + smm.addDoneFrac(fracName, path.Join(sm.dirPath, name)) } } From 9be95045777a00b7672f5f4dd23e54280a878eec Mon Sep 17 00:00:00 2001 From: Daniil Forshev Date: Fri, 29 May 2026 16:44:35 +0500 Subject: [PATCH 2/2] fix(skipmaskmanager): fix missed files deletion --- skipmaskmanager/skip_mask_manager.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/skipmaskmanager/skip_mask_manager.go b/skipmaskmanager/skip_mask_manager.go index 7b9d3e81..84743568 100644 --- a/skipmaskmanager/skip_mask_manager.go +++ b/skipmaskmanager/skip_mask_manager.go @@ -435,7 +435,7 @@ func (smm *SkipMaskManager) loadSkipMasks(fracNames []string) error { // remove missed files if _, ok := fracNamesSet[fracName]; !ok { - err := os.RemoveAll(path.Join(sm.dirPath, name)) + err := os.Remove(path.Join(sm.dirPath, name)) if err != nil && !os.IsNotExist(err) { return err }