From 893b506c83d8e0723aebd2d1eddab4609ca121fc Mon Sep 17 00:00:00 2001 From: Pavel Pogodaev Date: Mon, 10 Feb 2025 14:10:32 +0300 Subject: [PATCH] [#626] Fix ALREADY REMOVED response status code Signed-off-by: Pavel Pogodaev --- api/handler/get_test.go | 22 ++++++++++++++++++---- api/layer/object.go | 6 +++--- api/layer/tree/tree_service.go | 3 --- 3 files changed, 21 insertions(+), 10 deletions(-) diff --git a/api/handler/get_test.go b/api/handler/get_test.go index 01806429d..3521c5ef6 100644 --- a/api/handler/get_test.go +++ b/api/handler/get_test.go @@ -198,16 +198,30 @@ func TestGetObject(t *testing.T) { } func TestGetDeletedObject(t *testing.T) { - hc := prepareHandlerContext(t) + hc := prepareHandlerContextWithMinCache(t) bktName, objName := "bucket", "obj" - _, objInfo := createVersionedBucketAndObject(hc.t, hc, bktName, objName) + bktInfo, objInfo := createVersionedBucketAndObject(hc.t, hc, bktName, objName) putObject(hc, bktName, objName) checkFound(hc.t, hc, bktName, objName, objInfo.VersionID()) checkFound(hc.t, hc, bktName, objName, emptyVersion) - deleteObject(hc.t, hc, bktName, objName, emptyVersion) - getObjectAssertS3Error(hc, bktName, objName, emptyVersion, apierr.ErrNoSuchKey) + + addr := getAddressOfLastVersion(hc, bktInfo, objName) + t.Run("not found error", func(_ *testing.T) { + hc.tp.SetObjectError(addr, &apistatus.ObjectNotFound{}) + hc.tp.SetObjectError(objInfo.Address(), &apistatus.ObjectNotFound{}) + + getObjectAssertS3Error(hc, bktName, objName, objInfo.VersionID(), apierr.ErrNoSuchVersion) + getObjectAssertS3Error(hc, bktName, objName, emptyVersion, apierr.ErrNoSuchKey) + }) + t.Run("already removed error", func(_ *testing.T) { + hc.tp.SetObjectError(addr, &apistatus.ObjectAlreadyRemoved{}) + hc.tp.SetObjectError(objInfo.Address(), &apistatus.ObjectAlreadyRemoved{}) + + getObjectAssertS3Error(hc, bktName, objName, objInfo.VersionID(), apierr.ErrNoSuchVersion) + getObjectAssertS3Error(hc, bktName, objName, emptyVersion, apierr.ErrNoSuchKey) + }) } func TestGetObjectEnabledMD5(t *testing.T) { diff --git a/api/layer/object.go b/api/layer/object.go index 9bdb2e891..ed9f13390 100644 --- a/api/layer/object.go +++ b/api/layer/object.go @@ -410,7 +410,7 @@ func (n *Layer) headLastVersionIfNotDeleted(ctx context.Context, bkt *data.Bucke meta, err := n.objectHead(ctx, bkt, node.OID) if err != nil { - if client.IsErrObjectNotFound(err) { + if client.IsErrObjectNotFound(err) || client.IsErrObjectAlreadyRemoved(err) { return nil, fmt.Errorf("%w: %s; %s", apierr.GetAPIError(apierr.ErrNoSuchKey), err.Error(), node.OID.EncodeToString()) } return nil, err @@ -434,7 +434,7 @@ func (n *Layer) headVersion(ctx context.Context, bkt *data.BucketInfo, p *HeadOb if p.VersionID == data.UnversionedObjectVersionID { foundVersion, err = n.treeService.GetUnversioned(ctx, bkt, p.Object) if err != nil { - if errors.Is(err, tree.ErrNodeNotFound) || errors.Is(err, tree.ErrAlreadyRemoved) { + if errors.Is(err, tree.ErrNodeNotFound) { return nil, fmt.Errorf("%w: %s", apierr.GetAPIError(apierr.ErrNoSuchVersion), err.Error()) } return nil, err @@ -467,7 +467,7 @@ func (n *Layer) headVersion(ctx context.Context, bkt *data.BucketInfo, p *HeadOb meta, err := n.objectHead(ctx, bkt, foundVersion.OID) if err != nil { - if client.IsErrObjectNotFound(err) { + if client.IsErrObjectNotFound(err) || client.IsErrObjectAlreadyRemoved(err) { return nil, fmt.Errorf("%w: %s", apierr.GetAPIError(apierr.ErrNoSuchVersion), err.Error()) } return nil, err diff --git a/api/layer/tree/tree_service.go b/api/layer/tree/tree_service.go index 9cd91eb2f..db079b104 100644 --- a/api/layer/tree/tree_service.go +++ b/api/layer/tree/tree_service.go @@ -82,7 +82,4 @@ var ( // ErrNoNodeToRemove is returned from Tree service in case of the lack of node with OID to remove. ErrNoNodeToRemove = errors.New("no node to remove") - - // ErrAlreadyRemoved is returned from Tree service in case of removed object. - ErrAlreadyRemoved = errors.New("already removed") )