From 7b81967a3cbf6189039988d58e38502cf1320b02 Mon Sep 17 00:00:00 2001 From: Krishnan Parthasarathi Date: Wed, 16 Mar 2022 16:59:43 -0700 Subject: [PATCH] Fix handling of object versions pending purge (#14555) - GetObject() with vid should return 405 - GetObject() without vid should return 404 - ListObjects() should ignore this object if this is the "latest" version of the object - ListObjectVersions() should list this object as "DELETE marker" - Remove data parts before sync'ing the version pending purge --- cmd/bucket-replication.go | 4 ++-- cmd/erasure-object.go | 5 ----- cmd/xl-storage-format-v2.go | 3 ++- 3 files changed, 4 insertions(+), 8 deletions(-) diff --git a/cmd/bucket-replication.go b/cmd/bucket-replication.go index e6d3db98a..29e934386 100644 --- a/cmd/bucket-replication.go +++ b/cmd/bucket-replication.go @@ -425,7 +425,7 @@ func replicateDelete(ctx context.Context, dobj DeletedObjectReplicationInfo, obj wg.Add(1) go func(index int, tgt *TargetClient) { defer wg.Done() - rinfo := replicateDeleteToTarget(ctx, dobj, objectAPI, tgt) + rinfo := replicateDeleteToTarget(ctx, dobj, tgt) rinfos.Targets[index] = rinfo }(idx, tgt) } @@ -482,7 +482,7 @@ func replicateDelete(ctx context.Context, dobj DeletedObjectReplicationInfo, obj } } -func replicateDeleteToTarget(ctx context.Context, dobj DeletedObjectReplicationInfo, objectAPI ObjectLayer, tgt *TargetClient) (rinfo replicatedTargetInfo) { +func replicateDeleteToTarget(ctx context.Context, dobj DeletedObjectReplicationInfo, tgt *TargetClient) (rinfo replicatedTargetInfo) { versionID := dobj.DeleteMarkerVersionID if versionID == "" { versionID = dobj.VersionID diff --git a/cmd/erasure-object.go b/cmd/erasure-object.go index 71fb01f21..5f3ae0566 100644 --- a/cmd/erasure-object.go +++ b/cmd/erasure-object.go @@ -493,11 +493,6 @@ func (er erasureObjects) getObjectInfo(ctx context.Context, bucket, object strin return objInfo, toObjectErr(err, bucket, object) } objInfo = fi.ToObjectInfo(bucket, object) - if opts.VersionID != "" && !fi.VersionPurgeStatus().Empty() { - // Make sure to return object info to provide extra information. - return objInfo, toObjectErr(errMethodNotAllowed, bucket, object) - } - if fi.Deleted { if opts.VersionID == "" || opts.DeleteMarker { return objInfo, toObjectErr(errFileNotFound, bucket, object) diff --git a/cmd/xl-storage-format-v2.go b/cmd/xl-storage-format-v2.go index 6d4a4b7d3..2e5ea3d0c 100644 --- a/cmd/xl-storage-format-v2.go +++ b/cmd/xl-storage-format-v2.go @@ -595,6 +595,7 @@ func (j xlMetaV2Object) ToFileInfo(volume, path string) (FileInfo, error) { } } fi.ReplicationState = getInternalReplicationState(fi.Metadata) + fi.Deleted = !fi.VersionPurgeStatus().Empty() replStatus := fi.ReplicationState.CompositeReplicationStatus() if replStatus != "" { fi.Metadata[xhttp.AmzBucketReplicationStatus] = string(replStatus) @@ -1281,7 +1282,7 @@ func (x *xlMetaV2) DeleteVersion(fi FileInfo) (string, error) { ver.ObjectV2.MetaSys[k] = []byte(v) } err = x.setIdx(i, *ver) - return "", err + return uuid.UUID(ver.ObjectV2.DataDir).String(), err } } }