From b429331f4fb22e845edcd526b618b10c82db6286 Mon Sep 17 00:00:00 2001 From: Yehuda Sadeh Date: Mon, 3 Oct 2016 16:43:44 -0700 Subject: [PATCH] rgw_admin: add bi purge command Signed-off-by: Yehuda Sadeh (cherry picked from commit aaf0d213eb39192ceb252c9c7db68c1a48ba1272) See: http://tracker.ceph.com/issues/17556 See: https://github.com/ceph/ceph/pull/11368 Signed-off-by: Robin H. Johnson --- src/rgw/rgw_admin.cc | 48 ++++++++++++++++++++++++++++++++++++++++++++ src/rgw/rgw_rados.cc | 14 +++++++++++++ src/rgw/rgw_rados.h | 1 + 3 files changed, 63 insertions(+) diff --git a/src/rgw/rgw_admin.cc b/src/rgw/rgw_admin.cc index 42c03ca0e4d85..5c9b12b5bb3e7 100644 --- a/src/rgw/rgw_admin.cc +++ b/src/rgw/rgw_admin.cc @@ -316,6 +316,7 @@ enum { OPT_BI_GET, OPT_BI_PUT, OPT_BI_LIST, + OPT_BI_PURGE, OPT_OLH_GET, OPT_OLH_READLOG, OPT_QUOTA_SET, @@ -571,6 +572,8 @@ static int get_cmd(const char *cmd, const char *prev_cmd, const char *prev_prev_ return OPT_BI_PUT; if (strcmp(cmd, "list") == 0) return OPT_BI_LIST; + if (strcmp(cmd, "purge") == 0) + return OPT_BI_PURGE; } else if (strcmp(prev_cmd, "period") == 0) { if (strcmp(cmd, "delete") == 0) return OPT_PERIOD_DELETE; @@ -4874,6 +4877,51 @@ next: formatter->flush(cout); } + if (opt_cmd == OPT_BI_PURGE) { + if (bucket_name.empty()) { + cerr << "ERROR: bucket name not specified" << std::endl; + return EINVAL; + } + RGWBucketInfo bucket_info; + int ret = init_bucket(tenant, bucket_name, bucket_id, bucket_info, bucket); + if (ret < 0) { + cerr << "ERROR: could not init bucket: " << cpp_strerror(-ret) << std::endl; + return -ret; + } + + RGWBucketInfo cur_bucket_info; + rgw_bucket cur_bucket; + ret = init_bucket(tenant, bucket_name, string(), cur_bucket_info, cur_bucket); + if (ret < 0) { + cerr << "ERROR: could not init current bucket info for bucket_name=" << bucket_name << ": " << cpp_strerror(-ret) << std::endl; + return -ret; + } + + if (cur_bucket_info.bucket.bucket_id == bucket_info.bucket.bucket_id && !yes_i_really_mean_it) { + cerr << "specified bucket instance points to a current bucket instance" << std::endl; + cerr << "do you really mean it? (requires --yes-i-really-mean-it)" << std::endl; + return EINVAL; + } + + int max_shards = (bucket_info.num_shards > 0 ? bucket_info.num_shards : 1); + + for (int i = 0; i < max_shards; i++) { + RGWRados::BucketShard bs(store); + int shard_id = (bucket_info.num_shards > 0 ? i : -1); + int ret = bs.init(bucket, shard_id); + if (ret < 0) { + cerr << "ERROR: bs.init(bucket=" << bucket << ", shard=" << shard_id << "): " << cpp_strerror(-ret) << std::endl; + return -ret; + } + + ret = store->bi_remove(bs); + if (ret < 0) { + cerr << "ERROR: failed to remove bucket index object: " << cpp_strerror(-ret) << std::endl; + return -ret; + } + } + } + if (opt_cmd == OPT_OBJECT_RM) { RGWBucketInfo bucket_info; int ret = init_bucket(tenant, bucket_name, bucket_id, bucket_info, bucket); diff --git a/src/rgw/rgw_rados.cc b/src/rgw/rgw_rados.cc index f7f6a7e7aa933..699a5efcf6fd0 100644 --- a/src/rgw/rgw_rados.cc +++ b/src/rgw/rgw_rados.cc @@ -11373,6 +11373,20 @@ int RGWRados::bi_list(BucketShard& bs, const string& filter_obj, const string& m return 0; } +int RGWRados::bi_remove(BucketShard& bs) +{ + int ret = bs.index_ctx.remove(bs.bucket_obj); + if (ret == -ENOENT) { + ret = 0; + } + if (ret < 0) { + ldout(cct, 5) << "bs.index_ctx.remove(" << bs.bucket_obj << ") returned ret=" << ret << dendl; + return ret; + } + + return 0; +} + int RGWRados::bi_list(rgw_bucket& bucket, int shard_id, const string& filter_obj, const string& marker, uint32_t max, list *entries, bool *is_truncated) { BucketShard bs(this); diff --git a/src/rgw/rgw_rados.h b/src/rgw/rgw_rados.h index 6116271dfe11f..7a9ea5277cb01 100644 --- a/src/rgw/rgw_rados.h +++ b/src/rgw/rgw_rados.h @@ -2854,6 +2854,7 @@ public: int bi_list(BucketShard& bs, const string& filter_obj, const string& marker, uint32_t max, list *entries, bool *is_truncated); int bi_list(rgw_bucket& bucket, const string& obj_name, const string& marker, uint32_t max, list *entries, bool *is_truncated); + int bi_remove(BucketShard& bs); int cls_obj_usage_log_add(const string& oid, rgw_usage_log_info& info); int cls_obj_usage_log_read(string& oid, string& user, uint64_t start_epoch, uint64_t end_epoch, uint32_t max_entries, -- 2.39.5