From: Casey Bodley Date: Wed, 18 Dec 2024 16:28:02 +0000 (-0500) Subject: rgw: don't use merge_and_store_attrs() when recreating a bucket X-Git-Url: http://git.apps.os.sepia.ceph.com/?a=commitdiff_plain;h=ebee7fa53b3c9e084897e076faaaf0ee2cc7223f;p=ceph.git rgw: don't use merge_and_store_attrs() when recreating a bucket https://github.com/ceph/ceph/pull/56583 recently fixed merge_and_store_attrs() to preserve existing attrs, but this broke the swift api's ability to remove container metadata. RGWCreateBucket handles this merging itself with prepare_add_del_attrs(), so we should just assign createparams.attrs to the bucket and store it with bucket->put_info() make the same change for RGWPutMetadataBucket which swift uses to add/remove existing metadata Fixes: https://tracker.ceph.com/issues/69301 Signed-off-by: Casey Bodley (cherry picked from commit 340e353de6882dcd6e327d6691da9ef2b767ab4f) Conflicts: src/rgw/rgw_op.cc local 'attrs' instead of 'createparams.attrs' put_info() on reef doesn't take optional_yield --- diff --git a/src/rgw/rgw_op.cc b/src/rgw/rgw_op.cc index 2e8c1b74d016e..404f72a46cb61 100644 --- a/src/rgw/rgw_op.cc +++ b/src/rgw/rgw_op.cc @@ -3491,7 +3491,10 @@ void RGWCreateBucket::execute(optional_yield y) s->bucket->get_info().has_website = !s->bucket->get_info().website_conf.is_empty(); /* This will also set the quota on the bucket. */ - op_ret = s->bucket->merge_and_store_attrs(this, attrs, y); + s->bucket->set_attrs(std::move(attrs)); + constexpr bool exclusive = false; // overwrite + constexpr ceph::real_time no_set_mtime{}; + op_ret = s->bucket->put_info(this, exclusive, no_set_mtime); } while (op_ret == -ECANCELED && tries++ < 20); /* Restore the proper return code. */ @@ -4877,7 +4880,10 @@ void RGWPutMetadataBucket::execute(optional_yield y) /* Setting attributes also stores the provided bucket info. Due * to this fact, the new quota settings can be serialized with * the same call. */ - op_ret = s->bucket->merge_and_store_attrs(this, attrs, s->yield); + s->bucket->set_attrs(attrs); + constexpr bool exclusive = false; // overwrite + constexpr ceph::real_time no_set_mtime{}; + op_ret = s->bucket->put_info(this, exclusive, no_set_mtime); return op_ret; }); }