From: Richard Bai(白学余) Date: Tue, 13 Aug 2019 12:56:55 +0000 (+0800) Subject: rgw: when you abort a multipart upload request, the quota will not update X-Git-Tag: v15.1.0~84^2 X-Git-Url: http://git-server-git.apps.pok.os.sepia.ceph.com/?a=commitdiff_plain;h=f61fda5d1b572828750d53b487e0aa7cfabdf2a8;p=ceph.git rgw: when you abort a multipart upload request, the quota will not update Fixes: https://tracker.ceph.com/issues/41606 Signed-off-by: Richard Bai(白学余) --- diff --git a/src/rgw/rgw_multi.cc b/src/rgw/rgw_multi.cc index f06818155e9..8bdff30fbb7 100644 --- a/src/rgw/rgw_multi.cc +++ b/src/rgw/rgw_multi.cc @@ -212,6 +212,7 @@ int abort_multipart_upload(RGWRados *store, CephContext *cct, bool truncated; int marker = 0; int ret; + uint64_t parts_accounted_size = 0; do { ret = list_multipart_parts(store, bucket_info, cct, @@ -248,6 +249,7 @@ int abort_multipart_upload(RGWRados *store, CephContext *cct, remove_objs.push_back(key); } } + parts_accounted_size += obj_part.accounted_size; } } while (truncated); @@ -265,6 +267,9 @@ int abort_multipart_upload(RGWRados *store, CephContext *cct, if (!remove_objs.empty()) { del_op.params.remove_objs = &remove_objs; } + + del_op.params.abortmp = true; + del_op.params.parts_accounted_size = parts_accounted_size; // and also remove the metadata obj ret = del_op.delete_obj(null_yield); diff --git a/src/rgw/rgw_rados.cc b/src/rgw/rgw_rados.cc index 12e74eb7c58..bac3fac32c3 100644 --- a/src/rgw/rgw_rados.cc +++ b/src/rgw/rgw_rados.cc @@ -4771,6 +4771,10 @@ int RGWRados::Object::Delete::delete_obj(optional_yield y) } uint64_t obj_accounted_size = state->accounted_size; + if(params.abortmp) { + obj_accounted_size = params.parts_accounted_size; + } + if (!real_clock::is_zero(params.expiration_time)) { bufferlist bl; real_time delete_at; diff --git a/src/rgw/rgw_rados.h b/src/rgw/rgw_rados.h index d5963429dc4..a4434931c0a 100644 --- a/src/rgw/rgw_rados.h +++ b/src/rgw/rgw_rados.h @@ -814,8 +814,10 @@ public: ceph::real_time mtime; /* for setting delete marker mtime */ bool high_precision_time; rgw_zone_set *zones_trace; + bool abortmp; + uint64_t parts_accounted_size; - DeleteParams() : versioning_status(0), olh_epoch(0), bilog_flags(0), remove_objs(NULL), high_precision_time(false), zones_trace(nullptr) {} + DeleteParams() : versioning_status(0), olh_epoch(0), bilog_flags(0), remove_objs(NULL), high_precision_time(false), zones_trace(nullptr), abortmp(false), parts_accounted_size(0) {} } params; struct DeleteResult {