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:
Diffstat (limited to 'internal/cache/walker.go')
-rw-r--r--internal/cache/walker.go68
1 files changed, 21 insertions, 47 deletions
diff --git a/internal/cache/walker.go b/internal/cache/walker.go
index 942d3b958..94737fa9f 100644
--- a/internal/cache/walker.go
+++ b/internal/cache/walker.go
@@ -14,72 +14,46 @@ import (
"github.com/sirupsen/logrus"
"gitlab.com/gitlab-org/gitaly/internal/config"
"gitlab.com/gitlab-org/gitaly/internal/dontpanic"
- "gitlab.com/gitlab-org/gitaly/internal/log"
"gitlab.com/gitlab-org/gitaly/internal/tempdir"
)
-func logWalkErr(err error, path, msg string) {
- countWalkError()
- log.Default().
- WithField("path", path).
- WithError(err).
- Warn(msg)
-}
-
-func cleanWalk(path string) error {
- defer time.Sleep(100 * time.Microsecond) // relieve pressure
-
- countWalkCheck()
- entries, err := ioutil.ReadDir(path)
- if err != nil {
- if os.IsNotExist(err) {
- logWalkErr(err, path, "unable to stat directory")
- return nil
+func cleanWalk(walkPath string) error {
+ walkErr := filepath.Walk(walkPath, func(path string, info os.FileInfo, err error) error {
+ if err != nil {
+ return err
}
- return err
- }
-
- for _, e := range entries {
- ePath := filepath.Join(path, e.Name())
- if e.IsDir() {
- if err := cleanWalk(ePath); err != nil {
- return err
- }
- continue
+ if info.IsDir() {
+ return nil
}
countWalkCheck()
- if time.Since(e.ModTime()) >= staleAge {
- if err := os.Remove(ePath); err != nil {
- if os.IsNotExist(err) {
- continue
- }
- logWalkErr(err, ePath, "unable to remove file")
- return err
- }
- countWalkRemoval()
- }
- }
- files, err := ioutil.ReadDir(path)
- if err != nil {
- logWalkErr(err, path, "unable to stat directory after walk")
- return err
- }
+ threshold := time.Now().Add(-1 * staleAge)
+ if info.ModTime().After(threshold) {
+ return nil
+ }
- if len(files) == 0 {
if err := os.Remove(path); err != nil {
if os.IsNotExist(err) {
+ // race condition: another file walker on the same storage may
+ // have deleted the file already
return nil
}
- logWalkErr(err, path, "unable to remove empty directory")
+
return err
}
+
countWalkRemoval()
+
+ return nil
+ })
+
+ if os.IsNotExist(walkErr) {
+ return nil
}
- return nil
+ return walkErr
}
const cleanWalkFrequency = 10 * time.Minute