From ac93fb9ebaaaf5ceca1a730a199b5e007d346820 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) Conflicts: src/rgw/rgw_admin.cc whitespace conflict src/rgw_rados.cc switch to jewel version of get_obj_ref (where raw version isn't available) jewel only admin fixes --- src/rgw/rgw_admin.cc | 23 ++++++++++++++++++++++- src/rgw/rgw_rados.cc | 18 ++++++++++++++++++ src/rgw/rgw_rados.h | 1 + src/test/cli/radosgw-admin/help.t | 1 + 4 files changed, 42 insertions(+), 1 deletion(-) diff --git a/src/rgw/rgw_admin.cc b/src/rgw/rgw_admin.cc index 1e2e3f34d92a4..40908a9cfa5eb 100644 --- a/src/rgw/rgw_admin.cc +++ b/src/rgw/rgw_admin.cc @@ -240,6 +240,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"; @@ -2281,6 +2282,7 @@ int main(int argc, 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; @@ -2503,6 +2505,8 @@ int main(int argc, 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)) { @@ -5411,6 +5415,24 @@ next: } if (opt_cmd == OPT_USER_STATS) { + if (user_id.empty()) { + cerr << "ERROR: uid not specified" << std::endl; + 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); @@ -5432,7 +5454,6 @@ next: return EINVAL; } cls_user_header header; - string user_str = user_id.to_str(); int ret = store->cls_user_get_header(user_str, &header); if (ret < 0) { cerr << "ERROR: can't read user header: " << cpp_strerror(-ret) << std::endl; diff --git a/src/rgw/rgw_rados.cc b/src/rgw/rgw_rados.cc index f1a3c89920753..1efa2fffe90eb 100644 --- a/src/rgw/rgw_rados.cc +++ b/src/rgw/rgw_rados.cc @@ -12203,6 +12203,24 @@ 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_obj obj(get_zone_params().user_uid_pool, buckets_obj_id); + + rgw_rados_ref ref; + rgw_bucket bucket; + int r = get_obj_ref(obj, &ref, &bucket); + 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 e8751ddd1dd64..88a95d81beaca 100644 --- a/src/rgw/rgw_rados.h +++ b/src/rgw/rgw_rados.h @@ -2998,6 +2998,7 @@ public: int fix_tail_obj_locator(rgw_bucket& bucket, 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_obj& user_obj, rgw_bucket& bucket); int update_user_bucket_stats(const string& user_id, rgw_bucket& bucket, RGWStorageStats& stats); diff --git a/src/test/cli/radosgw-admin/help.t b/src/test/cli/radosgw-admin/help.t index fdae837259f6d..0850eba426eb1 100644 --- a/src/test/cli/radosgw-admin/help.t +++ b/src/test/cli/radosgw-admin/help.t @@ -189,6 +189,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