/* existing bucket, keep its placement */
bci.info.bucket.explicit_placement = old_bci->info.bucket.explicit_placement;
bci.info.placement_rule = old_bci->info.placement_rule;
+
+ //if the bucket is being deleted, create and store a special log type for
+ //bucket instance cleanup in multisite setup
+ const auto& log = bci.info.layout.logs.back();
+ if (bci.info.bucket_deleted() && log.layout.type != rgw::BucketLogType::Deleted) {
+ bci.info.layout.logs.push_back({0, {rgw::BucketLogType::Deleted}});
+ ldpp_dout(dpp, 10) << "store log layout type: " << bci.info.layout.logs.back().layout.type << dendl;
+ }
}
//always keep bucket versioning enabled on archive zone
/* record the read version (if any), store the new version */
bci.info.objv_tracker.read_version = objv_tracker.read_version;
bci.info.objv_tracker.write_version = objv_tracker.write_version;
-
+
return 0;
}
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);
- 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 < 0) {
- ldpp_dout(dpp, 0) << "ERROR: failed to store bucket instance info for bucket=" << bucket.name << " ret=" << r << dendl;
- return r;
+ ldpp_dout(dpp, 0) << "WARNING: failed to store bucket instance info for bucket: " << bucket.name << " r=" << r << dendl;
+ } else {
+ ldpp_dout(dpp, 20) << "INFO: setting bucket info flag to deleted for bucket: " << bucket.name << dendl;
}
}