diff --git a/api/handler/get_test.go b/api/handler/get_test.go index 01806429..3521c5ef 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 9bdb2e89..ed9f1339 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 9cd91eb2..db079b10 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") )