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: v14.2.10~227^2 X-Git-Url: http://git-server-git.apps.pok.os.sepia.ceph.com/?a=commitdiff_plain;h=cb485e6593c76e8e05ebbc7e4ffb1e8a05957b83;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(白学余) (cherry picked from commit f61fda5d1b572828750d53b487e0aa7cfabdf2a8) --- diff --git a/src/rgw/rgw_multi.cc b/src/rgw/rgw_multi.cc index 437ceea94c9..d055d98b4ba 100644 --- a/src/rgw/rgw_multi.cc +++ b/src/rgw/rgw_multi.cc @@ -235,6 +235,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, @@ -271,6 +272,7 @@ int abort_multipart_upload(RGWRados *store, CephContext *cct, remove_objs.push_back(key); } } + parts_accounted_size += obj_part.accounted_size; } } while (truncated); @@ -288,6 +290,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(); diff --git a/src/rgw/rgw_rados.cc b/src/rgw/rgw_rados.cc index 0921e596d34..8129ca9c4d9 100644 --- a/src/rgw/rgw_rados.cc +++ b/src/rgw/rgw_rados.cc @@ -5517,6 +5517,10 @@ int RGWRados::Object::Delete::delete_obj() } 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 deb8b55328d..69ee29ebf99 100644 --- a/src/rgw/rgw_rados.h +++ b/src/rgw/rgw_rados.h @@ -1643,8 +1643,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 {