From beec37797dbeaee3861265969350e64282ab715a Mon Sep 17 00:00:00 2001
From: Pavel Pogodaev
Date: Fri, 7 Feb 2025 14:50:05 +0300
Subject: [PATCH] [#626] Fix ALREADY REMOVED response status code
Signed-off-by: Pavel Pogodaev
---
api/handler/get_test.go | 13 +++++++++++++
api/layer/object.go | 2 +-
api/layer/tree/tree_service.go | 3 +++
3 files changed, 17 insertions(+), 1 deletion(-)
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")
)