From 7e266293e6c565c4f08c177de9f03ac8033748fa Mon Sep 17 00:00:00 2001 From: Harshavardhana Date: Mon, 25 Jan 2021 14:04:41 -0800 Subject: [PATCH] fix: notify bucket replication after replication/ilm (#11343) --- cmd/bucket-lifecycle.go | 22 ++++++++---------- cmd/bucket-replication.go | 48 +++++++++++++++++++-------------------- 2 files changed, 32 insertions(+), 38 deletions(-) diff --git a/cmd/bucket-lifecycle.go b/cmd/bucket-lifecycle.go index 0e11deef8..db040d283 100644 --- a/cmd/bucket-lifecycle.go +++ b/cmd/bucket-lifecycle.go @@ -284,19 +284,17 @@ func deleteTransitionedObject(ctx context.Context, objectAPI ObjectLayer, bucket if isDeleteTierOnly { return nil } - _, err = objectAPI.DeleteObject(ctx, bucket, object, opts) + + objInfo, err := objectAPI.DeleteObject(ctx, bucket, object, opts) if err != nil { return err } + eventName := event.ObjectRemovedDelete if lcOpts.DeleteMarker { eventName = event.ObjectRemovedDeleteMarkerCreated } - objInfo := ObjectInfo{ - Name: object, - VersionID: lcOpts.VersionID, - DeleteMarker: lcOpts.DeleteMarker, - } + // Notify object deleted event. sendEvent(eventArgs{ EventName: eventName, @@ -358,19 +356,17 @@ func transitionObject(ctx context.Context, objectAPI ObjectLayer, objInfo Object opts.TransitionStatus = lifecycle.TransitionComplete eventName := event.ObjectTransitionComplete - _, err = objectAPI.DeleteObject(ctx, oi.Bucket, oi.Name, opts) + objInfo, err = objectAPI.DeleteObject(ctx, oi.Bucket, oi.Name, opts) if err != nil { eventName = event.ObjectTransitionFailed } + // Notify object deleted event. sendEvent(eventArgs{ EventName: eventName, - BucketName: oi.Bucket, - Object: ObjectInfo{ - Name: oi.Name, - VersionID: opts.VersionID, - }, - Host: "Internal: [ILM-Transition]", + BucketName: objInfo.Bucket, + Object: objInfo, + Host: "Internal: [ILM-Transition]", }) return err } diff --git a/cmd/bucket-replication.go b/cmd/bucket-replication.go index a2d584a19..ad5a2143d 100644 --- a/cmd/bucket-replication.go +++ b/cmd/bucket-replication.go @@ -251,37 +251,31 @@ func replicateDelete(ctx context.Context, dobj DeletedObjectVersionInfo, objectA versionPurgeStatus = Complete } } + var eventName = event.ObjectReplicationComplete if replicationStatus == string(replication.Failed) || versionPurgeStatus == Failed { eventName = event.ObjectReplicationFailed } - objInfo := ObjectInfo{ - Name: dobj.ObjectName, - DeleteMarker: dobj.DeleteMarker, - VersionID: versionID, - ReplicationStatus: replication.StatusType(dobj.DeleteMarkerReplicationStatus), - VersionPurgeStatus: versionPurgeStatus, - } - - eventArg := &eventArgs{ - BucketName: bucket, - Object: objInfo, - Host: "Internal: [Replication]", - EventName: eventName, - } - sendEvent(*eventArg) // Update metadata on the delete marker or purge permanent delete if replication success. - if _, err = objectAPI.DeleteObject(ctx, bucket, dobj.ObjectName, ObjectOptions{ + objInfo, err := objectAPI.DeleteObject(ctx, bucket, dobj.ObjectName, ObjectOptions{ VersionID: versionID, DeleteMarker: dobj.DeleteMarker, DeleteMarkerReplicationStatus: replicationStatus, Versioned: globalBucketVersioningSys.Enabled(bucket), VersionPurgeStatus: versionPurgeStatus, VersionSuspended: globalBucketVersioningSys.Suspended(bucket), - }); err != nil { + }) + if err != nil { logger.LogIf(ctx, fmt.Errorf("Unable to update replication metadata for %s/%s %s: %w", bucket, dobj.ObjectName, dobj.VersionID, err)) } + + sendEvent(eventArgs{ + BucketName: bucket, + Object: objInfo, + Host: "Internal: [Replication]", + EventName: eventName, + }) } func getCopyObjMetadata(oi ObjectInfo, dest replication.Destination) map[string]string { @@ -511,6 +505,7 @@ func replicateObject(ctx context.Context, objInfo ObjectInfo, objectAPI ObjectLa } r.Close() } + objInfo.UserDefined[xhttp.AmzBucketReplicationStatus] = replicationStatus.String() if objInfo.UserTags != "" { objInfo.UserDefined[xhttp.AmzObjectTagging] = objInfo.UserTags @@ -524,20 +519,23 @@ func replicateObject(ctx context.Context, objInfo ObjectInfo, objectAPI ObjectLa if replicationStatus == replication.Failed { eventName = event.ObjectReplicationFailed } + + objInfo.metadataOnly = true // Perform only metadata updates. + objInfo, err = objectAPI.CopyObject(ctx, bucket, object, bucket, object, objInfo, ObjectOptions{ + VersionID: objInfo.VersionID, + }, ObjectOptions{ + VersionID: objInfo.VersionID, + }) + if err != nil { + logger.LogIf(ctx, fmt.Errorf("Unable to update replication metadata for %s: %s", objInfo.VersionID, err)) + } + sendEvent(eventArgs{ EventName: eventName, BucketName: bucket, Object: objInfo, Host: "Internal: [Replication]", }) - objInfo.metadataOnly = true // Perform only metadata updates. - if _, err = objectAPI.CopyObject(ctx, bucket, object, bucket, object, objInfo, ObjectOptions{ - VersionID: objInfo.VersionID, - }, ObjectOptions{ - VersionID: objInfo.VersionID, - }); err != nil { - logger.LogIf(ctx, fmt.Errorf("Unable to update replication metadata for %s: %s", objInfo.VersionID, err)) - } } // filterReplicationStatusMetadata filters replication status metadata for COPY