diff options
author | caleb miles <caselim@gmail.com> | 2012-12-04 16:36:17 -0500 |
---|---|---|
committer | Yehuda Sadeh <yehuda@inktank.com> | 2012-12-13 14:05:56 -0800 |
commit | 24523913e3a1fa710e04f63716638418c3640c30 (patch) | |
tree | 26d66d6621aded48538faf214ea75a136f8f4545 | |
parent | aa2214c36baf3e9fc0e1a0da05fd4d617f9eb28e (diff) | |
download | ceph-24523913e3a1fa710e04f63716638418c3640c30.tar.gz |
rgw_op: enforce minimum part size in multi-part uploads
Signed-off-by: caleb miles <caleb.miles@inktank.com>
-rw-r--r-- | src/rgw/rgw_common.h | 1 | ||||
-rw-r--r-- | src/rgw/rgw_op.cc | 10 | ||||
-rw-r--r-- | src/rgw/rgw_op.h | 2 |
3 files changed, 13 insertions, 0 deletions
diff --git a/src/rgw/rgw_common.h b/src/rgw/rgw_common.h index f43a2c78a1f..4b808fcbe74 100644 --- a/src/rgw/rgw_common.h +++ b/src/rgw/rgw_common.h @@ -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 diff --git a/src/rgw/rgw_op.cc b/src/rgw/rgw_op.cc index f87d48b00b4..cfb7d177926 100644 --- a/src/rgw/rgw_op.cc +++ b/src/rgw/rgw_op.cc @@ -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(); diff --git a/src/rgw/rgw_op.h b/src/rgw/rgw_op.h index 652e9c050dc..b3a78846cda 100644 --- a/src/rgw/rgw_op.h +++ b/src/rgw/rgw_op.h @@ -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); |