]> git.apps.os.sepia.ceph.com Git - ceph.git/commitdiff
rgw_op: enforce minimum part size in multi-part uploads
authorcaleb miles <caselim@gmail.com>
Tue, 4 Dec 2012 21:36:17 +0000 (16:36 -0500)
committerYehuda Sadeh <yehuda@inktank.com>
Thu, 13 Dec 2012 22:05:56 +0000 (14:05 -0800)
Signed-off-by: caleb miles <caleb.miles@inktank.com>
src/rgw/rgw_common.h
src/rgw/rgw_op.cc
src/rgw/rgw_op.h

index f43a2c78a1f3f5d6ec70da5e4faa4da6ea607432..4b808fcbe745f657240f785dc81537d3ed392667 100644 (file)
@@ -61,6 +61,7 @@ using ceph::crypto::MD5;
 #define RGW_MAX_CHUNK_SIZE     (512*1024)
 #define RGW_MAX_PENDING_CHUNKS  16
 #define RGW_MAX_PUT_SIZE        (5ULL*1024*1024*1024)
+#define RGW_MIN_MULTIPART_SIZE (5ULL*1024*1024)
 
 #define RGW_FORMAT_PLAIN        0
 #define RGW_FORMAT_XML          1
index f87d48b00b45912bafb14974d0339882c93894c7..cfb7d177926f513331eab2cdbc4fd4ad5c17caf5 100644 (file)
@@ -1163,6 +1163,7 @@ class RGWPutObjProcessor_Multipart : public RGWPutObjProcessor_Atomic
 {
   string part_num;
   RGWMPObj mp;
+
 protected:
   bool immutable_head() { return true; }
   int prepare(RGWRados *store, struct req_state *s);
@@ -1185,6 +1186,7 @@ int RGWPutObjProcessor_Multipart::prepare(RGWRados *store, struct req_state *s)
   if (part_num.empty()) {
     return -EINVAL;
   }
+
   oid = mp.get_part(part_num);
 
   head_obj.init_ns(s->bucket, oid, mp_ns);
@@ -1965,6 +1967,14 @@ void RGWCompleteMultipart::execute()
     return;
   }
 
+  // ensure that each part if of the minimum size
+  for (obj_iter = obj_parts.begin(); obj_iter != obj_parts.end(); ++obj_iter) {
+    if ((obj_iter->second).size < min_part_size) {
+      ret = -ERR_TOO_SMALL;
+      return;
+    }
+  }
+
   mp.init(s->object_str, upload_id);
   meta_oid = mp.get_meta();
 
index 652e9c050dc44c73659159958fb6dc868aa85895..b3a78846cda8a5380b42106d0d6e944187d0b08b 100644 (file)
@@ -528,12 +528,14 @@ protected:
   string etag;
   char *data;
   int len;
+  uint64_t min_part_size;
 
 public:
   RGWCompleteMultipart() {
     ret = 0;
     data = NULL;
     len = 0;
+    min_part_size = RGW_MIN_MULTIPART_SIZE;
   }
   virtual ~RGWCompleteMultipart() {
     free(data);