]> git.apps.os.sepia.ceph.com Git - ceph.git/commitdiff
rgw: implement abort multipart upload
authorYehuda Sadeh <yehuda@hq.newdream.net>
Thu, 9 Jun 2011 20:57:30 +0000 (13:57 -0700)
committerYehuda Sadeh <yehuda@hq.newdream.net>
Thu, 9 Jun 2011 20:57:30 +0000 (13:57 -0700)
(not tested yet)

src/rgw/rgw_op.cc
src/rgw/rgw_op.h
src/rgw/rgw_rest.h
src/rgw/rgw_rest_s3.cc
src/rgw/rgw_rest_s3.h

index 0693e5138a4a683b09fb54d9fdf5d3e418a09cda..c0c614bdd07f72fe6abc42a5d4f56d32064cc81a 100644 (file)
@@ -1059,6 +1059,50 @@ done:
   send_response();
 }
 
+void RGWAbortMultipart::execute()
+{
+  ret = -EINVAL;
+  string upload_id = s->args.get("uploadId");
+  string oid, meta_oid;
+  string prefix;
+  map<uint32_t, RGWUploadPartInfo> obj_parts;
+  map<uint32_t, RGWUploadPartInfo>::iterator obj_iter;
+  RGWAccessControlPolicy policy;
+  map<string, bufferlist> attrs;
+  rgw_obj meta_obj;
+
+  if (upload_id.empty() || s->object_str.empty())
+    goto done;
+
+  ret = get_multiparts_info(s, oid, obj_parts, policy, attrs);
+  if (ret < 0)
+    goto done;
+
+  oid = s->object;
+  oid.append(".");
+  oid.append(upload_id);
+  meta_oid = oid;
+  prefix = oid;
+  prefix.append(".");
+
+  for (obj_iter = obj_parts.begin(); obj_iter != obj_parts.end(); ++obj_iter) {
+    oid = prefix;
+    char buf[16];
+    snprintf(buf, sizeof(buf), "%d", obj_iter->second.num);
+    oid.append(buf);
+    rgw_obj obj(s->bucket_str, oid, s->object_str, mp_ns);
+    ret = rgwstore->delete_obj(s->user.user_id, obj);
+    if (ret < 0 && ret != -ENOENT)
+      goto done;
+  }
+  // and also remove the metadata obj
+  meta_obj.init(s->bucket_str, meta_oid, s->object_str, mp_ns);
+  ret = rgwstore->delete_obj(s->user.user_id, meta_obj);
+done:
+
+  send_response();
+}
+
 void RGWListMultipart::execute()
 {
   map<string, bufferlist> xattrs;
index 8f4ff3e4f837d07d93f9342bfe2ccf6505d03094..7b1c35185483f09583d3ba36dc75719117ab49db 100644 (file)
@@ -373,6 +373,22 @@ public:
   virtual void send_response() = 0;
 };
 
+class RGWAbortMultipart : public RGWOp {
+protected:
+  int ret;
+
+public:
+  RGWAbortMultipart() {}
+
+  virtual void init(struct req_state *s) {
+    RGWOp::init(s);
+    ret = 0;
+  }
+  void execute();
+
+  virtual void send_response() = 0;
+};
+
 class RGWListMultipart : public RGWOp {
 protected:
   int ret;
index de40770067a359f5b445589dc9f57c15b79b2f9e..3b541d53a847fcc8ddaedc6d09cdafedae17e186 100644 (file)
@@ -104,6 +104,12 @@ public:
   int get_params();
 };
 
+class RGWAbortMultipart_REST : public RGWAbortMultipart {
+public:
+  RGWAbortMultipart_REST() {}
+  ~RGWAbortMultipart_REST() {}
+};
+
 class RGWListMultipart_REST : public RGWListMultipart {
 public:
   RGWListMultipart_REST() {}
index 0b28fc9002b7c1fe1b2c006b3e5f94db52fc034b..0fe605549f0881dee2b739c51cb1ca7d605f0d1e 100644 (file)
@@ -281,6 +281,17 @@ void RGWCompleteMultipart_REST_S3::send_response()
   }
 }
 
+void RGWAbortMultipart_REST_S3::send_response()
+{
+  int r = ret;
+  if (!r)
+    r = 204;
+
+  set_req_state_err(s, r);
+  dump_errno(s);
+  end_header(s);
+}
+
 void RGWListMultipart_REST_S3::send_response()
 {
   if (ret)
@@ -379,9 +390,14 @@ RGWOp *RGWHandler_REST_S3::get_create_op(struct req_state *s)
 
 RGWOp *RGWHandler_REST_S3::get_delete_op(struct req_state *s)
 {
-  if (s->object)
-    return &delete_obj_op;
-  else if (s->bucket)
+  string upload_id = s->args.get("uploadId");
+
+  if (s->object) {
+    if (upload_id.empty())
+      return &delete_obj_op;
+    else
+      return &abort_multipart;
+  } else if (s->bucket)
     return &delete_bucket_op;
 
   return NULL;
index dae597c5aa4b3022b9c7997b19d7e7d2141750ca..18cf4ff749e81a107a1c0241327b0eeb148e0a09 100644 (file)
@@ -105,6 +105,14 @@ public:
   void send_response();
 };
 
+class RGWAbortMultipart_REST_S3 : public RGWAbortMultipart_REST {
+public:
+  RGWAbortMultipart_REST_S3() {}
+  ~RGWAbortMultipart_REST_S3() {}
+
+  void send_response();
+};
+
 class RGWListMultipart_REST_S3 : public RGWListMultipart_REST {
 public:
   RGWListMultipart_REST_S3() {}
@@ -126,6 +134,7 @@ class RGWHandler_REST_S3 : public RGWHandler_REST {
   RGWPutACLs_REST_S3 put_acls_op;
   RGWInitMultipart_REST_S3 init_multipart;
   RGWCompleteMultipart_REST_S3 complete_multipart;
+  RGWCompleteMultipart_REST_S3 abort_multipart;
   RGWListMultipart_REST_S3 list_multipart;
 
 protected: