From: Seena Fallah Date: Sat, 7 Jun 2025 23:12:48 +0000 (+0200) Subject: rgw: set compression attrs in copy_obj_data() X-Git-Url: http://git-server-git.apps.pok.os.sepia.ceph.com/?a=commitdiff_plain;h=a5f45165a6daa6b1f738e2771a4d7001632fb744;p=ceph.git rgw: set compression attrs in copy_obj_data() Co-authored-by: Marcus Watts Signed-off-by: Seena Fallah --- diff --git a/src/rgw/driver/rados/rgw_rados.cc b/src/rgw/driver/rados/rgw_rados.cc index 54ab9fa0e91..ffe61fb8066 100644 --- a/src/rgw/driver/rados/rgw_rados.cc +++ b/src/rgw/driver/rados/rgw_rados.cc @@ -5380,6 +5380,10 @@ int RGWRados::copy_obj_data(RGWObjectCtx& obj_ctx, return ret; } + if (dp_factory) { + dp_factory->finalize_attrs(attrs); + } + string etag; auto iter = attrs.find(RGW_ATTR_ETAG); if (iter != attrs.end()) { diff --git a/src/rgw/rgw_op.cc b/src/rgw/rgw_op.cc index 85d6c1290cc..0d14f44193d 100644 --- a/src/rgw/rgw_op.cc +++ b/src/rgw/rgw_op.cc @@ -4749,8 +4749,8 @@ void RGWPutObj::execute(optional_yield y) if (compressor && compressor->is_compressed()) { bufferlist tmp; - RGWCompressionInfo cs_info; - assert(plugin != nullptr); + RGWCompressionInfo cs_info; + assert(plugin != nullptr); // plugin exists when the compressor does // coverity[dereference:SUPPRESS] cs_info.compression_type = plugin->get_type_name(); @@ -5743,11 +5743,12 @@ class RGWCopyObjDPF : public rgw::sal::DataProcessorFactory { DataProcessorFilter cb; RGWGetObj_Filter* filter{&cb}; bool need_decompress{false}; - RGWCompressionInfo cs_info; + RGWCompressionInfo decompress_info; boost::optional decompress; std::unique_ptr decrypt; std::unique_ptr encrypt; std::optional compressor; + CompressorRef compressor_plugin; off_t ofs_x{0}; off_t end_x = obj_size; @@ -5783,17 +5784,17 @@ public: { /* RGWGetObj_Filter */ // decompress - int ret = rgw_compression_info_from_attrset(s->src_object->get_attrs(), need_decompress, cs_info); + int ret = rgw_compression_info_from_attrset(s->src_object->get_attrs(), need_decompress, decompress_info); if (ret < 0) { return ret; } bool src_encrypted = s->src_object->get_attrs().count(RGW_ATTR_CRYPT_MODE); if (need_decompress && !src_encrypted) { - obj_size = cs_info.orig_size; + obj_size = decompress_info.orig_size; s->src_object->set_obj_size(obj_size); static constexpr bool partial_content = false; - decompress.emplace(s->cct, &cs_info, partial_content, filter); + decompress.emplace(s->cct, &decompress_info, partial_content, filter); filter = &*decompress; end_x = obj_size; } @@ -5834,12 +5835,12 @@ public: const auto& compression_type = driver->get_compression_type(s->dest_placement); if (compression_type != "none" && (encrypt == nullptr || compress_encrypted)) { - CompressorRef plugin = get_compressor_plugin(s, compression_type); - if (!plugin) { + compressor_plugin = get_compressor_plugin(s, compression_type); + if (!compressor_plugin) { ldpp_dout(s, 1) << "Cannot load plugin for compression type " << compression_type << dendl; } else { - compressor.emplace(s->cct, plugin, processor); + compressor.emplace(s->cct, compressor_plugin, processor); processor = &*compressor; // always send incompressible hint when rgw is itself doing compression s->object->set_compressed(); @@ -5875,6 +5876,29 @@ public: RGWGetObj_Filter* get_filter() override { return filter; } + + void finalize_attrs(rgw::sal::Attrs& attrs) override { + if (compressor && compressor->is_compressed()) { + bufferlist tmp; + RGWCompressionInfo cs_info; + assert(compressor_plugin != nullptr); + // plugin exists when the compressor does + // coverity[dereference:SUPPRESS] + cs_info.compression_type = compressor_plugin->get_type_name(); + cs_info.orig_size = obj_size; + cs_info.compressor_message = compressor->get_compressor_message(); + cs_info.blocks = std::move(compressor->get_compression_blocks()); + + encode(cs_info, tmp); + attrs[RGW_ATTR_COMPRESSION] = tmp; + + ldpp_dout(s, 20) << "storing " << RGW_ATTR_COMPRESSION + << " with type=" << cs_info.compression_type + << ", orig_size=" << cs_info.orig_size + << ", compressor_message=" << cs_info.compressor_message + << ", blocks=" << cs_info.blocks.size() << dendl; + } + } }; bool RGWCopyObj::parse_copy_location(const std::string_view& url_src,