From 7472818d940356070e98098ba574a153e2448556 Mon Sep 17 00:00:00 2001 From: Klaus Post Date: Wed, 1 Nov 2023 09:09:28 -0700 Subject: [PATCH] Fix hanging scanner saves (#18368) Fix various regressions from #18029 * If context is canceled the token is never returned. This will lead to scanner being unable to save and deadlocking. * Fix backup not being able to get any data (hr empty) * Reduce backup timeout. --- cmd/data-usage-cache.go | 19 +++++++------------ 1 file changed, 7 insertions(+), 12 deletions(-) diff --git a/cmd/data-usage-cache.go b/cmd/data-usage-cache.go index c97fb57f6..65fa6eb78 100644 --- a/cmd/data-usage-cache.go +++ b/cmd/data-usage-cache.go @@ -985,15 +985,10 @@ func (d *dataUsageCache) save(ctx context.Context, store objectIO, name string) return ctx.Err() case maxConcurrentScannerSaves <- struct{}{}: } - defer func() { - select { - case <-ctx.Done(): - case <-maxConcurrentScannerSaves: - } - }() buf := bytebufferpool.Get() defer func() { + <-maxConcurrentScannerSaves buf.Reset() bytebufferpool.Put(buf) }() @@ -1002,12 +997,12 @@ func (d *dataUsageCache) save(ctx context.Context, store objectIO, name string) return err } - hr, err := hash.NewReader(ctx, bytes.NewReader(buf.Bytes()), int64(buf.Len()), "", "", int64(buf.Len())) - if err != nil { - return err - } - save := func(name string, timeout time.Duration) error { + hr, err := hash.NewReader(ctx, bytes.NewReader(buf.Bytes()), int64(buf.Len()), "", "", int64(buf.Len())) + if err != nil { + return err + } + // Abandon if more than a minute, so we don't hold up scanner. ctx, cancel := context.WithTimeout(ctx, timeout) defer cancel() @@ -1022,7 +1017,7 @@ func (d *dataUsageCache) save(ctx context.Context, store objectIO, name string) } return err } - defer save(name+".bkp", 30*time.Second) // Keep a backup as well + defer save(name+".bkp", 5*time.Second) // Keep a backup as well // drive timeout by default is 2 minutes, we do not need to wait longer. return save(name, time.Minute)