From 854010f412c9852d2f2856b72e001caafbbe60a8 Mon Sep 17 00:00:00 2001 From: redwrasse Date: Sun, 10 Mar 2024 20:48:34 -0700 Subject: [PATCH 1/2] fileutil: improve control flow readability of purgeFile function Signed-off-by: redwrasse --- client/pkg/fileutil/purge.go | 39 ++++++++++++++++++++++-------------- 1 file changed, 24 insertions(+), 15 deletions(-) diff --git a/client/pkg/fileutil/purge.go b/client/pkg/fileutil/purge.go index b314e068f..765f5bb42 100644 --- a/client/pkg/fileutil/purge.go +++ b/client/pkg/fileutil/purge.go @@ -17,7 +17,6 @@ package fileutil import ( "os" "path/filepath" - "sort" "strings" "time" @@ -53,26 +52,35 @@ func purgeFile(lg *zap.Logger, dirname string, suffix string, max uint, interval zap.Uint("max", max), zap.Duration("interval", interval)) + readDirWithSuffix := func(dirname string) ([]string, error) { + fnames, err := ReadDir(dirname) + if err != nil { + return nil, err + } + // filter in place (ref. https://go.dev/wiki/SliceTricks#filtering-without-allocating) + fnamesWithSuffix := fnames[:0] + for _, fname := range fnames { + if strings.HasSuffix(fname, suffix) { + fnamesWithSuffix = append(fnamesWithSuffix, fname) + } + } + + return fnamesWithSuffix, nil + } + go func() { if donec != nil { defer close(donec) } for { - fnames, err := ReadDir(dirname) + fnamesWithSuffix, err := readDirWithSuffix(dirname) if err != nil { errC <- err return } - newfnames := make([]string, 0) - for _, fname := range fnames { - if strings.HasSuffix(fname, suffix) { - newfnames = append(newfnames, fname) - } - } - sort.Strings(newfnames) - fnames = newfnames - for len(newfnames) > int(max) { - f := filepath.Join(dirname, newfnames[0]) + nPurged := 0 + for nPurged < len(fnamesWithSuffix)-int(max) { + f := filepath.Join(dirname, fnamesWithSuffix[nPurged]) var l *LockedFile if flock { l, err = TryLockFile(f, os.O_WRONLY, PrivateFileMode) @@ -94,11 +102,12 @@ func purgeFile(lg *zap.Logger, dirname string, suffix string, max uint, interval } } lg.Info("purged", zap.String("path", f)) - newfnames = newfnames[1:] + nPurged++ } + if purgec != nil { - for i := 0; i < len(fnames)-len(newfnames); i++ { - purgec <- fnames[i] + for i := 0; i < nPurged; i++ { + purgec <- fnamesWithSuffix[i] } } select { From c26156d0805c3cfc90f607ac41e5740042509c57 Mon Sep 17 00:00:00 2001 From: redwrasse Date: Wed, 13 Mar 2024 18:26:27 -0700 Subject: [PATCH 2/2] move fileutil.readDirWithSuffix to normal function Signed-off-by: redwrasse --- client/pkg/fileutil/purge.go | 33 ++++++++++++++++----------------- 1 file changed, 16 insertions(+), 17 deletions(-) diff --git a/client/pkg/fileutil/purge.go b/client/pkg/fileutil/purge.go index 765f5bb42..026ea0323 100644 --- a/client/pkg/fileutil/purge.go +++ b/client/pkg/fileutil/purge.go @@ -52,28 +52,12 @@ func purgeFile(lg *zap.Logger, dirname string, suffix string, max uint, interval zap.Uint("max", max), zap.Duration("interval", interval)) - readDirWithSuffix := func(dirname string) ([]string, error) { - fnames, err := ReadDir(dirname) - if err != nil { - return nil, err - } - // filter in place (ref. https://go.dev/wiki/SliceTricks#filtering-without-allocating) - fnamesWithSuffix := fnames[:0] - for _, fname := range fnames { - if strings.HasSuffix(fname, suffix) { - fnamesWithSuffix = append(fnamesWithSuffix, fname) - } - } - - return fnamesWithSuffix, nil - } - go func() { if donec != nil { defer close(donec) } for { - fnamesWithSuffix, err := readDirWithSuffix(dirname) + fnamesWithSuffix, err := readDirWithSuffix(dirname, suffix) if err != nil { errC <- err return @@ -119,3 +103,18 @@ func purgeFile(lg *zap.Logger, dirname string, suffix string, max uint, interval }() return errC } + +func readDirWithSuffix(dirname string, suffix string) ([]string, error) { + fnames, err := ReadDir(dirname) + if err != nil { + return nil, err + } + // filter in place (ref. https://go.dev/wiki/SliceTricks#filtering-without-allocating) + fnamesWithSuffix := fnames[:0] + for _, fname := range fnames { + if strings.HasSuffix(fname, suffix) { + fnamesWithSuffix = append(fnamesWithSuffix, fname) + } + } + return fnamesWithSuffix, nil +}