From 3781a0f9ad47ed77d1050e1b36848e2ebcf73194 Mon Sep 17 00:00:00 2001 From: Poorna Date: Wed, 13 Dec 2023 15:28:55 -0800 Subject: [PATCH] replication: Pass metadata timestamps in CopyObject call (#18647) Regression from #18285. CopyObject options were inheriting source MTime for metadata timestamps if unspecified, removing this prevented metadata updates from being applied on target. --- cmd/bucket-replication.go | 18 ++++++++++++++++++ .../run-multi-site-minio-idp.sh | 6 +++++- 2 files changed, 23 insertions(+), 1 deletion(-) diff --git a/cmd/bucket-replication.go b/cmd/bucket-replication.go index 50f9a2f09..6ef3d3343 100644 --- a/cmd/bucket-replication.go +++ b/cmd/bucket-replication.go @@ -1468,6 +1468,24 @@ func (ri ReplicateObjectInfo) replicateAll(ctx context.Context, objectAPI Object ReplicationRequest: true, // always set this to distinguish between `mc mirror` replication and serverside }, } + if tagTmStr, ok := objInfo.UserDefined[ReservedMetadataPrefixLower+TaggingTimestamp]; ok { + ondiskTimestamp, err := time.Parse(time.RFC3339, tagTmStr) + if err == nil { + dstOpts.Internal.TaggingTimestamp = ondiskTimestamp + } + } + if retTmStr, ok := objInfo.UserDefined[ReservedMetadataPrefixLower+ObjectLockRetentionTimestamp]; ok { + ondiskTimestamp, err := time.Parse(time.RFC3339, retTmStr) + if err == nil { + dstOpts.Internal.RetentionTimestamp = ondiskTimestamp + } + } + if lholdTmStr, ok := objInfo.UserDefined[ReservedMetadataPrefixLower+ObjectLockLegalHoldTimestamp]; ok { + ondiskTimestamp, err := time.Parse(time.RFC3339, lholdTmStr) + if err == nil { + dstOpts.Internal.LegalholdTimestamp = ondiskTimestamp + } + } if _, rinfo.Err = c.CopyObject(ctx, tgt.Bucket, object, tgt.Bucket, object, getCopyObjMetadata(objInfo, tgt.StorageClass), srcOpts, dstOpts); rinfo.Err != nil { rinfo.ReplicationStatus = replication.Failed logger.LogIf(ctx, fmt.Errorf("unable to replicate metadata for object %s/%s(%s): %s", bucket, objInfo.Name, objInfo.VersionID, rinfo.Err)) diff --git a/docs/site-replication/run-multi-site-minio-idp.sh b/docs/site-replication/run-multi-site-minio-idp.sh index eccfeacf4..3cf0202f6 100755 --- a/docs/site-replication/run-multi-site-minio-idp.sh +++ b/docs/site-replication/run-multi-site-minio-idp.sh @@ -253,7 +253,11 @@ if [ $? -ne 0 ]; then exit_1 fi sleep 5 - +val=$(./mc tag list minio1/newbucket/README.md --version-id "${vID}" --json | jq -r .tagset.key) +if [ "${val}" != "val" ]; then + echo "expected bucket tag to have replicated, exiting..." + exit_1 +fi ./mc tag remove --version-id "${vID}" minio2/newbucket/README.md if [ $? -ne 0 ]; then echo "expecting tag removal to be successful. exiting.."