From d480022711f508cdbe1c06e44ce1a33d7a07998e Mon Sep 17 00:00:00 2001 From: Harshavardhana Date: Mon, 30 May 2022 12:43:54 -0700 Subject: [PATCH] fix: invalidate outdated disks appropriately during readAllXL (#15002) readAllXL would return inlined data for outdated disks causing "read" to return incorrect content to the client, this PR fixes this behavior by making sure we skip such outdated disks appropriately based on the latest ModTime on the disk. --- cmd/erasure-object.go | 34 +++++++++++++++++++++++++++++----- 1 file changed, 29 insertions(+), 5 deletions(-) diff --git a/cmd/erasure-object.go b/cmd/erasure-object.go index a8a7253a1..91ffbd07d 100644 --- a/cmd/erasure-object.go +++ b/cmd/erasure-object.go @@ -509,23 +509,45 @@ func readAllXL(ctx context.Context, disks []StorageAPI, bucket, object string, r } readQuorum := (len(disks) + 1) / 2 - merged := mergeXLV2Versions(readQuorum, false, 1, metadataShallowVersions...) + meta := &xlMetaV2{versions: mergeXLV2Versions(readQuorum, false, 1, metadataShallowVersions...)} + lfi, err := meta.ToFileInfo(bucket, object, "") + if err != nil { + for i := range errs { + if errs[i] == nil { + errs[i] = err + } + } + return metaFileInfos, errs + } + if !lfi.IsValid() { + for i := range errs { + if errs[i] == nil { + errs[i] = errCorruptedFormat + } + } + return metaFileInfos, errs + } + for index := range metadataArray { if metadataArray[index] == nil { continue } - metadataArray[index].versions = merged - // make sure to preserve this for diskmtime based healing bugfix. diskMTime := metaFileInfos[index].DiskMTime metaFileInfos[index], errs[index] = metadataArray[index].ToFileInfo(bucket, object, "") - if errs[index] == nil { + if errs[index] != nil { + continue + } + + if metaFileInfos[index].IsValid() && metaFileInfos[index].ModTime.Equal(lfi.ModTime) { versionID := metaFileInfos[index].VersionID if versionID == "" { versionID = nullVersionID } - metaFileInfos[index].Data = metadataArray[index].data.find(versionID) + if readData { + metaFileInfos[index].Data = metadataArray[index].data.find(versionID) + } metaFileInfos[index].DiskMTime = diskMTime } } @@ -593,6 +615,8 @@ func (er erasureObjects) getObjectFileInfo(ctx context.Context, bucket, object s if metaArr[i].IsValid() && metaArr[i].ModTime.Equal(fi.ModTime) { continue } + metaArr[i] = FileInfo{} + onlineDisks[i] = nil missingBlocks++ }