mirror of
https://github.com/etcd-io/etcd.git
synced 2024-09-27 06:25:44 +00:00
fileutil: improve control flow readability of purgeFile function
Signed-off-by: redwrasse <mail@redwrasse.io>
This commit is contained in:
parent
04082b7672
commit
854010f412
@ -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 {
|
||||
|
Loading…
x
Reference in New Issue
Block a user