]> git-server-git.apps.pok.os.sepia.ceph.com Git - ceph.git/commitdiff
RGW: Multipart upload may double the quota 18121/head
authorgaosibei <gaosb@inspur.com>
Tue, 26 Sep 2017 02:44:09 +0000 (10:44 +0800)
committerMatt Benjamin <mbenjamin@redhat.com>
Wed, 4 Oct 2017 22:48:24 +0000 (18:48 -0400)
Fixes: http://tracker.ceph.com/issues/21586
Signed-off-by: Sibei Gao <gaosb@inspur.com>
(cherry picked from commit 97f95e457fb7f9e36031f41e0f2dd3955daedd87)
Signed-off-by: Matt Benjamin <mbenjamin@redhat.com>
src/rgw/rgw_op.cc
src/rgw/rgw_rados.cc
src/rgw/rgw_rados.h

index 0f5c74ce2222aa0db3690da8161eae5155972eb6..44f6cdb135675b5122c82f384d5e8d8d4fa7386f 100644 (file)
@@ -4370,6 +4370,7 @@ void RGWCompleteMultipart::execute()
   obj_op.meta.ptag = &s->req_id; /* use req_id as operation tag */
   obj_op.meta.owner = s->owner.get_id();
   obj_op.meta.flags = PUT_OBJ_CREATE;
+  obj_op.meta.completeMultipart = true;
 
   op_ret = obj_op.write_meta(ofs, attrs);
   if (op_ret < 0)
index 401955a3e647572c00ebbac039947d7be701cb77..0f1dabd34c26066bc279dddda21c5cef8399bc32 100644 (file)
@@ -6373,7 +6373,11 @@ int RGWRados::Object::Write::write_meta(uint64_t size,
   meta.canceled = false;
 
   /* update quota cache */
-  store->quota_handler->update_stats(meta.owner, bucket, (orig_exists ? 0 : 1), size, orig_size);
+  if (meta.completeMultipart) {
+         store->quota_handler->update_stats(meta.owner, bucket, (orig_exists ? 0 : 1), 0, orig_size);
+  } else {
+         store->quota_handler->update_stats(meta.owner, bucket, (orig_exists ? 0 : 1), size, orig_size);
+  }
 
   return 0;
 
index b2e82c6c4dd741cbbfe6ea6deb2206b0e86b2404..738f4126a494cecdd080a528b5112d31bce02124 100644 (file)
@@ -2330,10 +2330,11 @@ public:
         ceph::real_time delete_at;
         bool canceled;
         const string *user_data;
+        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) {}
+                      if_match(NULL), if_nomatch(NULL), olh_epoch(0), canceled(false), user_data(nullptr), completeMultipart(false) {}
       } meta;
 
       explicit Write(RGWRados::Object *_target) : target(_target) {}