]> git-server-git.apps.pok.os.sepia.ceph.com Git - ceph.git/commitdiff
rgw: set object accounted size correctly 14950/head
authorfang.yuxiang <fang.yuxiang@eisoo.com>
Thu, 4 May 2017 07:58:37 +0000 (15:58 +0800)
committerfang.yuxiang <fang.yuxiang@eisoo.com>
Thu, 25 May 2017 01:21:57 +0000 (09:21 +0800)
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 <fang.yuxiang@eisoo.com>
src/rgw/rgw_rados.cc

index dd09479cb7527f71079f46db39df49a55716c842..15252b8a39365dcbe252f782b5d134e21abb6f37 100644 (file)
@@ -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;