]> git.apps.os.sepia.ceph.com Git - ceph.git/commitdiff
rgw: don't use merge_and_store_attrs() when recreating a bucket 64387/head
authorCasey Bodley <cbodley@redhat.com>
Wed, 18 Dec 2024 16:28:02 +0000 (11:28 -0500)
committerCasey Bodley <cbodley@redhat.com>
Tue, 8 Jul 2025 16:02:01 +0000 (12:02 -0400)
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 <cbodley@redhat.com>
(cherry picked from commit 340e353de6882dcd6e327d6691da9ef2b767ab4f)

src/rgw/rgw_op.cc

index 6347000f6e8eb4c669a0c37f1f74763d0922c983..83d5554c62b119175a591262bd26b842cf0d5ccc 100644 (file)
@@ -3691,7 +3691,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. */
@@ -4998,7 +5001,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);
 }