RGWMultiDelDelete *multi_delete;
vector<rgw_obj_key>::iterator iter;
RGWMultiDelXMLParser parser;
- pair<rgw_obj_key, int> result;
int num_processed = 0;
RGWObjectCtx *obj_ctx = (RGWObjectCtx *)s->obj_ctx;
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
bool quiet;
bool status_dumped;
-
public:
RGWDeleteMultiObj() {
ret = 0;
virtual int get_params() = 0;
virtual void send_status() = 0;
virtual void begin_response() = 0;
- virtual void send_partial_response(pair<rgw_obj_key, int>& 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; }
rgw_flush_formatter(s, s->formatter);
}
-void RGWDeleteMultiObj_ObjStore_S3::send_partial_response(pair<rgw_obj_key, int>& 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();
void send_status();
void begin_response();
- void send_partial_response(pair<rgw_obj_key, int>& result);
+ void send_partial_response(rgw_obj_key& key, bool delete_marker,
+ const string& marker_version_id, int ret);
void end_response();
};