Welcome to mirror list, hosted at ThFree Co, Russian Federation.

gitlab.com/gitlab-org/gitaly.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPatrick Steinhardt <psteinhardt@gitlab.com>2022-03-15 10:47:32 +0300
committerPatrick Steinhardt <psteinhardt@gitlab.com>2022-03-15 11:24:20 +0300
commit5d1c847ecd9985f54b135291e4fa246385285b19 (patch)
treee1627c2129ad23252b8480a48fd6ce19e78834d9
parentdd410b4f2d52085b095e511664897145ec0456b9 (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.go60
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 {