Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

jewel: rbd disk-usage CLI command should support calculating full image usage #8870

Merged
merged 1 commit into from May 10, 2016
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Jump to
Jump to file
Failed to load files.
Diff view
Diff view
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