Skip to content

Commit

Permalink
Merge pull request #8870: jewel: rbd disk-usage CLI command should su…
Browse files Browse the repository at this point in the history
…pport calculating full image usage

Reviewed-by: Loic Dachary <ldachary@redhat.com>
  • Loading branch information
Loic Dachary committed May 10, 2016
2 parents a578af1 + 63738d4 commit fc898bc
Show file tree
Hide file tree
Showing 2 changed files with 29 additions and 5 deletions.
2 changes: 2 additions & 0 deletions src/test/cli/rbd/help.t
Expand Up @@ -282,6 +282,7 @@
rbd help disk-usage
usage: rbd disk-usage [--pool <pool>] [--image <image>] [--snap <snap>]
[--format <format>] [--pretty-format]
[--from-snap <from-snap>]
<image-or-snap-spec>

Show disk usage stats for pool, image or snapshot
Expand All @@ -296,6 +297,7 @@
--snap arg snapshot name
--format arg output format [plain, json, or xml]
--pretty-format pretty formatting (json and xml)
--from-snap arg snapshot starting point

rbd help export
usage: rbd export [--pool <pool>] [--image <image>] [--snap <snap>]
Expand Down
32 changes: 27 additions & 5 deletions src/tools/rbd/action/DiskUsage.cc
Expand Up @@ -86,8 +86,8 @@ 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,
Formatter *f) {
const char *imgname, const char *snapname,
const char *from_snapname, Formatter *f) {
std::vector<std::string> names;
int r = rbd.list(io_ctx, names);
if (r == -ENOENT) {
Expand All @@ -106,6 +106,7 @@ static int do_disk_usage(librbd::RBD &rbd, librados::IoCtx &io_ctx,
tbl.define_column("USED", TextTable::RIGHT, TextTable::RIGHT);
}

uint32_t count = 0;
uint64_t used_size = 0;
uint64_t total_prov = 0;
uint64_t total_used = 0;
Expand Down Expand Up @@ -152,6 +153,7 @@ static int do_disk_usage(librbd::RBD &rbd, librados::IoCtx &io_ctx,
continue;
}

bool found_from_snap = (from_snapname == nullptr);
std::string last_snap_name;
std::sort(snap_list.begin(), snap_list.end(),
boost::bind(&librbd::snap_info_t::id, _1) <
Expand All @@ -167,7 +169,8 @@ static int do_disk_usage(librbd::RBD &rbd, librados::IoCtx &io_ctx,
goto out;
}

if (imgname == NULL || (snapname != NULL && snap->name == snapname)) {
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,
&used_size);
Expand All @@ -179,6 +182,15 @@ static int do_disk_usage(librbd::RBD &rbd, librados::IoCtx &io_ctx,
total_prov += snap->size;
}
total_used += used_size;
++count;
}

if (!found_from_snap && from_snapname != nullptr &&
snap->name == from_snapname) {
found_from_snap = true;
}
if (snapname != nullptr && snap->name == snapname) {
break;
}
last_snap_name = snap->name;
}
Expand All @@ -191,6 +203,7 @@ static int do_disk_usage(librbd::RBD &rbd, librados::IoCtx &io_ctx,
}
total_prov += info.size;
total_used += used_size;
++count;
}
}

Expand All @@ -204,7 +217,7 @@ static int do_disk_usage(librbd::RBD &rbd, librados::IoCtx &io_ctx,
f->close_section();
f->flush(std::cout);
} else {
if (imgname == NULL) {
if (count > 1) {
tbl << "<TOTAL>"
<< stringify(si_t(total_prov))
<< stringify(si_t(total_used))
Expand All @@ -221,6 +234,9 @@ void get_arguments(po::options_description *positional,
at::add_image_or_snap_spec_options(positional, options,
at::ARGUMENT_MODIFIER_NONE);
at::add_format_options(options);
options->add_options()
(at::FROM_SNAPSHOT_NAME.c_str(), po::value<std::string>(),
"snapshot starting point");
}

int execute(const po::variables_map &vm) {
Expand All @@ -231,11 +247,16 @@ int execute(const po::variables_map &vm) {
int r = utils::get_pool_image_snapshot_names(
vm, at::ARGUMENT_MODIFIER_NONE, &arg_index, &pool_name, &image_name,
&snap_name, utils::SNAPSHOT_PRESENCE_PERMITTED,
utils::SPEC_VALIDATION_NONE, false);
utils::SPEC_VALIDATION_NONE, vm.count(at::FROM_SNAPSHOT_NAME));
if (r < 0) {
return r;
}

std::string from_snap_name;
if (vm.count(at::FROM_SNAPSHOT_NAME)) {
from_snap_name = vm[at::FROM_SNAPSHOT_NAME].as<std::string>();
}

at::Format::Formatter formatter;
r = utils::get_formatter(vm, &formatter);
if (r < 0) {
Expand All @@ -253,6 +274,7 @@ int execute(const po::variables_map &vm) {
r = do_disk_usage(rbd, io_ctx,
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());
if (r < 0) {
std::cerr << "du failed: " << cpp_strerror(r) << std::endl;
Expand Down

0 comments on commit fc898bc

Please sign in to comment.