diff options
author | Patrick Steinhardt <psteinhardt@gitlab.com> | 2022-03-15 10:47:32 +0300 |
---|---|---|
committer | Patrick Steinhardt <psteinhardt@gitlab.com> | 2022-03-15 11:24:20 +0300 |
commit | 5d1c847ecd9985f54b135291e4fa246385285b19 (patch) | |
tree | e1627c2129ad23252b8480a48fd6ce19e78834d9 | |
parent | dd410b4f2d52085b095e511664897145ec0456b9 (diff) |
housekeeping: Log number of pruned ref dirs with other cleanups
Because we may be deleting files which cause reference directories to
become empty, pruning of empty reference directories needs to happen
last in our housekeeping tasks. Because of this we also don't log info
about pruned references in the log message which reports all the other
removals.
Refactor the code to return the number of pruned empty reference dirs
from `removeRefEmptyDirs()` such that we can log them in the calling
function with all the other cleanups.
-rw-r--r-- | internal/git/housekeeping/clean_stale_data.go | 60 |
1 files changed, 33 insertions, 27 deletions
diff --git a/internal/git/housekeeping/clean_stale_data.go b/internal/git/housekeeping/clean_stale_data.go index c1c2c9797..cd6da0a4a 100644 --- a/internal/git/housekeeping/clean_stale_data.go +++ b/internal/git/housekeeping/clean_stale_data.go @@ -98,12 +98,15 @@ func (m *RepositoryManager) CleanStaleData(ctx context.Context, repo *localrepo. } } - if len(filesToPrune) > 0 { - logEntry.WithField("failures", unremovableFiles).Info("removed files") + prunedRefDirs, err := removeRefEmptyDirs(ctx, repo) + optimizeEmptyDirRemovalTotals.Add(float64(prunedRefDirs)) + if err != nil { + return fmt.Errorf("housekeeping could not remove empty refs: %w", err) } + logEntry = logEntry.WithField("refsemptydir", prunedRefDirs) - if err := removeRefEmptyDirs(ctx, repo); err != nil { - return fmt.Errorf("housekeeping could not remove empty refs: %w", err) + if len(filesToPrune) > 0 || prunedRefDirs > 0 { + logEntry.WithField("failures", unremovableFiles).Info("removed files") } // TODO: https://gitlab.com/gitlab-org/gitaly/-/issues/3987 @@ -411,10 +414,10 @@ func fixDirectoryPermissions(ctx context.Context, path string, retriedPaths map[ }) } -func removeRefEmptyDirs(ctx context.Context, repository *localrepo.Repo) error { +func removeRefEmptyDirs(ctx context.Context, repository *localrepo.Repo) (int, error) { rPath, err := repository.Path() if err != nil { - return err + return 0, err } repoRefsPath := filepath.Join(rPath, "refs") @@ -422,26 +425,28 @@ func removeRefEmptyDirs(ctx context.Context, repository *localrepo.Repo) error { // recursive functions for each subdirectory entries, err := os.ReadDir(repoRefsPath) if err != nil { - return err + return 0, err } + prunedDirsTotal := 0 for _, e := range entries { if !e.IsDir() { continue } - ePath := filepath.Join(repoRefsPath, e.Name()) - if err := removeEmptyDirs(ctx, ePath); err != nil { - return err + prunedDirs, err := removeEmptyDirs(ctx, filepath.Join(repoRefsPath, e.Name())) + if err != nil { + return prunedDirsTotal, err } + prunedDirsTotal += prunedDirs } - return nil + return prunedDirsTotal, nil } -func removeEmptyDirs(ctx context.Context, target string) error { +func removeEmptyDirs(ctx context.Context, target string) (int, error) { if err := ctx.Err(); err != nil { - return err + return 0, err } // We need to stat the directory early on in order to get its current mtime. If we @@ -450,54 +455,55 @@ func removeEmptyDirs(ctx context.Context, target string) error { dirStat, err := os.Stat(target) if err != nil { if os.IsNotExist(err) { - return nil + return 0, nil } - return err + return 0, err } entries, err := os.ReadDir(target) switch { case os.IsNotExist(err): - return nil // race condition: someone else deleted it first + return 0, nil // race condition: someone else deleted it first case err != nil: - return err + return 0, err } + prunedDirsTotal := 0 for _, e := range entries { if !e.IsDir() { continue } - ePath := filepath.Join(target, e.Name()) - if err := removeEmptyDirs(ctx, ePath); err != nil { - return err + prunedDirs, err := removeEmptyDirs(ctx, filepath.Join(target, e.Name())) + if err != nil { + return prunedDirsTotal, err } + prunedDirsTotal += prunedDirs } // If the directory is older than the grace period for empty refs, then we can // consider it for deletion in case it's empty. if time.Since(dirStat.ModTime()) < emptyRefsGracePeriod { - return nil + return prunedDirsTotal, nil } // recheck entries now that we have potentially removed some dirs entries, err = os.ReadDir(target) if err != nil && !os.IsNotExist(err) { - return err + return prunedDirsTotal, err } if len(entries) > 0 { - return nil + return prunedDirsTotal, nil } switch err := os.Remove(target); { case os.IsNotExist(err): - return nil // race condition: someone else deleted it first + return prunedDirsTotal, nil // race condition: someone else deleted it first case err != nil: - return err + return prunedDirsTotal, err } - optimizeEmptyDirRemovalTotals.Inc() - return nil + return prunedDirsTotal + 1, nil } func myLogger(ctx context.Context) *log.Entry { |