From 48b58f16d30c5d70c9cf1effbfb04c7d5b4a8c3c Mon Sep 17 00:00:00 2001 From: Matt Benjamin Date: Thu, 12 Feb 2026 14:13:17 -0500 Subject: [PATCH] posixdriver: propagate object lock attrs across multipart upload Retention rules can be specified in init-multipart, and of present, need to propagate to the final object if the upload completes. Needed for (e.g.) test_object_lock_delete_multipart_object_with_retention Signed-off-by: Matt Benjamin --- src/rgw/driver/posix/rgw_sal_posix.cc | 37 +++++++++++++++++++++++++-- 1 file changed, 35 insertions(+), 2 deletions(-) diff --git a/src/rgw/driver/posix/rgw_sal_posix.cc b/src/rgw/driver/posix/rgw_sal_posix.cc index 0f5b8dcd92a..33191e1f9d9 100644 --- a/src/rgw/driver/posix/rgw_sal_posix.cc +++ b/src/rgw/driver/posix/rgw_sal_posix.cc @@ -3804,14 +3804,33 @@ int POSIXMultipartUpload::load(const DoutPrefixProvider *dpp, bool create) std::unique_ptr POSIXMultipartUpload::get_meta_obj() { + std::unique_ptr meta_obj{nullptr}; + load(nullptr); + if (!shadow) { // This upload doesn't exist, but the API doesn't check this until it calls // on the *serializer*. So make a fake object in the parent bucket that // doesn't exist. Put it in the MP namespace just in case. - return bucket->get_object(rgw_obj_key(get_meta(), std::string(), mp_ns)); + meta_obj = bucket->get_object(rgw_obj_key(get_meta(), std::string(), mp_ns)); + } + meta_obj = shadow->get_object(rgw_obj_key(get_meta(), std::string())); + + auto posix_meta_obj = static_cast(meta_obj.get()); + rgw::sal::Attrs attrs; + if (obj_retention) { + buffer::list obj_retention_bl; + obj_retention->encode(obj_retention_bl); + attrs[RGW_ATTR_OBJECT_RETENTION] = std::move(obj_retention_bl); + } + if (obj_legal_hold) { + buffer::list obj_legal_hold_bl; + obj_legal_hold->encode(obj_legal_hold_bl); + attrs[RGW_ATTR_OBJECT_LEGAL_HOLD] = std::move(obj_legal_hold_bl); } - return shadow->get_object(rgw_obj_key(get_meta(), std::string())); + posix_meta_obj->set_attrs(attrs); + + return meta_obj; } int POSIXMultipartUpload::init(const DoutPrefixProvider *dpp, optional_yield y, @@ -3839,6 +3858,14 @@ int POSIXMultipartUpload::init(const DoutPrefixProvider *dpp, optional_yield y, } mp_obj.upload_info.cksum_type = cksum_type; + if (obj_retention) { + mp_obj.upload_info.obj_retention_exist = true; + mp_obj.upload_info.obj_retention = *obj_retention; + } + if (obj_legal_hold) { + mp_obj.upload_info.obj_legal_hold_exist = true; + mp_obj.upload_info.obj_legal_hold = *obj_legal_hold; + } mp_obj.upload_info.dest_placement = dest_placement; mp_obj.owner = owner; @@ -4126,6 +4153,12 @@ int POSIXMultipartUpload::get_info(const DoutPrefixProvider *dpp, optional_yield } } *rule = &mp_obj.upload_info.dest_placement; + if (mp_obj.upload_info.obj_retention_exist) { + obj_retention = mp_obj.upload_info.obj_retention; + } + if (mp_obj.upload_info.obj_legal_hold_exist) { + obj_legal_hold = mp_obj.upload_info.obj_legal_hold; + } } return 0; -- 2.47.3