summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorcaleb miles <caselim@gmail.com>2012-12-04 16:36:17 -0500
committerYehuda Sadeh <yehuda@inktank.com>2012-12-13 14:05:56 -0800
commit24523913e3a1fa710e04f63716638418c3640c30 (patch)
tree26d66d6621aded48538faf214ea75a136f8f4545
parentaa2214c36baf3e9fc0e1a0da05fd4d617f9eb28e (diff)
downloadceph-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.h1
-rw-r--r--src/rgw/rgw_op.cc10
-rw-r--r--src/rgw/rgw_op.h2
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);