From f864931ab4930c66213266ca6b077db82cbbd1c7 Mon Sep 17 00:00:00 2001 From: Harshavardhana Date: Tue, 26 Jan 2021 10:06:54 -0800 Subject: [PATCH] delete dangling objects automatically --- cmd/erasure-object.go | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) 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) }