From bf1769d3e035ff48c721232b2a1da9fa5d4a4677 Mon Sep 17 00:00:00 2001 From: Anis Eleuch Date: Tue, 21 May 2024 15:36:21 +0100 Subject: [PATCH] xl: Avoid marking a drive offline after one part read failure (#19779) This commit will fix one rare case of a multipart object that can be read in theory but GetObject API returned an error. It turned out that a six years old code was marking a drive offline when the bitrot streaming fails to read a part in a disk with any error. This can affect reading a subsequent part, though having enough shards, but unable to construct because one drive was marked offline earlier. This commit will remove the drive marking offline code. It will also close the bitrotstreaming reader before marking it as nil. --- cmd/erasure-decode.go | 3 +++ cmd/erasure-object.go | 5 ----- 2 files changed, 3 insertions(+), 5 deletions(-) diff --git a/cmd/erasure-decode.go b/cmd/erasure-decode.go index 0ac308e72..6f3ecab02 100644 --- a/cmd/erasure-decode.go +++ b/cmd/erasure-decode.go @@ -202,6 +202,9 @@ func (p *parallelReader) Read(dst [][]byte) ([][]byte, error) { // This will be communicated upstream. p.orgReaders[bufIdx] = nil + if br, ok := p.readers[i].(io.Closer); ok { + br.Close() + } p.readers[i] = nil // Since ReadAt returned error, trigger another read. diff --git a/cmd/erasure-object.go b/cmd/erasure-object.go index 9506e93e6..864d19e47 100644 --- a/cmd/erasure-object.go +++ b/cmd/erasure-object.go @@ -425,11 +425,6 @@ func (er erasureObjects) getObjectWithFileInfo(ctx context.Context, bucket, obje return toObjectErr(err, bucket, object) } } - for i, r := range readers { - if r == nil { - onlineDisks[i] = OfflineDisk - } - } // Track total bytes read from disk and written to the client. totalBytesRead += partLength // partOffset will be valid only for the first part, hence reset it to 0 for