From 2bcd4efe49d5d4bc46e882e496ef338f709d4787 Mon Sep 17 00:00:00 2001 From: Casey Bodley Date: Thu, 29 Sep 2016 17:59:32 -0400 Subject: [PATCH] rgw: add accounted_size to RGWUploadPartInfo and use accounted_size for ListMultipart operations Signed-off-by: Casey Bodley --- src/rgw/rgw_op.cc | 24 ++++-------------------- src/rgw/rgw_rados.h | 8 +++++++- src/rgw/rgw_rest_s3.cc | 2 +- 3 files changed, 12 insertions(+), 22 deletions(-) diff --git a/src/rgw/rgw_op.cc b/src/rgw/rgw_op.cc index e72548ab785bf..95b0c61f4a19c 100644 --- a/src/rgw/rgw_op.cc +++ b/src/rgw/rgw_op.cc @@ -2698,6 +2698,7 @@ int RGWPutObjProcessor_Multipart::do_complete(string& etag, real_time *mtime, re info.num = atoi(part_num.c_str()); info.etag = etag; info.size = s->obj_size; + info.accounted_size = s->obj_size; // TODO info.modified = real_clock::now(); info.manifest = manifest; @@ -4802,6 +4803,7 @@ void RGWCompleteMultipart::execute() bool truncated; RGWCompressionInfo cs_info; bool compressed = false; + uint64_t accounted_size = 0; uint64_t min_part_size = s->cct->_conf->rgw_multipart_min_part_size; @@ -4840,7 +4842,7 @@ void RGWCompleteMultipart::execute() } for (obj_iter = obj_parts.begin(); iter != parts->parts.end() && obj_iter != obj_parts.end(); ++iter, ++obj_iter, ++handled_parts) { - uint64_t part_size = obj_iter->second.size; + uint64_t part_size = obj_iter->second.accounted_size; if (handled_parts < (int)parts->parts.size() - 1 && part_size < min_part_size) { op_ret = -ERR_TOO_SMALL; @@ -4915,6 +4917,7 @@ void RGWCompleteMultipart::execute() remove_objs.push_back(remove_key); ofs += obj_part.size; + accounted_size += obj_part.accounted_size; } } while (truncated); hash.Final((byte *)final_etag); @@ -5014,7 +5017,6 @@ void RGWAbortMultipart::execute() cls_rgw_obj_chain chain; list remove_objs; - uint64_t deleted_size = 0; do { op_ret = list_multipart_parts(store, s, upload_id, meta_oid, max_parts, @@ -5044,24 +5046,6 @@ void RGWAbortMultipart::execute() remove_objs.push_back(key); } } - map attrset; - int y = get_obj_attrs(store, s, obj, attrset); - map::iterator cmp = attrset.find(RGW_ATTR_COMPRESSION); - if (!y && cmp != attrset.end()) { - RGWCompressionInfo cs_info; - bufferlist::iterator bliter = cmp->second.begin(); - try { - ::decode(cs_info, bliter); - if (cs_info.compression_type != "none") - deleted_size += cs_info.orig_size; - else - deleted_size += obj_part.size; - } catch (buffer::error& err) { - ldout(s->cct, 5) << "Failed to get decompressed obj size" << dendl; - deleted_size += obj_part.size; - } - } else - deleted_size += obj_part.size; } } while (truncated); diff --git a/src/rgw/rgw_rados.h b/src/rgw/rgw_rados.h index ba62caee50c4a..788923e972667 100644 --- a/src/rgw/rgw_rados.h +++ b/src/rgw/rgw_rados.h @@ -710,6 +710,7 @@ WRITE_CLASS_ENCODER(RGWObjManifest) struct RGWUploadPartInfo { uint32_t num; uint64_t size; + uint64_t accounted_size{0}; string etag; ceph::real_time modified; RGWObjManifest manifest; @@ -725,6 +726,7 @@ struct RGWUploadPartInfo { ::encode(modified, bl); ::encode(manifest, bl); ::encode(cs_info, bl); + ::encode(accounted_size, bl); ENCODE_FINISH(bl); } void decode(bufferlist::iterator& bl) { @@ -735,8 +737,12 @@ struct RGWUploadPartInfo { ::decode(modified, bl); if (struct_v >= 3) ::decode(manifest, bl); - if (struct_v >= 4) + if (struct_v >= 4) { ::decode(cs_info, bl); + ::decode(accounted_size, bl); + } else { + accounted_size = size; + } DECODE_FINISH(bl); } void dump(Formatter *f) const; diff --git a/src/rgw/rgw_rest_s3.cc b/src/rgw/rgw_rest_s3.cc index c3f2b523b8a1b..5b80dd8a26f5a 100644 --- a/src/rgw/rgw_rest_s3.cc +++ b/src/rgw/rgw_rest_s3.cc @@ -2747,7 +2747,7 @@ void RGWListMultipart_ObjStore_S3::send_response() s->formatter->dump_unsigned("PartNumber", info.num); s->formatter->dump_format("ETag", "\"%s\"", info.etag.c_str()); - s->formatter->dump_unsigned("Size", info.size); + s->formatter->dump_unsigned("Size", info.accounted_size); s->formatter->close_section(); } s->formatter->close_section(); -- 2.39.5