diff --git a/cmd/erasure-object.go b/cmd/erasure-object.go index ea8535500..b52490f43 100644 --- a/cmd/erasure-object.go +++ b/cmd/erasure-object.go @@ -365,6 +365,24 @@ func (er erasureObjects) getObjectFileInfo(ctx context.Context, bucket, object s } if reducedErr := reduceReadQuorumErrs(ctx, errs, objectOpIgnoredErrs, readQuorum); reducedErr != nil { + if reducedErr == errErasureReadQuorum && bucket != minioMetaBucket { + if _, ok := isObjectDangling(metaArr, errs, nil); ok { + reducedErr = errFileNotFound + if opts.VersionID != "" { + reducedErr = errFileVersionNotFound + } + // Remove the dangling object only when: + // - This is a non versioned bucket + // - This is a versioned bucket and the version ID is passed, the reason + // is that we cannot fetch the ID of the latest version when we don't trust xl.meta + if !opts.Versioned || opts.VersionID != "" { + er.deleteObjectVersion(ctx, bucket, object, 1, FileInfo{ + Name: object, + VersionID: opts.VersionID, + }) + } + } + } return fi, nil, nil, toObjectErr(reducedErr, bucket, object) }