diff --git a/cmd/bucket-lifecycle.go b/cmd/bucket-lifecycle.go index 60c961809..eb3af59b3 100644 --- a/cmd/bucket-lifecycle.go +++ b/cmd/bucket-lifecycle.go @@ -660,7 +660,9 @@ func putRestoreOpts(bucket, object string, rreq *RestoreObjectRequest, objInfo O if len(objInfo.UserTags) != 0 { meta[xhttp.AmzObjectTagging] = objInfo.UserTags } - + // Set restore object status + restoreExpiry := lifecycle.ExpectedExpiryTime(time.Now().UTC(), rreq.Days) + meta[xhttp.AmzRestore] = completedRestoreObj(restoreExpiry).String() return ObjectOptions{ Versioned: globalBucketVersioningSys.PrefixEnabled(bucket, object), VersionSuspended: globalBucketVersioningSys.PrefixSuspended(bucket, object), diff --git a/cmd/erasure-object.go b/cmd/erasure-object.go index 4c176d1e1..a4614a53b 100644 --- a/cmd/erasure-object.go +++ b/cmd/erasure-object.go @@ -2006,15 +2006,13 @@ func (er erasureObjects) RestoreTransitionedObject(ctx context.Context, bucket, } // update restore status header in the metadata -func (er erasureObjects) updateRestoreMetadata(ctx context.Context, bucket, object string, objInfo ObjectInfo, opts ObjectOptions, rerr error) error { +func (er erasureObjects) updateRestoreMetadata(ctx context.Context, bucket, object string, objInfo ObjectInfo, opts ObjectOptions) error { oi := objInfo.Clone() oi.metadataOnly = true // Perform only metadata updates. - if rerr == nil { - oi.UserDefined[xhttp.AmzRestore] = completedRestoreObj(opts.Transition.RestoreExpiry).String() - } else { // allow retry in the case of failure to restore - delete(oi.UserDefined, xhttp.AmzRestore) - } + // allow retry in the case of failure to restore + delete(oi.UserDefined, xhttp.AmzRestore) + if _, err := er.CopyObject(ctx, bucket, object, bucket, object, oi, ObjectOptions{ VersionID: oi.VersionID, }, ObjectOptions{ @@ -2030,7 +2028,10 @@ func (er erasureObjects) updateRestoreMetadata(ctx context.Context, bucket, obje // as in the xl.meta for this version and rehydrates the part.n into the fi.DataDir for this version as in the xl.meta func (er erasureObjects) restoreTransitionedObject(ctx context.Context, bucket string, object string, opts ObjectOptions) error { setRestoreHeaderFn := func(oi ObjectInfo, rerr error) error { - er.updateRestoreMetadata(ctx, bucket, object, oi, opts, rerr) + if rerr == nil { + return nil // nothing to do; restore object was successful + } + er.updateRestoreMetadata(ctx, bucket, object, oi, opts) return rerr } var oi ObjectInfo @@ -2054,7 +2055,6 @@ func (er erasureObjects) restoreTransitionedObject(ctx context.Context, bucket s return setRestoreHeaderFn(oi, toObjectErr(err, bucket, object)) } pReader := NewPutObjReader(hashReader) - ropts.UserDefined[xhttp.AmzRestore] = completedRestoreObj(opts.Transition.RestoreExpiry).String() _, err = er.PutObject(ctx, bucket, object, pReader, ropts) return setRestoreHeaderFn(oi, toObjectErr(err, bucket, object)) } diff --git a/cmd/object-handlers.go b/cmd/object-handlers.go index a10a46857..573eb39a3 100644 --- a/cmd/object-handlers.go +++ b/cmd/object-handlers.go @@ -3051,7 +3051,7 @@ func (api objectAPIHandlers) PostRestoreObjectHandler(w http.ResponseWriter, r * } } // set or upgrade restore expiry - restoreExpiry := lifecycle.ExpectedExpiryTime(time.Now(), rreq.Days) + restoreExpiry := lifecycle.ExpectedExpiryTime(time.Now().UTC(), rreq.Days) metadata := cloneMSS(objInfo.UserDefined) // update self with restore metadata