From fe45086a54d76cd9b913663d4537b36a8a276ed4 Mon Sep 17 00:00:00 2001 From: gaosibei Date: Tue, 26 Sep 2017 10:44:09 +0800 Subject: [PATCH] RGW: Multipart upload may double the quota Fixes: http://tracker.ceph.com/issues/21586 Signed-off-by: Sibei Gao (cherry picked from commit 97f95e457fb7f9e36031f41e0f2dd3955daedd87) --- src/rgw/rgw_op.cc | 1 + src/rgw/rgw_rados.cc | 10 ++++++++-- src/rgw/rgw_rados.h | 3 ++- 3 files changed, 11 insertions(+), 3 deletions(-) diff --git a/src/rgw/rgw_op.cc b/src/rgw/rgw_op.cc index f7e5caf67f51d..d517827ce399f 100644 --- a/src/rgw/rgw_op.cc +++ b/src/rgw/rgw_op.cc @@ -5508,6 +5508,7 @@ void RGWCompleteMultipart::execute() obj_op.meta.owner = s->owner.get_id(); obj_op.meta.flags = PUT_OBJ_CREATE; obj_op.meta.modify_tail = true; + obj_op.meta.completeMultipart = true; op_ret = obj_op.write_meta(ofs, accounted_size, attrs); if (op_ret < 0) return; diff --git a/src/rgw/rgw_rados.cc b/src/rgw/rgw_rados.cc index 5544b4e6038fd..d16123c5d54af 100644 --- a/src/rgw/rgw_rados.cc +++ b/src/rgw/rgw_rados.cc @@ -7009,8 +7009,14 @@ int RGWRados::Object::Write::_do_write_meta(uint64_t size, uint64_t accounted_si meta.canceled = false; /* update quota cache */ - store->quota_handler->update_stats(meta.owner, obj.bucket, (orig_exists ? 0 : 1), - accounted_size, orig_size); + if (meta.completeMultipart){ + store->quota_handler->update_stats(meta.owner, obj.bucket, (orig_exists ? 0 : 1), + 0, orig_size); + } + else { + store->quota_handler->update_stats(meta.owner, obj.bucket, (orig_exists ? 0 : 1), + accounted_size, orig_size); + } return 0; done_cancel: diff --git a/src/rgw/rgw_rados.h b/src/rgw/rgw_rados.h index 6984192f0f497..a9eb64c44521b 100644 --- a/src/rgw/rgw_rados.h +++ b/src/rgw/rgw_rados.h @@ -2809,11 +2809,12 @@ public: const string *user_data; rgw_zone_set *zones_trace; bool modify_tail; + bool completeMultipart; MetaParams() : mtime(NULL), rmattrs(NULL), data(NULL), manifest(NULL), ptag(NULL), remove_objs(NULL), category(RGW_OBJ_CATEGORY_MAIN), flags(0), if_match(NULL), if_nomatch(NULL), olh_epoch(0), canceled(false), user_data(nullptr), zones_trace(nullptr), - modify_tail(false) {} + modify_tail(false), completeMultipart(false) {} } meta; explicit Write(RGWRados::Object *_target) : target(_target) {} -- 2.39.5