From 8c405bbee4f46296553c92e7e6b536ba4575dbb6 Mon Sep 17 00:00:00 2001 From: Abhishek Lekshmanan Date: Mon, 12 Mar 2018 19:14:46 +0100 Subject: [PATCH] rgw: rgw-rados, rgw-admin add an option to recalculate user stats Adds a method in rgw-rados to reset user stats calling the earlier implemented cls user reset stats. In rgw-admin we add an option called --reset-stats that invokes this method. Fixes: http://tracker.ceph.com/issues/23335 Signed-off-by: Abhishek Lekshmanan (cherry picked from commit 0b72dd7d3beea47b5c479eeb979b73c4cd70f7bc) (cherry picked from commit 0bd635b2133c7536f0f3e561579e4aab9cf72d59) --- src/rgw/rgw_admin.cc | 18 +++++++++++++++++- src/rgw/rgw_rados.cc | 17 +++++++++++++++++ src/rgw/rgw_rados.h | 1 + src/test/cli/radosgw-admin/help.t | 1 + 4 files changed, 36 insertions(+), 1 deletion(-) diff --git a/src/rgw/rgw_admin.cc b/src/rgw/rgw_admin.cc index 83427fe09f4a4..9cca76b0d4b89 100644 --- a/src/rgw/rgw_admin.cc +++ b/src/rgw/rgw_admin.cc @@ -288,6 +288,7 @@ void usage() cout << " (NOTE: required to delete a non-empty bucket)\n"; cout << " --sync-stats option to 'user stats', update user stats with current\n"; cout << " stats reported by user's buckets indexes\n"; + cout << " --reset-stats option to 'user stats', reset stats in accordance with user buckets\n"; cout << " --show-log-entries= enable/disable dump of log entries on log show\n"; cout << " --show-log-sum= enable/disable dump of log summation on log show\n"; cout << " --skip-zero-entries log show only dumps entries that don't have zero value\n"; @@ -2436,6 +2437,7 @@ int main(int argc, const char **argv) int include_all = false; int sync_stats = false; + int reset_stats = false; int bypass_gc = false; int warnings_only = false; int inconsistent_index = false; @@ -2672,6 +2674,8 @@ int main(int argc, const char **argv) // do nothing } else if (ceph_argparse_binary_flag(args, i, &sync_stats, NULL, "--sync-stats", (char*)NULL)) { // do nothing + } else if (ceph_argparse_binary_flag(args, i, &reset_stats, NULL, "--reset-stats", (char*)NULL)) { + // do nothing } else if (ceph_argparse_binary_flag(args, i, &include_all, NULL, "--include-all", (char*)NULL)) { // do nothing } else if (ceph_argparse_binary_flag(args, i, &extra_info, NULL, "--extra-info", (char*)NULL)) { @@ -6061,6 +6065,19 @@ next: return EINVAL; } + string user_str = user_id.to_str(); + if (reset_stats) { + if (!bucket_name.empty()){ + cerr << "ERROR: recalculate doesn't work on buckets" << std::endl; + return EINVAL; + } + ret = store->cls_user_reset_stats(user_str); + if (ret < 0) { + cerr << "ERROR: could not clear user stats: " << cpp_strerror(-ret) << std::endl; + return -ret; + } + } + if (sync_stats) { if (!bucket_name.empty()) { int ret = rgw_bucket_sync_user_stats(store, tenant, bucket_name); @@ -6078,7 +6095,6 @@ next: } cls_user_header header; - string user_str = user_id.to_str(); int ret = store->cls_user_get_header(user_str, &header); if (ret < 0) { if (ret == -ENOENT) { /* in case of ENOENT */ diff --git a/src/rgw/rgw_rados.cc b/src/rgw/rgw_rados.cc index b34077fb205b7..758aa063682b2 100644 --- a/src/rgw/rgw_rados.cc +++ b/src/rgw/rgw_rados.cc @@ -13287,6 +13287,23 @@ int RGWRados::cls_user_get_header(const string& user_id, cls_user_header *header return 0; } +int RGWRados::cls_user_reset_stats(const string& user_id) +{ + string buckets_obj_id; + rgw_get_buckets_obj(user_id, buckets_obj_id); + rgw_raw_obj obj(get_zone_params().user_uid_pool, buckets_obj_id); + + rgw_rados_ref ref; + int r = get_raw_obj_ref(obj, &ref); + if (r < 0) { + return r; + } + + librados::ObjectWriteOperation op; + ::cls_user_reset_stats(op); + return ref.ioctx.operate(ref.oid, &op); +} + int RGWRados::cls_user_get_header_async(const string& user_id, RGWGetUserHeader_CB *ctx) { string buckets_obj_id; diff --git a/src/rgw/rgw_rados.h b/src/rgw/rgw_rados.h index 13de667c06045..a5ba0325a606f 100644 --- a/src/rgw/rgw_rados.h +++ b/src/rgw/rgw_rados.h @@ -3581,6 +3581,7 @@ public: int fix_tail_obj_locator(const RGWBucketInfo& bucket_info, rgw_obj_key& key, bool fix, bool *need_fix); int cls_user_get_header(const string& user_id, cls_user_header *header); + int cls_user_reset_stats(const string& user_id); int cls_user_get_header_async(const string& user_id, RGWGetUserHeader_CB *ctx); int cls_user_sync_bucket_stats(rgw_raw_obj& user_obj, const RGWBucketInfo& bucket_info); int cls_user_list_buckets(rgw_raw_obj& obj, diff --git a/src/test/cli/radosgw-admin/help.t b/src/test/cli/radosgw-admin/help.t index a2cfee1813f43..28150cac7110d 100644 --- a/src/test/cli/radosgw-admin/help.t +++ b/src/test/cli/radosgw-admin/help.t @@ -229,6 +229,7 @@ (NOTE: required to delete a non-empty bucket) --sync-stats option to 'user stats', update user stats with current stats reported by user's buckets indexes + --reset-stats option to 'user stats', reset stats in accordance with user buckets --show-log-entries= enable/disable dump of log entries on log show --show-log-sum= enable/disable dump of log summation on log show --skip-zero-entries log show only dumps entries that don't have zero value -- 2.39.5