From 24bf7b7ef14de926f6029fc675ef47814d1ef957 Mon Sep 17 00:00:00 2001 From: Casey Bodley Date: Tue, 24 Oct 2023 16:48:06 -0400 Subject: [PATCH] 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 (cherry picked from commit 526643826246fa8dbe35ea2f65bf9ad0ef9566ff) Conflicts: src/rgw/driver/rados/rgw_rados.cc no req_context --- src/rgw/driver/rados/rgw_rados.cc | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/src/rgw/driver/rados/rgw_rados.cc b/src/rgw/driver/rados/rgw_rados.cc index f6c834c69e2c..10018d4a68a0 100644 --- a/src/rgw/driver/rados/rgw_rados.cc +++ b/src/rgw/driver/rados/rgw_rados.cc @@ -4053,6 +4053,20 @@ int RGWRados::fetch_remote_obj(RGWObjectCtx& obj_ctx, cs_info.blocks = 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(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) { -- 2.47.3