diff --git a/api/handler/get_test.go b/api/handler/get_test.go index f55ab5ab..01806429 100644 --- a/api/handler/get_test.go +++ b/api/handler/get_test.go @@ -197,6 +197,19 @@ func TestGetObject(t *testing.T) { getObjectAssertS3Error(hc, bktName, objName, emptyVersion, apierr.ErrNoSuchKey) } +func TestGetDeletedObject(t *testing.T) { + hc := prepareHandlerContext(t) + bktName, objName := "bucket", "obj" + _, 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) +} + func TestGetObjectEnabledMD5(t *testing.T) { hc := prepareHandlerContext(t) bktName, objName := "bucket", "obj" diff --git a/api/layer/object.go b/api/layer/object.go index c76c91e9..9bdb2e89 100644 --- a/api/layer/object.go +++ b/api/layer/object.go @@ -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) { + if errors.Is(err, tree.ErrNodeNotFound) || errors.Is(err, tree.ErrAlreadyRemoved) { 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 db079b10..9cd91eb2 100644 --- a/api/layer/tree/tree_service.go +++ b/api/layer/tree/tree_service.go @@ -82,4 +82,7 @@ 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") )