From fa68a4ce40176278faa45f51dac2f51a505a22e2 Mon Sep 17 00:00:00 2001 From: Marina Biryukova Date: Tue, 23 Jul 2024 18:12:16 +0300 Subject: [PATCH] [#412] Store creation epoch of delete markers Signed-off-by: Marina Biryukova --- api/handler/delete.go | 28 +++++++++++++++++++++------- api/layer/layer.go | 24 ++++++++++++++++++------ 2 files changed, 39 insertions(+), 13 deletions(-) diff --git a/api/handler/delete.go b/api/handler/delete.go index dab05b1a..fe2be328 100644 --- a/api/handler/delete.go +++ b/api/handler/delete.go @@ -81,10 +81,17 @@ func (h *handler) DeleteObjectHandler(w http.ResponseWriter, r *http.Request) { return } + networkInfo, err := h.obj.GetNetworkInfo(ctx) + if err != nil { + h.logAndSendError(w, "could not get network info", reqInfo, err) + return + } + p := &layer.DeleteObjectParams{ - BktInfo: bktInfo, - Objects: versionedObject, - Settings: bktSettings, + BktInfo: bktInfo, + Objects: versionedObject, + Settings: bktSettings, + NetworkInfo: networkInfo, } deletedObjects := h.obj.DeleteObjects(ctx, p) deletedObject := deletedObjects[0] @@ -181,11 +188,18 @@ func (h *handler) DeleteMultipleObjectsHandler(w http.ResponseWriter, r *http.Re return } + networkInfo, err := h.obj.GetNetworkInfo(ctx) + if err != nil { + h.logAndSendError(w, "could not get network info", reqInfo, err) + return + } + p := &layer.DeleteObjectParams{ - BktInfo: bktInfo, - Objects: toRemove, - Settings: bktSettings, - IsMultiple: true, + BktInfo: bktInfo, + Objects: toRemove, + Settings: bktSettings, + NetworkInfo: networkInfo, + IsMultiple: true, } deletedObjects := h.obj.DeleteObjects(ctx, p) diff --git a/api/layer/layer.go b/api/layer/layer.go index a4b6a7cb..8b510280 100644 --- a/api/layer/layer.go +++ b/api/layer/layer.go @@ -124,10 +124,11 @@ type ( } DeleteObjectParams struct { - BktInfo *data.BucketInfo - Objects []*VersionedObject - Settings *data.BucketSettings - IsMultiple bool + BktInfo *data.BucketInfo + Objects []*VersionedObject + Settings *data.BucketSettings + NetworkInfo netmap.NetworkInfo + IsMultiple bool } // PutSettingsParams stores object copy request parameters. @@ -545,7 +546,8 @@ func getRandomOID() (oid.ID, error) { return objID, nil } -func (n *Layer) deleteObject(ctx context.Context, bkt *data.BucketInfo, settings *data.BucketSettings, obj *VersionedObject) *VersionedObject { +func (n *Layer) deleteObject(ctx context.Context, bkt *data.BucketInfo, settings *data.BucketSettings, obj *VersionedObject, + networkInfo netmap.NetworkInfo) *VersionedObject { if len(obj.VersionID) != 0 || settings.Unversioned() { var nodeVersions []*data.NodeVersion if nodeVersions, obj.Error = n.getNodeVersionsToDelete(ctx, bkt, obj); obj.Error != nil { @@ -627,6 +629,7 @@ func (n *Layer) deleteObject(ctx context.Context, bkt *data.BucketInfo, settings Created: &now, Owner: &n.gateOwner, IsDeleteMarker: true, + CreationEpoch: networkInfo.CurrentEpoch(), }, IsUnversioned: settings.VersioningSuspended(), } @@ -769,7 +772,7 @@ func (n *Layer) removeCombinedObject(ctx context.Context, bkt *data.BucketInfo, // DeleteObjects from the storage. func (n *Layer) DeleteObjects(ctx context.Context, p *DeleteObjectParams) []*VersionedObject { for i, obj := range p.Objects { - p.Objects[i] = n.deleteObject(ctx, p.BktInfo, p.Settings, obj) + p.Objects[i] = n.deleteObject(ctx, p.BktInfo, p.Settings, obj, p.NetworkInfo) if p.IsMultiple && p.Objects[i].Error != nil { n.reqLogger(ctx).Error(logs.CouldntDeleteObject, zap.String("object", obj.String()), zap.Error(p.Objects[i].Error)) } @@ -849,3 +852,12 @@ func (n *Layer) DeleteBucket(ctx context.Context, p *DeleteBucketParams) error { return nil } + +func (n *Layer) GetNetworkInfo(ctx context.Context) (netmap.NetworkInfo, error) { + networkInfo, err := n.frostFS.NetworkInfo(ctx) + if err != nil { + return networkInfo, fmt.Errorf("get network info: %w", err) + } + + return networkInfo, nil +}