cache: fix test flakiness by stopping the chunk cleaner promptly
The background chunk cleaner slept for the whole ChunkCleanInterval (default 1 minute) before checking its stop channel, and only ran CleanUpCache via the select default branch. This meant a cache that had been stopped by StopBackgroundRunners could keep running CleanUpCache for up to an interval afterwards. The cache backend tests all share a single on-disk chunk store (the TestInternalCache remote), so a lingering cleaner from a finished test could call CleanChunksBySize and os.RemoveAll chunks that a later, unrelated test had just written. The later test would then read a chunk back and get an unexpected EOF - eg TestInternalMaxChunkSizeRespected failing intermittently on CI. Wait on a timer and the stop channel together so a stop is honoured immediately and the cleaner can never run again once stopped.
This commit is contained in:
Vendored
+6
-2
@@ -503,15 +503,19 @@ func NewFs(ctx context.Context, name, rootPath string, m configmap.Mapper) (fs.F
|
|||||||
}
|
}
|
||||||
|
|
||||||
go func() {
|
go func() {
|
||||||
|
// Wait on the timer and the stop channel together so that a stop
|
||||||
|
// signalled by StopBackgroundRunners is honoured immediately.
|
||||||
|
timer := time.NewTimer(time.Duration(f.opt.ChunkCleanInterval))
|
||||||
|
defer timer.Stop()
|
||||||
for {
|
for {
|
||||||
time.Sleep(time.Duration(f.opt.ChunkCleanInterval))
|
|
||||||
select {
|
select {
|
||||||
case <-f.cleanupChan:
|
case <-f.cleanupChan:
|
||||||
fs.Infof(f, "stopping cleanup")
|
fs.Infof(f, "stopping cleanup")
|
||||||
return
|
return
|
||||||
default:
|
case <-timer.C:
|
||||||
fs.Debugf(f, "starting cleanup")
|
fs.Debugf(f, "starting cleanup")
|
||||||
f.CleanUpCache(false)
|
f.CleanUpCache(false)
|
||||||
|
timer.Reset(time.Duration(f.opt.ChunkCleanInterval))
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}()
|
}()
|
||||||
|
|||||||
Reference in New Issue
Block a user