diff --git a/cmd/xl-v1-object.go b/cmd/xl-v1-object.go index 2c5b575d0..c67ea3760 100644 --- a/cmd/xl-v1-object.go +++ b/cmd/xl-v1-object.go @@ -843,24 +843,27 @@ func (xl xlObjects) DeleteObject(ctx context.Context, bucket, object string) (er return err } - if hasSuffix(object, slashSeparator) { - // Delete the object on all disks. - if err = xl.deleteObject(ctx, bucket, object, len(xl.getDisks())/2+1, true); err != nil { + if !xl.isObject(bucket, object) { + return ObjectNotFound{bucket, object} + } + + var writeQuorum int + var isObjectDir = hasSuffix(object, slashSeparator) + + if isObjectDir { + writeQuorum = len(xl.getDisks())/2 + 1 + } else { + // Read metadata associated with the object from all disks. + partsMetadata, errs := readAllXLMetadata(ctx, xl.getDisks(), bucket, object) + // get Quorum for this object + _, writeQuorum, err = objectQuorumFromMeta(ctx, xl, partsMetadata, errs) + if err != nil { return toObjectErr(err, bucket, object) } } - // Read metadata associated with the object from all disks. - partsMetadata, errs := readAllXLMetadata(ctx, xl.getDisks(), bucket, object) - - // get Quorum for this object - _, writeQuorum, err := objectQuorumFromMeta(ctx, xl, partsMetadata, errs) - if err != nil { - return toObjectErr(err, bucket, object) - } - // Delete the object on all disks. - if err = xl.deleteObject(ctx, bucket, object, writeQuorum, false); err != nil { + if err = xl.deleteObject(ctx, bucket, object, writeQuorum, isObjectDir); err != nil { return toObjectErr(err, bucket, object) } diff --git a/cmd/xl-v1-object_test.go b/cmd/xl-v1-object_test.go index 4a0f90e95..f9e292325 100644 --- a/cmd/xl-v1-object_test.go +++ b/cmd/xl-v1-object_test.go @@ -71,11 +71,14 @@ func TestXLDeleteObjectBasic(t *testing.T) { object string expectedErr error }{ - {".test", "obj", BucketNameInvalid{Bucket: ".test"}}, - {"----", "obj", BucketNameInvalid{Bucket: "----"}}, + {".test", "dir/obj", BucketNameInvalid{Bucket: ".test"}}, + {"----", "dir/obj", BucketNameInvalid{Bucket: "----"}}, {"bucket", "", ObjectNameInvalid{Bucket: "bucket", Object: ""}}, {"bucket", "doesnotexist", ObjectNotFound{Bucket: "bucket", Object: "doesnotexist"}}, - {"bucket", "obj", nil}, + {"bucket", "dir/doesnotexist", ObjectNotFound{Bucket: "bucket", Object: "dir/doesnotexist"}}, + {"bucket", "dir", ObjectNotFound{Bucket: "bucket", Object: "dir"}}, + {"bucket", "dir/", ObjectNotFound{Bucket: "bucket", Object: "dir/"}}, + {"bucket", "dir/obj", nil}, } // Create an instance of xl backend @@ -84,14 +87,13 @@ func TestXLDeleteObjectBasic(t *testing.T) { t.Fatal(err) } - // Make bucket for Test 7 to pass err = xl.MakeBucketWithLocation(context.Background(), "bucket", "") if err != nil { t.Fatal(err) } - // Create object "obj" under bucket "bucket" for Test 7 to pass - _, err = xl.PutObject(context.Background(), "bucket", "obj", mustGetHashReader(t, bytes.NewReader([]byte("abcd")), int64(len("abcd")), "", ""), nil) + // Create object "dir/obj" under bucket "bucket" for Test 7 to pass + _, err = xl.PutObject(context.Background(), "bucket", "dir/obj", mustGetHashReader(t, bytes.NewReader([]byte("abcd")), int64(len("abcd")), "", ""), nil) if err != nil { t.Fatalf("XL Object upload failed: %s", err) }