From b120bcb60a2a1e645e55dffff686b02e7fb24eec Mon Sep 17 00:00:00 2001 From: Harshavardhana Date: Mon, 6 Dec 2021 02:59:51 -0800 Subject: [PATCH] validate if cached value is empty before use (#13830) fixes a crash reproduced while running hadoop tests ``` goroutine 201564 [running]: github.com/minio/minio/cmd.metaCacheEntries.resolve({0xc0206ab7a0, 0x4, 0xc0015b1908}, 0xc0212a7040) github.com/minio/minio/cmd/metacache-entries.go:352 +0x58a ``` Bonus: HeadBucket() should always provide content-type --- cmd/bucket-handlers.go | 2 +- cmd/erasure-server-pool.go | 4 +++- cmd/metacache-entries.go | 8 +++++++- 3 files changed, 11 insertions(+), 3 deletions(-) diff --git a/cmd/bucket-handlers.go b/cmd/bucket-handlers.go index cc0910eab..fb5ec3f25 100644 --- a/cmd/bucket-handlers.go +++ b/cmd/bucket-handlers.go @@ -1210,7 +1210,7 @@ func (api objectAPIHandlers) HeadBucketHandler(w http.ResponseWriter, r *http.Re return } - writeSuccessResponseHeadersOnly(w) + writeResponse(w, http.StatusOK, nil, mimeXML) } // DeleteBucketHandler - Delete bucket diff --git a/cmd/erasure-server-pool.go b/cmd/erasure-server-pool.go index 47855dffd..eb8a2b3ef 100644 --- a/cmd/erasure-server-pool.go +++ b/cmd/erasure-server-pool.go @@ -1131,7 +1131,9 @@ func (z *erasureServerPools) ListObjects(ctx context.Context, bucket, prefix, ma } merged, err := z.listPath(ctx, &opts) if err != nil && err != io.EOF { - logger.LogIf(ctx, err) + if !isErrBucketNotFound(err) { + logger.LogIf(ctx, err) + } return loi, err } diff --git a/cmd/metacache-entries.go b/cmd/metacache-entries.go index a9ae288fc..1cba84526 100644 --- a/cmd/metacache-entries.go +++ b/cmd/metacache-entries.go @@ -307,7 +307,7 @@ func (m metaCacheEntries) resolve(r *metadataResolutionParams) (selected *metaCa // shallow decode. xl, err := entry.xlmeta() if err != nil { - logger.LogIf(context.Background(), err) + logger.LogIf(GlobalContext, err) continue } objsValid++ @@ -339,11 +339,17 @@ func (m metaCacheEntries) resolve(r *metadataResolutionParams) (selected *metaCa if objsValid < r.objQuorum { return nil, false } + // If all objects agree. if selected != nil && objsAgree == objsValid { return selected, true } + // If cached is nil we shall skip the entry. + if selected.cached == nil { + return nil, false + } + // Merge if we have disagreement. // Create a new merged result. selected = &metaCacheEntry{