From: fang.yuxiang Date: Thu, 4 May 2017 07:58:37 +0000 (+0800) Subject: rgw: set object accounted size correctly X-Git-Tag: v11.2.1~41^2 X-Git-Url: http://git-server-git.apps.pok.os.sepia.ceph.com/?a=commitdiff_plain;h=refs%2Fpull%2F16179%2Fhead;p=ceph.git rgw: set object accounted size correctly sometimes, object accounted size is set wrong, because we don't konw the object size if don't resort to the compression info or manifest. e.g, when i use s3cmd do copy object(bucket_A/obj_A -> bucket_B/obj_B, assume the size of obj_A is 4M). then i use s3cmd do list bucket, I got obj_B size is 512K, it is the head size apparently. Fixes: http://tracker.ceph.com/issues/20071 Signed-off-by: fang yuxiang (cherry picked from commit 539985a99eebdc72c8d2446acc1108664a162f68) --- diff --git a/src/rgw/rgw_rados.cc b/src/rgw/rgw_rados.cc index 3335689472b..c32ab40684b 100644 --- a/src/rgw/rgw_rados.cc +++ b/src/rgw/rgw_rados.cc @@ -8536,13 +8536,14 @@ int RGWRados::get_obj_state_impl(RGWObjectCtx *rctx, rgw_obj& obj, RGWObjState * s->accounted_size = s->size; auto iter = s->attrset.find(RGW_ATTR_COMPRESSION); - if (iter != s->attrset.end()) { + const bool compressed = (iter != s->attrset.end()); + if (compressed) { // use uncompressed size for accounted_size try { RGWCompressionInfo info; auto p = iter->second.begin(); ::decode(info, p); - s->accounted_size = info.orig_size; + s->accounted_size = info.orig_size; } catch (buffer::error&) { dout(0) << "ERROR: could not decode compression info for object: " << obj << dendl; return -EIO; @@ -8567,6 +8568,8 @@ int RGWRados::get_obj_state_impl(RGWObjectCtx *rctx, rgw_obj& obj, RGWObjState * s->manifest.set_head(obj, s->size); /* patch manifest to reflect the head we just read, some manifests might be broken due to old bugs */ s->size = s->manifest.get_obj_size(); + if (!compressed) + s->accounted_size = s->size; } catch (buffer::error& err) { ldout(cct, 0) << "ERROR: couldn't decode manifest" << dendl; return -EIO;