From: Casey Bodley Date: Tue, 24 Oct 2023 20:48:06 +0000 (-0400) Subject: rgw: fetch_remote_obj() uses uncompressed size for encrypted objects X-Git-Tag: v19.0.0~157^2 X-Git-Url: http://git-server-git.apps.pok.os.sepia.ceph.com/?a=commitdiff_plain;h=526643826246fa8dbe35ea2f65bf9ad0ef9566ff;p=ceph.git rgw: fetch_remote_obj() uses uncompressed size for encrypted objects use the original size from RGW_ATTR_COMPRESSION as the accounted size in the bucket index for objects that were transferred in their encrypted/compressed form Fixes: https://tracker.ceph.com/issues/63306 Signed-off-by: Casey Bodley --- diff --git a/src/rgw/driver/rados/rgw_rados.cc b/src/rgw/driver/rados/rgw_rados.cc index b72bf3a856b8..b935610f9ad5 100644 --- a/src/rgw/driver/rados/rgw_rados.cc +++ b/src/rgw/driver/rados/rgw_rados.cc @@ -4293,6 +4293,20 @@ int RGWRados::fetch_remote_obj(RGWObjectCtx& obj_ctx, cs_info.blocks = std::move(compressor->get_compression_blocks()); encode(cs_info, tmp); cb.get_attrs()[RGW_ATTR_COMPRESSION] = tmp; + } else if (auto c = cb.get_attrs().find(RGW_ATTR_COMPRESSION); + c != cb.get_attrs().end()) { + // if the object was transferred in its compressed+encrypted form, use its + // original uncompressed size + try { + RGWCompressionInfo info; + auto p = c->second.cbegin(); + decode(info, p); + accounted_size = info.orig_size; + } catch (const buffer::error&) { + ldpp_dout(rctx.dpp, 0) << "ERROR: could not decode compression attr for " + "replicated object " << dest_obj << dendl; + // decode error isn't fatal, but we might put the wrong size in the index + } } if (override_owner) {