From 7d70afc937ac0125496c5bde2f0e5b1029b704d1 Mon Sep 17 00:00:00 2001 From: Harshavardhana Date: Mon, 6 Dec 2021 15:55:29 -0800 Subject: [PATCH] fix: potential crash in diskCache when fileScorer is empty (#13850) ``` goroutine 115 [running]: github.com/minio/minio/cmd.(*diskCache).purge.func3({0xc007a10a40, 0x40}, 0x40) github.com/minio/minio/cmd/disk-cache-backend.go:430 +0x90d ``` --- cmd/disk-cache-backend.go | 14 +++++++------- cmd/disk-cache-utils.go | 3 +++ 2 files changed, 10 insertions(+), 7 deletions(-) diff --git a/cmd/disk-cache-backend.go b/cmd/disk-cache-backend.go index e3730866f..10db2f555 100644 --- a/cmd/disk-cache-backend.go +++ b/cmd/disk-cache-backend.go @@ -325,7 +325,11 @@ func (c *diskCache) purge(ctx context.Context) { expiry := UTCNow().Add(-cacheExpiryDays) // defaulting max hits count to 100 // ignore error we know what value we are passing. - scorer, _ := newFileScorer(toFree, time.Now().Unix(), 100) + scorer, err := newFileScorer(toFree, time.Now().Unix(), 100) + if err != nil { + logger.LogIf(ctx, err) + return + } // this function returns FileInfo for cached range files. fiStatRangesFn := func(ranges map[string]string, pathPrefix string) map[string]os.FileInfo { @@ -388,9 +392,7 @@ func (c *diskCache) purge(ctx context.Context) { switch { case cc != nil: if cc.isStale(objInfo.ModTime) { - if err = removeAll(cacheDir); err != nil { - logger.LogIf(ctx, err) - } + removeAll(cacheDir) scorer.adjustSaveBytes(-objInfo.Size) // break early if sufficient disk space reclaimed. if c.diskUsageLow() { @@ -408,9 +410,7 @@ func (c *diskCache) purge(ctx context.Context) { for fname, fi := range cachedRngFiles { if cc != nil { if cc.isStale(objInfo.ModTime) { - if err = removeAll(fname); err != nil { - logger.LogIf(ctx, err) - } + removeAll(fname) scorer.adjustSaveBytes(-fi.Size()) // break early if sufficient disk space reclaimed. diff --git a/cmd/disk-cache-utils.go b/cmd/disk-cache-utils.go index d1f1f435e..2b184a042 100644 --- a/cmd/disk-cache-utils.go +++ b/cmd/disk-cache-utils.go @@ -419,6 +419,9 @@ func (f *fileScorer) addFileWithObjInfo(objInfo ObjectInfo, hits int) { // Returns true if there still is a need to delete files (n+saveBytes >0), // false if no more bytes needs to be saved. func (f *fileScorer) adjustSaveBytes(n int64) bool { + if f == nil { + return false + } if int64(f.saveBytes)+n <= 0 { f.saveBytes = 0 f.trimQueue()