fileutil: improve control flow readability of purgeFile function

Signed-off-by: redwrasse <mail@redwrasse.io>
This commit is contained in:
redwrasse 2024-03-10 20:48:34 -07:00
parent 04082b7672
commit 854010f412

View File

@ -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 {