From: Jason Dillaman Date: Wed, 24 Jan 2018 20:34:19 +0000 (-0500) Subject: rbd: resolve names of snapshot namespaces X-Git-Tag: v13.0.2~327^2~23 X-Git-Url: http://git-server-git.apps.pok.os.sepia.ceph.com/?a=commitdiff_plain;h=afc9274e635dc79386b2ee9f7f9cf2fcbe556357;p=ceph.git rbd: resolve names of snapshot namespaces Signed-off-by: Jason Dillaman --- diff --git a/src/tools/rbd/action/Snap.cc b/src/tools/rbd/action/Snap.cc index 47a6dbd295fc..533e3d4349af 100644 --- a/src/tools/rbd/action/Snap.cc +++ b/src/tools/rbd/action/Snap.cc @@ -40,8 +40,10 @@ int do_list_snaps(librbd::Image& image, Formatter *f, bool all_snaps, librados:: int r; r = image.snap_list(snaps); - if (r < 0) + if (r < 0) { + std::cerr << "rbd: unable to list snapshots" << std::endl; return r; + } if (!all_snaps) { snaps.erase(remove_if(snaps.begin(), @@ -76,9 +78,33 @@ int do_list_snaps(librbd::Image& image, Formatter *f, bool all_snaps, librados:: tt_str = ctime(&tt); tt_str = tt_str.substr(0, tt_str.length() - 1); } + + librbd::snap_namespace_type_t snap_namespace; + r = image.snap_get_namespace_type(s->id, &snap_namespace); + if (r < 0) { + std::cerr << "rbd: unable to retrieve snap namespace" << std::endl; + return r; + } + + std::string snap_namespace_name = "Unknown"; + switch (snap_namespace) { + case RBD_SNAP_NAMESPACE_TYPE_USER: + snap_namespace_name = "user"; + break; + case RBD_SNAP_NAMESPACE_TYPE_GROUP: + snap_namespace_name = "group"; + break; + case RBD_SNAP_NAMESPACE_TYPE_TRASH: + snap_namespace_name = "trash"; + break; + } + + int get_group_res = -ENOENT; librbd::snap_group_namespace_t group_snap; - int get_group_res = image.snap_get_group_namespace(s->id, &group_snap, - sizeof(group_snap)); + if (snap_namespace == RBD_SNAP_NAMESPACE_TYPE_GROUP) { + get_group_res = image.snap_get_group_namespace(s->id, &group_snap, + sizeof(group_snap)); + } if (f) { f->open_object_section("snapshot"); @@ -88,6 +114,7 @@ int do_list_snaps(librbd::Image& image, Formatter *f, bool all_snaps, librados:: f->dump_string("timestamp", tt_str); if (all_snaps) { f->open_object_section("namespace"); + f->dump_string("type", snap_namespace_name); if (get_group_res == 0) { std::string pool_name = pool_map[group_snap.group_pool]; f->dump_string("pool", pool_name); @@ -98,19 +125,20 @@ int do_list_snaps(librbd::Image& image, Formatter *f, bool all_snaps, librados:: } f->close_section(); } else { - std::string namespace_string; - if (all_snaps && (get_group_res == 0)) { - ostringstream oss; - std::string pool_name = pool_map[group_snap.group_pool]; - oss << "group snapshot (" << pool_name << "/" << - group_snap.group_name << "@" << - group_snap.group_snap_name << ")"; - - namespace_string = oss.str(); - } t << s->id << s->name << stringify(prettybyte_t(s->size)) << tt_str; + if (all_snaps) { - t << namespace_string; + ostringstream oss; + oss << snap_namespace_name; + + if (get_group_res == 0) { + std::string pool_name = pool_map[group_snap.group_pool]; + oss << " (" << pool_name << "/" + << group_snap.group_name << "@" + << group_snap.group_snap_name << ")"; + } + + t << oss.str(); } t << TextTable::endrow; }