From: fang.yuxiang Date: Thu, 4 May 2017 07:58:37 +0000 (+0800) Subject: rgw: set object accounted size correctly X-Git-Tag: v12.1.0~217^2 X-Git-Url: http://git-server-git.apps.pok.os.sepia.ceph.com/?a=commitdiff_plain;h=539985a99eebdc72c8d2446acc1108664a162f68;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 --- diff --git a/src/rgw/rgw_rados.cc b/src/rgw/rgw_rados.cc index dd09479cb752..15252b8a3936 100644 --- a/src/rgw/rgw_rados.cc +++ b/src/rgw/rgw_rados.cc @@ -8710,13 +8710,14 @@ int RGWRados::get_obj_state_impl(RGWObjectCtx *rctx, const RGWBucketInfo& bucket 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; @@ -8741,6 +8742,8 @@ int RGWRados::get_obj_state_impl(RGWObjectCtx *rctx, const RGWBucketInfo& bucket s->manifest.set_head(bucket_info.placement_rule, 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;