]> git-server-git.apps.pok.os.sepia.ceph.com Git - ceph.git/commitdiff
rgw: set compression attrs in copy_obj_data()
authorSeena Fallah <seenafallah@gmail.com>
Sat, 7 Jun 2025 23:12:48 +0000 (01:12 +0200)
committerSeena Fallah <seenafallah@gmail.com>
Wed, 19 Nov 2025 19:00:46 +0000 (20:00 +0100)
Co-authored-by: Marcus Watts <mwatts@redhat.com>
Signed-off-by: Seena Fallah <seenafallah@gmail.com>
src/rgw/driver/rados/rgw_rados.cc
src/rgw/rgw_op.cc

index 54ab9fa0e9195186c8f654e6bf0dcab9c6d8be15..ffe61fb806619cff60f79ae67cd3388d957710e3 100644 (file)
@@ -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()) {
index 85d6c1290cc0fc94ce627f8c893c5678cd55cedc..0d14f44193de9877918e26d33a024e33eed6e1a5 100644 (file)
@@ -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<RGWGetObj_Decompress> decompress;
   std::unique_ptr<RGWGetObj_Filter> decrypt;
   std::unique_ptr<rgw::sal::DataProcessor> encrypt;
   std::optional<RGWPutObj_Compress> 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,