From 0c7afb323fc927975601462c6dbf581036d81938 Mon Sep 17 00:00:00 2001 From: Daniel Gryniewicz Date: Tue, 28 Jul 2020 14:22:51 -0400 Subject: [PATCH] Zipper - Remove duplicate remove_bucket() code Signed-off-by: Daniel Gryniewicz --- src/rgw/rgw_bucket.cc | 125 ++++--------------------------------- src/rgw/rgw_bucket.h | 1 - src/rgw/rgw_rest_bucket.cc | 21 ++++--- 3 files changed, 22 insertions(+), 125 deletions(-) diff --git a/src/rgw/rgw_bucket.cc b/src/rgw/rgw_bucket.cc index 1d59d1e3f4f..a59b2039382 100644 --- a/src/rgw/rgw_bucket.cc +++ b/src/rgw/rgw_bucket.cc @@ -334,86 +334,6 @@ int rgw_remove_object(rgw::sal::RGWRadosStore *store, const RGWBucketInfo& bucke return store->getRados()->delete_obj(rctx, bucket_info, obj, bucket_info.versioning_status()); } -/* xxx dang */ -static int rgw_remove_bucket(rgw::sal::RGWRadosStore *store, rgw_bucket& bucket, bool delete_children, optional_yield y) -{ - int ret; - map stats; - std::vector objs; - map common_prefixes; - RGWBucketInfo info; - - string bucket_ver, master_ver; - - ret = store->getRados()->get_bucket_info(store->svc(), bucket.tenant, bucket.name, info, NULL, null_yield); - if (ret < 0) - return ret; - - ret = store->getRados()->get_bucket_stats(info, RGW_NO_SHARD, &bucket_ver, &master_ver, stats, NULL); - if (ret < 0) - return ret; - - RGWRados::Bucket target(store->getRados(), info); - RGWRados::Bucket::List list_op(&target); - CephContext *cct = store->ctx(); - - list_op.params.list_versions = true; - list_op.params.allow_unordered = true; - - bool is_truncated = false; - do { - objs.clear(); - - ret = list_op.list_objects(listing_max_entries, &objs, &common_prefixes, - &is_truncated, null_yield); - if (ret < 0) - return ret; - - if (!objs.empty() && !delete_children) { - lderr(store->ctx()) << "ERROR: could not remove non-empty bucket " << bucket.name << dendl; - return -ENOTEMPTY; - } - - for (const auto& obj : objs) { - rgw_obj_key key(obj.key); - ret = rgw_remove_object(store, info, bucket, key); - if (ret < 0 && ret != -ENOENT) { - return ret; - } - } - } while(is_truncated); - - string prefix, delimiter; - - ret = abort_bucket_multiparts(store, cct, info, prefix, delimiter); - if (ret < 0) { - return ret; - } - - ret = store->ctl()->bucket->sync_user_stats(info.owner, info); - if ( ret < 0) { - dout(1) << "WARNING: failed sync user stats before bucket delete. ret=" << ret << dendl; - } - - RGWObjVersionTracker objv_tracker; - - // if we deleted children above we will force delete, as any that - // remain is detrius from a prior bug - ret = store->getRados()->delete_bucket(info, objv_tracker, null_yield, !delete_children); - if (ret < 0) { - lderr(store->ctx()) << "ERROR: could not remove bucket " << - bucket.name << dendl; - return ret; - } - - ret = store->ctl()->bucket->unlink_bucket(info.owner, bucket, null_yield, false); - if (ret < 0) { - lderr(store->ctx()) << "ERROR: unable to remove user bucket information" << dendl; - } - - return ret; -} - static int aio_wait(librados::AioCompletion *handle) { librados::AioCompletion *c = (librados::AioCompletion *)handle; @@ -851,32 +771,6 @@ int RGWBucket::set_quota(RGWBucketAdminOpState& op_state, std::string *err_msg) return r; } -int RGWBucket::remove(RGWBucketAdminOpState& op_state, optional_yield y, bool bypass_gc, - bool keep_index_consistent, std::string *err_msg) -{ - bool delete_children = op_state.will_delete_children(); - rgw_bucket bucket = op_state.get_bucket(); - int ret; - - if (bypass_gc) { - if (delete_children) { - ret = rgw_remove_bucket_bypass_gc(store, bucket, op_state.get_max_aio(), keep_index_consistent, y); - } else { - set_err_msg(err_msg, "purge objects should be set for gc to be bypassed"); - return -EINVAL; - } - } else { - ret = rgw_remove_bucket(store, bucket, delete_children, y); - } - - if (ret < 0) { - set_err_msg(err_msg, "unable to remove bucket" + cpp_strerror(-ret)); - return ret; - } - - return 0; -} - int RGWBucket::remove_object(RGWBucketAdminOpState& op_state, std::string *err_msg) { rgw_bucket bucket = op_state.get_bucket(); @@ -1361,19 +1255,22 @@ int RGWBucketAdminOp::check_index(rgw::sal::RGWRadosStore *store, RGWBucketAdmin } int RGWBucketAdminOp::remove_bucket(rgw::sal::RGWRadosStore *store, RGWBucketAdminOpState& op_state, - optional_yield y, bool bypass_gc, bool keep_index_consistent) + optional_yield y, bool bypass_gc, bool keep_index_consistent) { - RGWBucket bucket; + std::unique_ptr bucket; + std::unique_ptr user = store->get_user(op_state.get_user_id()); - int ret = bucket.init(store, op_state, y); + int ret = store->get_bucket(user.get(), user->get_tenant(), op_state.get_bucket_name(), + &bucket); if (ret < 0) return ret; - std::string err_msg; - ret = bucket.remove(op_state, y, bypass_gc, keep_index_consistent, &err_msg); - if (!err_msg.empty()) { - lderr(store->ctx()) << "ERROR: " << err_msg << dendl; - } + if (bypass_gc) + ret = rgw_remove_bucket_bypass_gc(store, bucket->get_key(), op_state.get_max_aio(), keep_index_consistent, y); + else + ret = bucket->remove_bucket(op_state.will_delete_children(), string(), string(), + false, nullptr, y); + return ret; } diff --git a/src/rgw/rgw_bucket.h b/src/rgw/rgw_bucket.h index 797a46cdb17..76e4369fd5e 100644 --- a/src/rgw/rgw_bucket.h +++ b/src/rgw/rgw_bucket.h @@ -353,7 +353,6 @@ public: map& calculated_stats, std::string *err_msg = NULL); - int remove(RGWBucketAdminOpState& op_state, optional_yield y, bool bypass_gc = false, bool keep_index_consistent = true, std::string *err_msg = NULL); int link(RGWBucketAdminOpState& op_state, optional_yield y, map& attrs, std::string *err_msg = NULL); int chown(RGWBucketAdminOpState& op_state, const string& marker, diff --git a/src/rgw/rgw_rest_bucket.cc b/src/rgw/rgw_rest_bucket.cc index 2cd1f980a4f..06b793c814b 100644 --- a/src/rgw/rgw_rest_bucket.cc +++ b/src/rgw/rgw_rest_bucket.cc @@ -211,24 +211,25 @@ public: void RGWOp_Bucket_Remove::execute() { - std::string bucket; + std::string bucket_name; bool delete_children; + std::unique_ptr bucket; - RGWBucketAdminOpState op_state; - - RESTArgs::get_string(s, "bucket", bucket, &bucket); + RESTArgs::get_string(s, "bucket", bucket_name, &bucket_name); RESTArgs::get_bool(s, "purge-objects", false, &delete_children); - op_state.set_bucket_name(bucket); - op_state.set_delete_children(delete_children); + op_ret = store->get_bucket(nullptr, string(), bucket_name, &bucket); + if (op_ret < 0) { + ldpp_dout(this, 0) << "get_bucket returned ret=" << op_ret << dendl; + return; + } - bufferlist data; - op_ret = store->forward_request_to_master(s->user, nullptr, data, nullptr, s->info); + op_ret = bucket->remove_bucket(delete_children, string(), string(), true, &s->info, s->yield); if (op_ret < 0) { - ldpp_dout(this, 0) << "forward_request_to_master returned ret=" << op_ret << dendl; + ldpp_dout(this, 0) << "remove_bucket returned ret=" << op_ret << dendl; return; } - http_ret = RGWBucketAdminOp::remove_bucket(store, op_state, s->yield); + http_ret = op_ret; } class RGWOp_Set_Bucket_Quota : public RGWRESTOp { -- 2.39.5