purge.go (etcd-3.5.5) | : | purge.go (etcd-3.5.6) | ||
---|---|---|---|---|
skipping to change at line 44 | skipping to change at line 44 | |||
return doneC, errC | return doneC, errC | |||
} | } | |||
// purgeFile is the internal implementation for PurgeFile which can post purged files to purgec if non-nil. | // purgeFile is the internal implementation for PurgeFile which can post purged files to purgec if non-nil. | |||
// if donec is non-nil, the function closes it to notify its exit. | // if donec is non-nil, the function closes it to notify its exit. | |||
func purgeFile(lg *zap.Logger, dirname string, suffix string, max uint, interval time.Duration, stop <-chan struct{}, purgec chan<- string, donec chan<- struct{ }) <-chan error { | func purgeFile(lg *zap.Logger, dirname string, suffix string, max uint, interval time.Duration, stop <-chan struct{}, purgec chan<- string, donec chan<- struct{ }) <-chan error { | |||
if lg == nil { | if lg == nil { | |||
lg = zap.NewNop() | lg = zap.NewNop() | |||
} | } | |||
errC := make(chan error, 1) | errC := make(chan error, 1) | |||
lg.Info("started to purge file", | ||||
zap.String("dir", dirname), | ||||
zap.String("suffix", suffix), | ||||
zap.Uint("max", max), | ||||
zap.Duration("interval", interval)) | ||||
go func() { | go func() { | |||
if donec != nil { | if donec != nil { | |||
defer close(donec) | defer close(donec) | |||
} | } | |||
for { | for { | |||
fnames, err := ReadDir(dirname) | fnames, err := ReadDir(dirname) | |||
if err != nil { | if err != nil { | |||
errC <- err | errC <- err | |||
return | return | |||
} | } | |||
skipping to change at line 66 | skipping to change at line 72 | |||
if strings.HasSuffix(fname, suffix) { | if strings.HasSuffix(fname, suffix) { | |||
newfnames = append(newfnames, fname) | newfnames = append(newfnames, fname) | |||
} | } | |||
} | } | |||
sort.Strings(newfnames) | sort.Strings(newfnames) | |||
fnames = newfnames | fnames = newfnames | |||
for len(newfnames) > int(max) { | for len(newfnames) > int(max) { | |||
f := filepath.Join(dirname, newfnames[0]) | f := filepath.Join(dirname, newfnames[0]) | |||
l, err := TryLockFile(f, os.O_WRONLY, PrivateFile Mode) | l, err := TryLockFile(f, os.O_WRONLY, PrivateFile Mode) | |||
if err != nil { | if err != nil { | |||
lg.Warn("failed to lock file", zap.String ("path", f), zap.Error(err)) | ||||
break | break | |||
} | } | |||
if err = os.Remove(f); err != nil { | if err = os.Remove(f); err != nil { | |||
lg.Error("failed to remove file", zap.Str ing("path", f), zap.Error(err)) | ||||
errC <- err | errC <- err | |||
return | return | |||
} | } | |||
if err = l.Close(); err != nil { | if err = l.Close(); err != nil { | |||
lg.Warn("failed to unlock/close", zap.Str ing("path", l.Name()), zap.Error(err)) | lg.Error("failed to unlock/close", zap.St ring("path", l.Name()), zap.Error(err)) | |||
errC <- err | errC <- err | |||
return | return | |||
} | } | |||
lg.Info("purged", zap.String("path", f)) | lg.Info("purged", zap.String("path", f)) | |||
newfnames = newfnames[1:] | newfnames = newfnames[1:] | |||
} | } | |||
if purgec != nil { | if purgec != nil { | |||
for i := 0; i < len(fnames)-len(newfnames); i++ { | for i := 0; i < len(fnames)-len(newfnames); i++ { | |||
purgec <- fnames[i] | purgec <- fnames[i] | |||
} | } | |||
End of changes. 4 change blocks. | ||||
1 lines changed or deleted | 9 lines changed or added |