From: Shilpa Jagannath Date: Tue, 28 Nov 2023 21:39:45 +0000 (-0500) Subject: rgw/multisite: helper function to store bucket info flag X-Git-Tag: testing/wip-vshankar-testing-20250407.170244-debug~8^2~17 X-Git-Url: http://git.apps.os.sepia.ceph.com/?a=commitdiff_plain;h=175a0e816974b584aba1046a30f162a6468cf7ef;p=ceph-ci.git rgw/multisite: helper function to store bucket info flag Signed-off-by: Shilpa Jagannath --- diff --git a/src/rgw/driver/rados/rgw_rados.cc b/src/rgw/driver/rados/rgw_rados.cc index 659a3073ff9..2b15daabc79 100644 --- a/src/rgw/driver/rados/rgw_rados.cc +++ b/src/rgw/driver/rados/rgw_rados.cc @@ -5544,6 +5544,32 @@ int RGWRados::check_bucket_empty(const DoutPrefixProvider *dpp, RGWBucketInfo& b return 0; } + +int RGWRados::store_delete_bucket_info_flag(RGWBucketInfo& bucket_info, std::map& attrs, optional_yield y, const DoutPrefixProvider *dpp) { + const rgw_bucket& bucket = bucket_info.bucket; + static constexpr auto max_retries = 10; + int retries = 0; + int r = 0; + do { + bucket_info.flags |= BUCKET_DELETED; + r = ctl.bucket->store_bucket_instance_info(bucket, bucket_info, y, dpp, RGWBucketCtl::BucketInstance::PutParams() + .set_exclusive(false) + .set_mtime(real_time()) + .set_attrs(&attrs) + .set_orig_info(&bucket_info)); + if (r == -ECANCELED) { + //racing write. re-read bucket info + int ret = get_bucket_instance_info(bucket, bucket_info, nullptr, &attrs, y, dpp); + if (ret < 0) { + ldpp_dout(dpp, 5) << "ERROR: failed to get bucket instance info for bucket=" << bucket.name << " ret=" << ret << dendl; + r = ret; + break; + } + } + } while (r == -ECANCELED && ++retries < max_retries); + + return r; +} /** * Delete a bucket. @@ -5613,29 +5639,11 @@ int RGWRados::delete_bucket(RGWBucketInfo& bucket_info, std::map_conf->rgw_bucket_index_max_aio)(); } else { - bucket_info.flags |= BUCKET_DELETED; - static constexpr auto max_retries = 10; - int retries = 0; - do { - r = ctl.bucket->store_bucket_instance_info(bucket, bucket_info, y, dpp, RGWBucketCtl::BucketInstance::PutParams() - .set_exclusive(false) - .set_mtime(real_time()) - .set_attrs(&attrs) - .set_orig_info(&bucket_info)); - if (r == -ECANCELED) { - //racing write. re-read bucket info - map attrs; - int ret = get_bucket_instance_info(bucket, bucket_info, nullptr, &attrs, y, dpp); - if (ret < 0) { - ldpp_dout(dpp, 5) << "ERROR: failed to get bucket instance info for bucket=" << bucket.name << " ret=" << ret << dendl; - r = ret; - break; - } - } - } while (r == -ECANCELED && ++retries < max_retries); - + // set 'deleted' flag for multisite replication to handle bucket instance removal + r = store_delete_bucket_info_flag(bucket_info, attrs, y, dpp); if (r < 0) { - ldpp_dout(dpp, 0) << "WARNING: failed to store bucket instance info for bucket: " << bucket.name << " r=" << r << dendl; + // no need to treat this as an error + ldpp_dout(dpp, 0) << "WARNING: failed to store bucket info flag 'deleted' on bucket: " << bucket.name << " r=" << r << dendl; } else { ldpp_dout(dpp, 20) << "INFO: setting bucket info flag to deleted for bucket: " << bucket.name << dendl; } diff --git a/src/rgw/driver/rados/rgw_rados.h b/src/rgw/driver/rados/rgw_rados.h index 64bbfe8beae..4c471bbd85b 100644 --- a/src/rgw/driver/rados/rgw_rados.h +++ b/src/rgw/driver/rados/rgw_rados.h @@ -1263,6 +1263,8 @@ int restore_obj_from_cloud(RGWLCCloudTierCtx& tier_ctx, int check_bucket_empty(const DoutPrefixProvider *dpp, RGWBucketInfo& bucket_info, optional_yield y); + int store_delete_bucket_info_flag(RGWBucketInfo& bucket_info, std::map& attrs, optional_yield y, const DoutPrefixProvider *dpp); + /** * Delete a bucket. * bucket: the name of the bucket to delete diff --git a/src/rgw/driver/rados/rgw_sal_rados.cc b/src/rgw/driver/rados/rgw_sal_rados.cc index a6e7d6eb3cb..7bd2af63dd5 100644 --- a/src/rgw/driver/rados/rgw_sal_rados.cc +++ b/src/rgw/driver/rados/rgw_sal_rados.cc @@ -446,7 +446,7 @@ int RadosBucket::remove(const DoutPrefixProvider* dpp, RGWObjVersionTracker ot; // if we deleted children above we will force delete, as any that - // remain is detrius from a prior bug + // remain is detritus from a prior bug ret = store->getRados()->delete_bucket(info, get_attrs(), ot, y, dpp, !delete_children); if (ret < 0) { ldpp_dout(dpp, -1) << "ERROR: could not remove bucket " << diff --git a/src/rgw/driver/rados/rgw_trim_bilog.cc b/src/rgw/driver/rados/rgw_trim_bilog.cc index 8c528a8b734..edc157cb623 100644 --- a/src/rgw/driver/rados/rgw_trim_bilog.cc +++ b/src/rgw/driver/rados/rgw_trim_bilog.cc @@ -763,7 +763,7 @@ int BucketTrimInstanceCR::operate(const DoutPrefixProvider *dpp) //remove bucket instance metadata if (clean_info->first.layout.logs.front().layout.type == rgw::BucketLogType::Deleted) { yield call(new RGWRemoveBucketInstanceInfoCR( - store->svc()->rados->get_async_processor(), + store->svc()->async_processor, store, clean_info->first.bucket, clean_info->first, nullptr, dpp)); if (retcode < 0) {