mirror of
https://github.com/etcd-io/etcd.git
synced 2024-09-27 06:25:44 +00:00
Merge pull request #17564 from redwrasse/redwrasse/purge-fnames-logic
fileutil: improve control flow readability of purgeFile function
This commit is contained in:
commit
b433760ca7
@ -17,7 +17,6 @@ package fileutil
|
||||
import (
|
||||
"os"
|
||||
"path/filepath"
|
||||
"sort"
|
||||
"strings"
|
||||
"time"
|
||||
|
||||
@ -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)
|
||||
@ -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 {
|
||||
@ -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
|
||||
}
|
||||
|
Loading…
x
Reference in New Issue
Block a user