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")
)