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-Tag: v20.0.0~440^2 X-Git-Url: http://git.apps.os.sepia.ceph.com/?a=commitdiff_plain;h=refs%2Fpull%2F61136%2Fhead;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 --- diff --git a/src/rgw/rgw_op.cc b/src/rgw/rgw_op.cc index ee42ab647a1ac..772de869fc017 100644 --- a/src/rgw/rgw_op.cc +++ b/src/rgw/rgw_op.cc @@ -3793,7 +3793,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, createparams.attrs, y); + s->bucket->set_attrs(std::move(createparams.attrs)); + constexpr bool exclusive = false; // overwrite + constexpr ceph::real_time no_set_mtime{}; + op_ret = s->bucket->put_info(this, exclusive, no_set_mtime, y); } while (op_ret == -ECANCELED && tries++ < 20); /* Restore the proper return code. */ @@ -5194,7 +5197,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, s->yield); return op_ret; }, y); }