]> git.apps.os.sepia.ceph.com Git - ceph.git/commitdiff
rgw: multi object delete sends delete marker info
authorYehuda Sadeh <yehuda@redhat.com>
Tue, 23 Dec 2014 00:39:15 +0000 (16:39 -0800)
committerYehuda Sadeh <yehuda@redhat.com>
Mon, 19 Jan 2015 23:58:00 +0000 (15:58 -0800)
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 <yehuda@redhat.com>
src/rgw/rgw_op.cc
src/rgw/rgw_op.h
src/rgw/rgw_rest_s3.cc
src/rgw/rgw_rest_s3.h

index e0c5edeed52c0ab2facf79eca43d3344f8a18cc7..644b9fc42172c9502bb8ecd59731cf0818d1ff06 100644 (file)
@@ -3235,7 +3235,6 @@ void RGWDeleteMultiObj::execute()
   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;
 
@@ -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
index ba6baadfc4ae191daa72f6d0a9a8bd9a504061d6..cc8338934e9081ad0e820ae74b376205c50f034a 100644 (file)
@@ -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<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; }
index 0506901e3204c6e40651bfc03e18056a997ad3f9..9912408449508a135a21061bf6343ba3416e8302 100644 (file)
@@ -1840,25 +1840,32 @@ void RGWDeleteMultiObj_ObjStore_S3::begin_response()
   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();
index dc9fb8e75aa7b3a8edd32b4b0b5c6be0493cad2c..d32ba5dd94ef969b1240e77a5c2509ed673859e3 100644 (file)
@@ -284,7 +284,8 @@ public:
 
   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();
 };