Skip to content

Commit

Permalink
Merge pull request etcd-io#17564 from redwrasse/redwrasse/purge-fname…
Browse files Browse the repository at this point in the history
…s-logic

fileutil: improve control flow readability of purgeFile function
  • Loading branch information
jmhbnz authored Jul 15, 2024
2 parents 993a1f7 + c26156d commit b433760
Showing 1 changed file with 23 additions and 15 deletions.
38 changes: 23 additions & 15 deletions client/pkg/fileutil/purge.go
Original file line number Diff line number Diff line change
Expand Up @@ -17,7 +17,6 @@ package fileutil
import (
"os"
"path/filepath"
"sort"
"strings"
"time"

Expand Down Expand Up @@ -58,21 +57,14 @@ func purgeFile(lg *zap.Logger, dirname string, suffix string, max uint, interval
defer close(donec)
}
for {
fnames, err := ReadDir(dirname)
fnamesWithSuffix, err := readDirWithSuffix(dirname, suffix)
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)
Expand All @@ -94,11 +86,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 {
Expand All @@ -110,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
}

0 comments on commit b433760

Please sign in to comment.