From 3308aa67342c660ac36958f8f10a7e4094e7276d Mon Sep 17 00:00:00 2001 From: Yehuda Sadeh Date: Thu, 9 Jun 2011 13:57:30 -0700 Subject: [PATCH] rgw: implement abort multipart upload (not tested yet) --- src/rgw/rgw_op.cc | 44 ++++++++++++++++++++++++++++++++++++++++++ src/rgw/rgw_op.h | 16 +++++++++++++++ src/rgw/rgw_rest.h | 6 ++++++ src/rgw/rgw_rest_s3.cc | 22 ++++++++++++++++++--- src/rgw/rgw_rest_s3.h | 9 +++++++++ 5 files changed, 94 insertions(+), 3 deletions(-) diff --git a/src/rgw/rgw_op.cc b/src/rgw/rgw_op.cc index 0693e5138a4a6..c0c614bdd07f7 100644 --- a/src/rgw/rgw_op.cc +++ b/src/rgw/rgw_op.cc @@ -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 obj_parts; + map::iterator obj_iter; + RGWAccessControlPolicy policy; + map 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 xattrs; diff --git a/src/rgw/rgw_op.h b/src/rgw/rgw_op.h index 8f4ff3e4f837d..7b1c35185483f 100644 --- a/src/rgw/rgw_op.h +++ b/src/rgw/rgw_op.h @@ -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; diff --git a/src/rgw/rgw_rest.h b/src/rgw/rgw_rest.h index de40770067a35..3b541d53a847f 100644 --- a/src/rgw/rgw_rest.h +++ b/src/rgw/rgw_rest.h @@ -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() {} diff --git a/src/rgw/rgw_rest_s3.cc b/src/rgw/rgw_rest_s3.cc index 0b28fc9002b7c..0fe605549f088 100644 --- a/src/rgw/rgw_rest_s3.cc +++ b/src/rgw/rgw_rest_s3.cc @@ -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; diff --git a/src/rgw/rgw_rest_s3.h b/src/rgw/rgw_rest_s3.h index dae597c5aa4b3..18cf4ff749e81 100644 --- a/src/rgw/rgw_rest_s3.h +++ b/src/rgw/rgw_rest_s3.h @@ -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: -- 2.39.5