Skip to content

Commit 3dc654e

Browse files
committed
fix: Modified DeleteObject error handling to return a successful response when versionId is not specified, and to return InvalidVersionId error when it is specified, in cases where versioning is enabled.
1 parent 034a820 commit 3dc654e

File tree

3 files changed

+38
-5
lines changed

3 files changed

+38
-5
lines changed

backend/posix/posix.go

+6-5
Original file line numberDiff line numberDiff line change
@@ -2158,6 +2158,10 @@ func (p *Posix) DeleteObject(ctx context.Context, input *s3.DeleteObjectInput) (
21582158
if getString(input.VersionId) == "" {
21592159
// if the versionId is not specified, make the current version a delete marker
21602160
fi, err := os.Stat(objpath)
2161+
if errors.Is(err, fs.ErrNotExist) {
2162+
// AWS returns success if the object does not exist
2163+
return &s3.DeleteObjectOutput{}, nil
2164+
}
21612165
if errors.Is(err, syscall.ENAMETOOLONG) {
21622166
return nil, s3err.GetAPIError(s3err.ErrKeyTooLong)
21632167
}
@@ -2193,7 +2197,7 @@ func (p *Posix) DeleteObject(ctx context.Context, input *s3.DeleteObjectInput) (
21932197
versionPath := p.genObjVersionPath(bucket, object)
21942198

21952199
vId, err := p.meta.RetrieveAttribute(bucket, object, versionIdKey)
2196-
if err != nil && !errors.Is(err, meta.ErrNoSuchKey) {
2200+
if err != nil && !errors.Is(err, meta.ErrNoSuchKey) && !errors.Is(err, fs.ErrNotExist) {
21972201
return nil, fmt.Errorf("get obj versionId: %w", err)
21982202
}
21992203

@@ -2292,10 +2296,7 @@ func (p *Posix) DeleteObject(ctx context.Context, input *s3.DeleteObjectInput) (
22922296
return nil, s3err.GetAPIError(s3err.ErrKeyTooLong)
22932297
}
22942298
if errors.Is(err, fs.ErrNotExist) {
2295-
return &s3.DeleteObjectOutput{
2296-
DeleteMarker: &isDelMarker,
2297-
VersionId: input.VersionId,
2298-
}, nil
2299+
return nil, s3err.GetAPIError(s3err.ErrInvalidVersionId)
22992300
}
23002301
if err != nil {
23012302
return nil, fmt.Errorf("delete object: %w", err)

tests/integration/group-tests.go

+2
Original file line numberDiff line numberDiff line change
@@ -537,6 +537,7 @@ func TestVersioning(s *S3Conf) {
537537
Versioning_GetObject_delete_marker(s)
538538
// DeleteObject(s) actions
539539
Versioning_DeleteObject_delete_object_version(s)
540+
Versioning_DeleteObject_non_existing_object(s)
540541
Versioning_DeleteObject_delete_a_delete_marker(s)
541542
Versioning_DeleteObjects_success(s)
542543
Versioning_DeleteObjects_delete_deleteMarkers(s)
@@ -884,6 +885,7 @@ func GetIntTests() IntTests {
884885
"Versioning_GetObject_success": Versioning_GetObject_success,
885886
"Versioning_GetObject_delete_marker": Versioning_GetObject_delete_marker,
886887
"Versioning_DeleteObject_delete_object_version": Versioning_DeleteObject_delete_object_version,
888+
"Versioning_DeleteObject_non_existing_object": Versioning_DeleteObject_non_existing_object,
887889
"Versioning_DeleteObject_delete_a_delete_marker": Versioning_DeleteObject_delete_a_delete_marker,
888890
"Versioning_DeleteObjects_success": Versioning_DeleteObjects_success,
889891
"Versioning_DeleteObjects_delete_deleteMarkers": Versioning_DeleteObjects_delete_deleteMarkers,

tests/integration/tests.go

+30
Original file line numberDiff line numberDiff line change
@@ -10927,6 +10927,36 @@ func Versioning_DeleteObject_delete_object_version(s *S3Conf) error {
1092710927
}, withVersioning())
1092810928
}
1092910929

10930+
func Versioning_DeleteObject_non_existing_object(s *S3Conf) error {
10931+
testName := "Versioning_DeleteObject_non_existing_object"
10932+
return actionHandler(s, testName, func(s3client *s3.Client, bucket string) error {
10933+
obj := "my-obj"
10934+
10935+
ctx, canel := context.WithTimeout(context.Background(), shortTimeout)
10936+
_, err := s3client.DeleteObject(ctx, &s3.DeleteObjectInput{
10937+
Bucket: &bucket,
10938+
Key: &obj,
10939+
})
10940+
canel()
10941+
if err != nil {
10942+
return err
10943+
}
10944+
10945+
ctx, canel = context.WithTimeout(context.Background(), shortTimeout)
10946+
_, err = s3client.DeleteObject(ctx, &s3.DeleteObjectInput{
10947+
Bucket: &bucket,
10948+
Key: &obj,
10949+
VersionId: getPtr("non_existing_version_id"),
10950+
})
10951+
canel()
10952+
if err := checkApiErr(err, s3err.GetAPIError(s3err.ErrInvalidVersionId)); err != nil {
10953+
return err
10954+
}
10955+
10956+
return nil
10957+
}, withVersioning())
10958+
}
10959+
1093010960
func Versioning_DeleteObject_delete_a_delete_marker(s *S3Conf) error {
1093110961
testName := "Versioning_DeleteObject_delete_a_delete_marker"
1093210962
return actionHandler(s, testName, func(s3client *s3.Client, bucket string) error {

0 commit comments

Comments
 (0)