From afbc369485d2ee267311bd98cd94e291f3ebe88e Mon Sep 17 00:00:00 2001 From: hualong feng Date: Fri, 14 Jun 2024 15:50:53 +0800 Subject: [PATCH] rgw: fixup compressor_message didn't store in some cases When I upload a object to RGW by multipart, the head object xattr(user.rgw.compression) don't have compressor_message when the value should be valid and part object xattr have the value. Signed-off-by: Feng,Hualong (cherry picked from commit 8a20dff09f9bba26ecbc7ae5d76a2f720d0746f2) --- src/rgw/driver/daos/rgw_sal_daos.cc | 16 +++++++++++----- src/rgw/driver/motr/rgw_sal_motr.cc | 15 +++++++++++---- src/rgw/driver/rados/rgw_sal_rados.cc | 15 +++++++++++---- src/rgw/rgw_file.cc | 2 ++ src/rgw/rgw_op.cc | 1 + 5 files changed, 36 insertions(+), 13 deletions(-) diff --git a/src/rgw/driver/daos/rgw_sal_daos.cc b/src/rgw/driver/daos/rgw_sal_daos.cc index f8f60d82d0294..bafd4dcaf9102 100644 --- a/src/rgw/driver/daos/rgw_sal_daos.cc +++ b/src/rgw/driver/daos/rgw_sal_daos.cc @@ -1762,11 +1762,14 @@ int DaosMultipartUpload::complete( bool part_compressed = (obj_part.cs_info.compression_type != "none"); if ((handled_parts > 0) && ((part_compressed != compressed) || - (cs_info.compression_type != obj_part.cs_info.compression_type))) { + (cs_info.compression_type != obj_part.cs_info.compression_type) || + (cs_info.compressor_message.has_value() && + (cs_info.compressor_message != obj_part.cs_info.compressor_message)))) { ldpp_dout(dpp, 0) - << "ERROR: compression type was changed during multipart upload (" - << cs_info.compression_type << ">>" - << obj_part.cs_info.compression_type << ")" << dendl; + << "ERROR: compression type or compressor message was changed during multipart upload (" + << cs_info.compression_type << ">>" << obj_part.cs_info.compression_type << ")," + << cs_info.compressor_message << ">>" << obj_part.cs_info.compressor_message << ") " + << dendl; ret = -ERR_INVALID_PART; return ret; } @@ -1787,8 +1790,11 @@ int DaosMultipartUpload::complete( cs_info.blocks.push_back(cb); new_ofs = cb.new_ofs + cb.len; } - if (!compressed) + if (!compressed) { cs_info.compression_type = obj_part.cs_info.compression_type; + if (obj_part.cs_info.compressor_message.has_value()) + cs_info.compressor_message = obj_part.cs_info.compressor_message; + } cs_info.orig_size += obj_part.cs_info.orig_size; compressed = true; } diff --git a/src/rgw/driver/motr/rgw_sal_motr.cc b/src/rgw/driver/motr/rgw_sal_motr.cc index ae86ec9e7d352..0099c9c107f48 100644 --- a/src/rgw/driver/motr/rgw_sal_motr.cc +++ b/src/rgw/driver/motr/rgw_sal_motr.cc @@ -2762,9 +2762,13 @@ int MotrMultipartUpload::complete(const DoutPrefixProvider *dpp, bool part_compressed = (part->cs_info.compression_type != "none"); if ((handled_parts > 0) && ((part_compressed != compressed) || - (cs_info.compression_type != part->cs_info.compression_type))) { - ldpp_dout(dpp, 0) << "ERROR: compression type was changed during multipart upload (" - << cs_info.compression_type << ">>" << part->cs_info.compression_type << ")" << dendl; + (cs_info.compression_type != obj_part.cs_info.compression_type) || + (cs_info.compressor_message.has_value() && + (cs_info.compressor_message != obj_part.cs_info.compressor_message)))) { + ldpp_dout(dpp, 0) << "ERROR: compression type or compressor message was changed during multipart upload (" + << cs_info.compression_type << ">>" << part->cs_info.compression_type << ")," + << cs_info.compressor_message << ">>" << obj_part.cs_info.compressor_message << ")" + << dendl; rc = -ERR_INVALID_PART; return rc; } @@ -2784,8 +2788,11 @@ int MotrMultipartUpload::complete(const DoutPrefixProvider *dpp, cs_info.blocks.push_back(cb); new_ofs = cb.new_ofs + cb.len; } - if (!compressed) + if (!compressed) { cs_info.compression_type = part->cs_info.compression_type; + if (obj_part.cs_info.compressor_message.has_value()) + cs_info.compressor_message = obj_part.cs_info.compressor_message; + } cs_info.orig_size += part->cs_info.orig_size; compressed = true; } diff --git a/src/rgw/driver/rados/rgw_sal_rados.cc b/src/rgw/driver/rados/rgw_sal_rados.cc index 64444e4f8b729..1552f9f4220bf 100644 --- a/src/rgw/driver/rados/rgw_sal_rados.cc +++ b/src/rgw/driver/rados/rgw_sal_rados.cc @@ -3297,9 +3297,13 @@ int RadosMultipartUpload::complete(const DoutPrefixProvider *dpp, bool part_compressed = (obj_part.cs_info.compression_type != "none"); if ((handled_parts > 0) && ((part_compressed != compressed) || - (cs_info.compression_type != obj_part.cs_info.compression_type))) { - ldpp_dout(dpp, 0) << "ERROR: compression type was changed during multipart upload (" - << cs_info.compression_type << ">>" << obj_part.cs_info.compression_type << ")" << dendl; + (cs_info.compression_type != obj_part.cs_info.compression_type) || + (cs_info.compressor_message.has_value() && + (cs_info.compressor_message != obj_part.cs_info.compressor_message)))) { + ldpp_dout(dpp, 0) << "ERROR: compression type or compressor message was changed during multipart upload (" + << cs_info.compression_type << ">>" << obj_part.cs_info.compression_type << "), " + << cs_info.compressor_message << ">>" << obj_part.cs_info.compressor_message << ") " + << dendl; ret = -ERR_INVALID_PART; return ret; } @@ -3318,8 +3322,11 @@ int RadosMultipartUpload::complete(const DoutPrefixProvider *dpp, cs_info.blocks.push_back(cb); new_ofs = cb.new_ofs + cb.len; } - if (!compressed) + if (!compressed) { cs_info.compression_type = obj_part.cs_info.compression_type; + if (obj_part.cs_info.compressor_message.has_value()) + cs_info.compressor_message = obj_part.cs_info.compressor_message; + } cs_info.orig_size += obj_part.cs_info.orig_size; compressed = true; } diff --git a/src/rgw/rgw_file.cc b/src/rgw/rgw_file.cc index 66e883e7257a7..a2d9f5e783623 100644 --- a/src/rgw/rgw_file.cc +++ b/src/rgw/rgw_file.cc @@ -1967,12 +1967,14 @@ namespace rgw { RGWCompressionInfo cs_info; cs_info.compression_type = plugin->get_type_name(); cs_info.orig_size = state->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(this, 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; } diff --git a/src/rgw/rgw_op.cc b/src/rgw/rgw_op.cc index 61191b14e4990..f7e53c4cabb32 100644 --- a/src/rgw/rgw_op.cc +++ b/src/rgw/rgw_op.cc @@ -4419,6 +4419,7 @@ void RGWPutObj::execute(optional_yield y) ldpp_dout(this, 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; } if (torrent) { -- 2.39.5