From 486483881accf766a837009695280f7c30d50d96 Mon Sep 17 00:00:00 2001 From: Jason Dillaman Date: Wed, 9 May 2018 13:13:56 -0400 Subject: [PATCH] rbd: disk-usage can now optionally compute exact on-disk usage Fixes: http://tracker.ceph.com/issues/24064 Signed-off-by: Jason Dillaman --- src/test/cli/rbd/help.t | 3 ++- src/tools/rbd/action/DiskUsage.cc | 15 ++++++++------- 2 files changed, 10 insertions(+), 8 deletions(-) diff --git a/src/test/cli/rbd/help.t b/src/test/cli/rbd/help.t index 7206c7a57f7..bce34fcd855 100644 --- a/src/test/cli/rbd/help.t +++ b/src/test/cli/rbd/help.t @@ -425,7 +425,7 @@ rbd help disk-usage usage: rbd disk-usage [--pool ] [--image ] [--snap ] [--format ] [--pretty-format] - [--from-snap ] + [--from-snap ] [--exact] Show disk usage stats for pool, image or snapshot. @@ -441,6 +441,7 @@ --format arg output format (plain, json, or xml) [default: plain] --pretty-format pretty formatting (json and xml) --from-snap arg snapshot starting point + --exact compute exact disk usage (slow) rbd help export usage: rbd export [--pool ] [--image ] [--snap ] diff --git a/src/tools/rbd/action/DiskUsage.cc b/src/tools/rbd/action/DiskUsage.cc index 2df2d3606fd..5705bdfe780 100644 --- a/src/tools/rbd/action/DiskUsage.cc +++ b/src/tools/rbd/action/DiskUsage.cc @@ -34,7 +34,7 @@ static int compute_image_disk_usage(const std::string& name, const std::string& snap_name, const std::string& from_snap_name, librbd::Image &image, uint64_t size, - TextTable& tbl, Formatter *f, + bool exact, TextTable& tbl, Formatter *f, uint64_t *used_size) { const char* from = NULL; if (!from_snap_name.empty()) { @@ -55,7 +55,7 @@ static int compute_image_disk_usage(const std::string& name, } *used_size = 0; - r = image.diff_iterate2(from, 0, size, false, true, + r = image.diff_iterate2(from, 0, size, false, !exact, &disk_usage_callback, used_size); if (r < 0) { std::cerr << "rbd: failed to iterate diffs: " << cpp_strerror(r) @@ -87,7 +87,7 @@ static int compute_image_disk_usage(const std::string& name, static int do_disk_usage(librbd::RBD &rbd, librados::IoCtx &io_ctx, const char *imgname, const char *snapname, - const char *from_snapname, Formatter *f) { + const char *from_snapname, bool exact, Formatter *f) { std::vector names; int r = rbd.list(io_ctx, names); if (r == -ENOENT) { @@ -179,7 +179,7 @@ static int do_disk_usage(librbd::RBD &rbd, librados::IoCtx &io_ctx, if (imgname == nullptr || found_from_snap || (found_from_snap && snapname != nullptr && snap->name == snapname)) { r = compute_image_disk_usage(*name, snap->name, last_snap_name, - snap_image, snap->size, tbl, f, + snap_image, snap->size, exact, tbl, f, &used_size); if (r < 0) { goto out; @@ -204,7 +204,7 @@ static int do_disk_usage(librbd::RBD &rbd, librados::IoCtx &io_ctx, if (snapname == NULL) { r = compute_image_disk_usage(*name, "", last_snap_name, image, info.size, - tbl, f, &used_size); + exact, tbl, f, &used_size); if (r < 0) { goto out; } @@ -247,7 +247,8 @@ void get_arguments(po::options_description *positional, at::add_format_options(options); options->add_options() (at::FROM_SNAPSHOT_NAME.c_str(), po::value(), - "snapshot starting point"); + "snapshot starting point") + ("exact", po::bool_switch(), "compute exact disk usage (slow)"); } int execute(const po::variables_map &vm, @@ -287,7 +288,7 @@ int execute(const po::variables_map &vm, image_name.empty() ? nullptr: image_name.c_str(), snap_name.empty() ? nullptr : snap_name.c_str(), from_snap_name.empty() ? nullptr : from_snap_name.c_str(), - formatter.get()); + vm["exact"].as(), formatter.get()); if (r < 0) { std::cerr << "rbd: du failed: " << cpp_strerror(r) << std::endl; return r; -- 2.39.5