From 80256cf9601c5bae7c002e9b2b90e917bb995ec9 Mon Sep 17 00:00:00 2001 From: Casey Bodley Date: Sun, 17 Dec 2023 13:36:54 -0500 Subject: [PATCH] rgw/multisite: RGWBucketMetadataHandler updates linkage on owner change Signed-off-by: Casey Bodley (cherry picked from commit d304285d21590908f385bda2b3177ca2b7024ef8) --- src/rgw/driver/rados/rgw_bucket.cc | 30 ++++++++++++++++++++++-------- 1 file changed, 22 insertions(+), 8 deletions(-) diff --git a/src/rgw/driver/rados/rgw_bucket.cc b/src/rgw/driver/rados/rgw_bucket.cc index e6c30497adb6a..d565a34f04fab 100644 --- a/src/rgw/driver/rados/rgw_bucket.cc +++ b/src/rgw/driver/rados/rgw_bucket.cc @@ -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(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, -- 2.39.5