From 9169569360598817fc5814aa90e668734b0e9430 Mon Sep 17 00:00:00 2001 From: Yehuda Sadeh Date: Mon, 22 Dec 2014 16:39:15 -0800 Subject: [PATCH] rgw: multi object delete sends delete marker info The api requires that we send information about whether the operation was on a delete marker (either created or removed), and what was the corresponding version id. Signed-off-by: Yehuda Sadeh --- src/rgw/rgw_op.cc | 15 ++++++++++----- src/rgw/rgw_op.h | 4 ++-- src/rgw/rgw_rest_s3.cc | 25 ++++++++++++++++--------- src/rgw/rgw_rest_s3.h | 3 ++- 4 files changed, 30 insertions(+), 17 deletions(-) diff --git a/src/rgw/rgw_op.cc b/src/rgw/rgw_op.cc index e0c5edeed52c0..644b9fc42172c 100644 --- a/src/rgw/rgw_op.cc +++ b/src/rgw/rgw_op.cc @@ -3235,7 +3235,6 @@ void RGWDeleteMultiObj::execute() RGWMultiDelDelete *multi_delete; vector::iterator iter; RGWMultiDelXMLParser parser; - pair result; int num_processed = 0; RGWObjectCtx *obj_ctx = (RGWObjectCtx *)s->obj_ctx; @@ -3276,17 +3275,23 @@ void RGWDeleteMultiObj::execute() for (iter = multi_delete->objects.begin(); iter != multi_delete->objects.end() && num_processed < max_to_delete; ++iter, num_processed++) { - rgw_obj obj(bucket, *iter); obj_ctx->set_atomic(obj); - ret = store->delete_obj(*obj_ctx, s->bucket_info, obj, s->bucket_info.versioning_status()); + + RGWRados::Object del_target(store, s->bucket_info, *obj_ctx, obj); + RGWRados::Object::Delete del_op(&del_target); + + del_op.params.bucket_owner = s->bucket_owner.get_id(); + del_op.params.versioning_status = s->bucket_info.versioning_status(); + del_op.params.obj_owner = s->owner; + + ret = del_op.delete_obj(); if (ret == -ENOENT) { ret = 0; } - result = make_pair(*iter, ret); - send_partial_response(result); + send_partial_response(*iter, del_op.result.delete_marker, del_op.result.version_id, ret); } /* set the return code to zero, errors at this point will be diff --git a/src/rgw/rgw_op.h b/src/rgw/rgw_op.h index ba6baadfc4ae1..cc8338934e908 100644 --- a/src/rgw/rgw_op.h +++ b/src/rgw/rgw_op.h @@ -984,7 +984,6 @@ protected: bool quiet; bool status_dumped; - public: RGWDeleteMultiObj() { ret = 0; @@ -1001,7 +1000,8 @@ public: virtual int get_params() = 0; virtual void send_status() = 0; virtual void begin_response() = 0; - virtual void send_partial_response(pair& result) = 0; + virtual void send_partial_response(rgw_obj_key& key, bool delete_marker, + const string& marker_version_id, int ret) = 0; virtual void end_response() = 0; virtual const string name() { return "multi_object_delete"; } virtual RGWOpType get_type() { return RGW_OP_DELETE_MULTI_OBJ; } diff --git a/src/rgw/rgw_rest_s3.cc b/src/rgw/rgw_rest_s3.cc index 0506901e3204c..9912408449508 100644 --- a/src/rgw/rgw_rest_s3.cc +++ b/src/rgw/rgw_rest_s3.cc @@ -1840,25 +1840,32 @@ void RGWDeleteMultiObj_ObjStore_S3::begin_response() rgw_flush_formatter(s, s->formatter); } -void RGWDeleteMultiObj_ObjStore_S3::send_partial_response(pair& result) +void RGWDeleteMultiObj_ObjStore_S3::send_partial_response(rgw_obj_key& key, bool delete_marker, + const string& marker_version_id, int ret) { - if (!result.first.empty()) { - if (result.second == 0 && !quiet) { + if (!key.empty()) { + if (ret == 0 && !quiet) { s->formatter->open_object_section("Deleted"); - s->formatter->dump_string("Key", result.first.name); - s->formatter->dump_string("VersionId", result.first.instance); + s->formatter->dump_string("Key", key.name); + if (!key.instance.empty()) { + s->formatter->dump_string("VersionId", key.instance); + } + if (delete_marker) { + s->formatter->dump_bool("DeleteMarker", true); + s->formatter->dump_string("DeleteMarkerVersionId", marker_version_id); + } s->formatter->close_section(); - } else if (result.second < 0) { + } else if (ret < 0) { struct rgw_http_errors r; int err_no; s->formatter->open_object_section("Error"); - err_no = -(result.second); + err_no = -ret; rgw_get_errno_s3(&r, err_no); - s->formatter->dump_string("Key", result.first.name); - s->formatter->dump_string("VersionId", result.first.instance); + s->formatter->dump_string("Key", key.name); + s->formatter->dump_string("VersionId", key.instance); s->formatter->dump_int("Code", r.http_ret); s->formatter->dump_string("Message", r.s3_code); s->formatter->close_section(); diff --git a/src/rgw/rgw_rest_s3.h b/src/rgw/rgw_rest_s3.h index dc9fb8e75aa7b..d32ba5dd94ef9 100644 --- a/src/rgw/rgw_rest_s3.h +++ b/src/rgw/rgw_rest_s3.h @@ -284,7 +284,8 @@ public: void send_status(); void begin_response(); - void send_partial_response(pair& result); + void send_partial_response(rgw_obj_key& key, bool delete_marker, + const string& marker_version_id, int ret); void end_response(); }; -- 2.39.5