From: Vikhyat Umrao Date: Fri, 30 Aug 2019 07:16:46 +0000 (-0700) Subject: radosgw-admin: add support for --bucket-id in bucket stats command X-Git-Tag: v15.2.2~17^2~1 X-Git-Url: http://git.apps.os.sepia.ceph.com/?a=commitdiff_plain;h=f10324f0adf90c5e6711aa18324eeb50cb0a63ed;p=ceph.git radosgw-admin: add support for --bucket-id in bucket stats command Fixes: https://tracker.ceph.com/issues/41061 Signed-off-by: Vikhyat Umrao (cherry picked from commit 4cd16e13ca0c8709091737ad2cb2b37a3b19840d) --- diff --git a/src/rgw/rgw_admin.cc b/src/rgw/rgw_admin.cc index 99285b4444346..fb463ea88c9da 100644 --- a/src/rgw/rgw_admin.cc +++ b/src/rgw/rgw_admin.cc @@ -3401,7 +3401,7 @@ int main(int argc, const char **argv) bucket_id = val; opt_bucket_id = val; if (bucket_id.empty()) { - cerr << "bad bucket-id" << std::endl; + cerr << "no value for bucket-id" << std::endl; exit(1); } } else if (ceph_argparse_witharg(args, i, &val, "--bucket-new-name", (char*)NULL)) { @@ -6077,6 +6077,15 @@ int main(int argc, const char **argv) } /* OPT::BUCKETS_LIST */ if (opt_cmd == OPT::BUCKET_STATS) { + if (bucket_name.empty() && !bucket_id.empty()) { + rgw_bucket bucket; + if (!rgw_find_bucket_by_id(store->ctx(), store->ctl()->meta.mgr, marker, bucket_id, &bucket)) { + cerr << "failure: no such bucket id" << std::endl; + return -ENOENT; + } + bucket_op.set_tenant(bucket.tenant); + bucket_op.set_bucket_name(bucket.name); + } bucket_op.set_fetch_stats(true); int r = RGWBucketAdminOp::info(store, bucket_op, f); diff --git a/src/rgw/rgw_bucket.cc b/src/rgw/rgw_bucket.cc index 108b1c13e2d1c..58b22827a59a4 100644 --- a/src/rgw/rgw_bucket.cc +++ b/src/rgw/rgw_bucket.cc @@ -635,6 +635,43 @@ int RGWBucket::init(rgw::sal::RGWRadosStore *storage, RGWBucketAdminOpState& op_ return 0; } +bool rgw_find_bucket_by_id(CephContext *cct, RGWMetadataManager *mgr, + const string& marker, const string& bucket_id, rgw_bucket* bucket_out) +{ + void *handle = NULL; + bool truncated = false; + string s; + + int ret = mgr->list_keys_init("bucket.instance", marker, &handle); + if (ret < 0) { + cerr << "ERROR: can't get key: " << cpp_strerror(-ret) << std::endl; + mgr->list_keys_complete(handle); + return -ret; + } + do { + list keys; + ret = mgr->list_keys_next(handle, 1000, keys, &truncated); + if (ret < 0) { + cerr << "ERROR: lists_keys_next(): " << cpp_strerror(-ret) << std::endl; + mgr->list_keys_complete(handle); + return -ret; + } + for (list::iterator iter = keys.begin(); iter != keys.end(); ++iter) { + s = *iter; + ret = rgw_bucket_parse_bucket_key(cct, s, bucket_out, nullptr); + if (ret < 0) { + continue; + } + if (bucket_id == bucket_out->bucket_id) { + mgr->list_keys_complete(handle); + return true; + } + } + } while (truncated); + mgr->list_keys_complete(handle); + return false; +} + int RGWBucket::link(RGWBucketAdminOpState& op_state, optional_yield y, map& attrs, std::string *err_msg) { diff --git a/src/rgw/rgw_bucket.h b/src/rgw/rgw_bucket.h index d30f410fddcf5..797a46cdb171b 100644 --- a/src/rgw/rgw_bucket.h +++ b/src/rgw/rgw_bucket.h @@ -939,5 +939,7 @@ private: }; +bool rgw_find_bucket_by_id(CephContext *cct, RGWMetadataManager *mgr, const string& marker, + const string& bucket_id, rgw_bucket* bucket_out); #endif