From a9d9b520ecf184b00daba5b3887b1f2fa25d114c Mon Sep 17 00:00:00 2001 From: Harshavardhana Date: Mon, 26 Jul 2021 16:51:09 -0700 Subject: [PATCH] remove short circuited healing optimization (#12796) this healing optimization caused multiple regressions in healing - delete-markers incorrectly missing heal and returning incorrect healing results to client. - missing individual 'parts' such as for restored object or simply for all objects just missing few parts. This optimization is not necessary, we should proceed to verify all cases possible not just when metadata is inconsistent. --- cmd/erasure-healing-common.go | 29 ----------------------------- cmd/erasure-healing.go | 11 +---------- 2 files changed, 1 insertion(+), 39 deletions(-) diff --git a/cmd/erasure-healing-common.go b/cmd/erasure-healing-common.go index b12ec67a2..d3cc7bf39 100644 --- a/cmd/erasure-healing-common.go +++ b/cmd/erasure-healing-common.go @@ -189,35 +189,6 @@ func getLatestFileInfo(ctx context.Context, partsMetadata []FileInfo, errs []err return latestFileInfo, nil } -// fileInfoConsistent whether all fileinfos are consistent with each other. -// Will return false if any fileinfo mismatches. -func fileInfoConsistent(ctx context.Context, partsMetadata []FileInfo, errs []error) bool { - // There should be atleast half correct entries, if not return failure - if reducedErr := reduceReadQuorumErrs(ctx, errs, nil, len(partsMetadata)/2); reducedErr != nil { - return false - } - if len(partsMetadata) == 1 { - return true - } - // Reference - ref := partsMetadata[0] - if !ref.IsValid() { - return false - } - for _, meta := range partsMetadata[1:] { - if !meta.IsValid() { - return false - } - if !meta.ModTime.Equal(ref.ModTime) { - return false - } - if meta.DataDir != ref.DataDir { - return false - } - } - return true -} - // disksWithAllParts - This function needs to be called with // []StorageAPI returned by listOnlineDisks. Returns, // diff --git a/cmd/erasure-healing.go b/cmd/erasure-healing.go index ec11c692d..35b6fa75c 100644 --- a/cmd/erasure-healing.go +++ b/cmd/erasure-healing.go @@ -907,7 +907,7 @@ func (er erasureObjects) HealObject(ctx context.Context, bucket, object, version // Perform quick read without lock. // This allows to quickly check if all is ok or all are missing. - partsMetadata, errs := readAllFileInfo(healCtx, storageDisks, bucket, object, versionID, false) + _, errs := readAllFileInfo(healCtx, storageDisks, bucket, object, versionID, false) if isAllNotFound(errs) { err = toObjectErr(errFileNotFound, bucket, object) if versionID != "" { @@ -918,15 +918,6 @@ func (er erasureObjects) HealObject(ctx context.Context, bucket, object, version errs, bucket, object, versionID), err } - // Return early if all ok and not deep scanning. - if opts.ScanMode == madmin.HealNormalScan && fileInfoConsistent(ctx, partsMetadata, errs) { - fi, err := getLatestFileInfo(ctx, partsMetadata, errs) - if err == nil && fi.VersionID == versionID { - return er.defaultHealResult(fi, storageDisks, storageEndpoints, - errs, bucket, object, versionID), nil - } - } - // Heal the object. return er.healObject(healCtx, bucket, object, versionID, opts) }