]> git.apps.os.sepia.ceph.com Git - ceph-ci.git/commitdiff
rgw/multisite: helper function to store bucket info flag
authorShilpa Jagannath <smanjara@redhat.com>
Tue, 28 Nov 2023 21:39:45 +0000 (16:39 -0500)
committerShilpa Jagannath <smanjara@redhat.com>
Fri, 4 Apr 2025 17:16:53 +0000 (13:16 -0400)
Signed-off-by: Shilpa Jagannath <smanjara@redhat.com>
src/rgw/driver/rados/rgw_rados.cc
src/rgw/driver/rados/rgw_rados.h
src/rgw/driver/rados/rgw_sal_rados.cc
src/rgw/driver/rados/rgw_trim_bilog.cc

index 659a3073ff9b72a2424fe78bfd04beea0f291bfe..2b15daabc79667cd63274364a59939a4f9b04699 100644 (file)
@@ -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<std::string, bufferlist>& 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<std::string, bu
                                       bucket_objs,
                                       cct->_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<string, bufferlist> 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;
     }
index 64bbfe8beae72558a87df49f394c8572148ae738..4c471bbd85b54118048f025f1ed2837d630340bc 100644 (file)
@@ -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<std::string, bufferlist>& attrs, optional_yield y, const DoutPrefixProvider *dpp);
+
   /**
    * Delete a bucket.
    * bucket: the name of the bucket to delete
index a6e7d6eb3cbf27ea96e29c67acd0d4bd18fc5a64..7bd2af63dd55e75943ff84ec6c6cf7379fa6cacc 100644 (file)
@@ -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 " <<
index 8c528a8b7343efdbd14f688b21c2141359f7b774..edc157cb6236fee10467347a36b43e1d840e7ca0 100644 (file)
@@ -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) {