]> git.apps.os.sepia.ceph.com Git - ceph.git/commitdiff
rgw/multisite: RGWBucketMetadataHandler updates linkage on owner change
authorCasey Bodley <cbodley@redhat.com>
Sun, 17 Dec 2023 18:36:54 +0000 (13:36 -0500)
committerCasey Bodley <cbodley@redhat.com>
Fri, 12 Apr 2024 19:34:27 +0000 (15:34 -0400)
Signed-off-by: Casey Bodley <cbodley@redhat.com>
(cherry picked from commit d304285d21590908f385bda2b3177ca2b7024ef8)

src/rgw/driver/rados/rgw_bucket.cc

index e6c30497adb6abc0f278d07e9602bff4e207d828..d565a34f04fab3d9b2798372569e97166e1902f4 100644 (file)
@@ -2154,18 +2154,32 @@ int RGWMetadataHandlerPut_Bucket::put_checked(const DoutPrefixProvider *dpp)
 
 int RGWMetadataHandlerPut_Bucket::put_post(const DoutPrefixProvider *dpp)
 {
-  auto& be = obj->get_ep();
+  auto* orig_obj = static_cast<RGWBucketEntryMetadataObject *>(old_obj);
+  auto* old_be = orig_obj ? &orig_obj->get_ep() : nullptr;
+  auto& new_be = obj->get_ep();
 
-  int ret;
+  RGWBucketCtl& ctl = *bhandler->ctl.bucket;
+  constexpr bool update_entrypoint = false;
 
-  /* link bucket */
-  if (be.linked) {
-    ret = bhandler->ctl.bucket->link_bucket(rados, be.owner, be.bucket, be.creation_time, y, dpp, false);
-  } else {
-    ret = bhandler->ctl.bucket->unlink_bucket(rados, be.owner, be.bucket, y, dpp, false);
+  if (old_be && (old_be->owner != new_be.owner || // owner changed
+      (old_be->linked && !new_be.linked))) { // linked -> false
+    int ret = ctl.unlink_bucket(rados, old_be->owner, old_be->bucket,
+                                y, dpp, update_entrypoint);
+    if (ret < 0) {
+      return ret;
+    }
   }
 
-  return ret;
+  if (new_be.linked && (!old_be || !old_be->linked || // linked -> true
+      old_be->owner != new_be.owner)) { // owner changed
+    int ret = ctl.link_bucket(rados, new_be.owner, new_be.bucket,
+                              new_be.creation_time, y, dpp, update_entrypoint);
+    if (ret < 0) {
+      return ret;
+    }
+  }
+
+  return 0;
 }
 
 int update_bucket_topic_mappings(const DoutPrefixProvider* dpp,