From 74e8b2264a6162fc1d43000d0ebc9649d4dbfcf0 Mon Sep 17 00:00:00 2001 From: Ilya Dryomov Date: Mon, 10 Jun 2024 13:19:25 +0200 Subject: [PATCH] rbd: include original namespace type in "rbd snap ls --all" output Before (snap 22 comes from "rbd group snap create", snap 23 created manually with "rbd snap create"): SNAPID NAME SIZE PROTECTED TIMESTAMP NAMESPACE 21 f7cfdcfe-5f71-40e4-be82-3fb0e7caf2aa 1 GiB Mon Jun 10 09:23:40 2024 trash (mysnap) 22 bd67397f-32cb-48fe-b1ac-ef6f02319239 1 GiB Mon Jun 10 09:26:06 2024 trash (.group.2_1491b049b556_1497bf66f586) 23 27a5f053-8431-428e-ab33-be9d8b6cf51e 1 GiB Mon Jun 10 09:28:30 2024 trash (.group.2_1491b049b556_1497bf66f586) After: SNAPID NAME SIZE PROTECTED TIMESTAMP NAMESPACE 21 f7cfdcfe-5f71-40e4-be82-3fb0e7caf2aa 1 GiB Mon Jun 10 09:23:40 2024 trash (user mysnap) 22 bd67397f-32cb-48fe-b1ac-ef6f02319239 1 GiB Mon Jun 10 09:26:06 2024 trash (group .group.2_1491b049b556_1497bf66f586) 23 27a5f053-8431-428e-ab33-be9d8b6cf51e 1 GiB Mon Jun 10 09:28:30 2024 trash (user .group.2_1491b049b556_1497bf66f586) Signed-off-by: Ilya Dryomov (cherry picked from commit e5c3dd391c84d6d9c25bcf9278c402c664e164c1) --- PendingReleaseNotes | 2 + qa/workunits/rbd/cli_generic.sh | 2 +- qa/workunits/rbd/rbd_mirror_helpers.sh | 2 +- src/tools/rbd/action/Snap.cc | 51 ++++++++++++++------------ 4 files changed, 32 insertions(+), 25 deletions(-) diff --git a/PendingReleaseNotes b/PendingReleaseNotes index 16e26192486..235a81624f1 100644 --- a/PendingReleaseNotes +++ b/PendingReleaseNotes @@ -209,6 +209,8 @@ CephFS: Disallow delegating preallocated inode ranges to clients. Config intended primarily as a building block for cloning new groups from group snapshots created with `rbd group snap create` command, but has also been exposed via the new `--snap-id` option for `rbd clone` command. +* RBD: The output of `rbd snap ls --all` command now includes the original + type for trashed snapshots. >=18.0.0 diff --git a/qa/workunits/rbd/cli_generic.sh b/qa/workunits/rbd/cli_generic.sh index cb062c24ad8..ca9ffde8113 100755 --- a/qa/workunits/rbd/cli_generic.sh +++ b/qa/workunits/rbd/cli_generic.sh @@ -782,7 +782,7 @@ test_clone_v2() { rbd snap unprotect test1@1 rbd snap remove test1@1 - rbd snap list --all test1 | grep -E "trash \(1\) *$" + rbd snap list --all test1 | grep -E "trash \(user 1\) *$" rbd snap create test1@2 rbd rm test1 2>&1 | grep 'image has snapshots' diff --git a/qa/workunits/rbd/rbd_mirror_helpers.sh b/qa/workunits/rbd/rbd_mirror_helpers.sh index a1fa099bc42..ad114682be4 100755 --- a/qa/workunits/rbd/rbd_mirror_helpers.sh +++ b/qa/workunits/rbd/rbd_mirror_helpers.sh @@ -1215,7 +1215,7 @@ test_snap_moved_to_trash() local snap_name=$4 rbd --cluster ${cluster} snap ls ${pool}/${image} --all | - grep -F " trash (${snap_name})" + grep -F " trash (user ${snap_name})" } wait_for_snap_moved_to_trash() diff --git a/src/tools/rbd/action/Snap.cc b/src/tools/rbd/action/Snap.cc index 725319d8d9c..5f85f5d127d 100644 --- a/src/tools/rbd/action/Snap.cc +++ b/src/tools/rbd/action/Snap.cc @@ -24,6 +24,22 @@ static const std::string ALL_NAME("all"); namespace at = argument_types; namespace po = boost::program_options; +std::string get_snap_namespace_name(librbd::snap_namespace_type_t type) +{ + switch (type) { + case RBD_SNAP_NAMESPACE_TYPE_USER: + return "user"; + case RBD_SNAP_NAMESPACE_TYPE_GROUP: + return "group"; + case RBD_SNAP_NAMESPACE_TYPE_TRASH: + return "trash"; + case RBD_SNAP_NAMESPACE_TYPE_MIRROR: + return "mirror"; + default: + return "unknown (" + stringify(type) + ")"; + } +} + int do_list_snaps(librbd::Image& image, Formatter *f, bool all_snaps, librados::Rados& rados) { std::vector snaps; @@ -86,24 +102,8 @@ int do_list_snaps(librbd::Image& image, Formatter *f, bool all_snaps, librados:: 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; - case RBD_SNAP_NAMESPACE_TYPE_MIRROR: - snap_namespace_name = "mirror"; - break; - } - int get_trash_res = -ENOENT; - std::string trash_original_name; + librbd::snap_trash_namespace_t trash_snap; int get_group_res = -ENOENT; librbd::snap_group_namespace_t group_snap; int get_mirror_res = -ENOENT; @@ -113,8 +113,8 @@ int do_list_snaps(librbd::Image& image, Formatter *f, bool all_snaps, librados:: get_group_res = image.snap_get_group_namespace(s->id, &group_snap, sizeof(group_snap)); } else if (snap_namespace == RBD_SNAP_NAMESPACE_TYPE_TRASH) { - get_trash_res = image.snap_get_trash_namespace( - s->id, &trash_original_name); + get_trash_res = image.snap_get_trash_namespace2( + s->id, &trash_snap, sizeof(trash_snap)); } else if (snap_namespace == RBD_SNAP_NAMESPACE_TYPE_MIRROR) { get_mirror_res = image.snap_get_mirror_namespace( s->id, &mirror_snap, sizeof(mirror_snap)); @@ -152,14 +152,17 @@ 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); + f->dump_string("type", get_snap_namespace_name(snap_namespace)); if (get_group_res == 0) { std::string pool_name = pool_map[group_snap.group_pool]; f->dump_string("pool", pool_name); f->dump_string("group", group_snap.group_name); f->dump_string("group snap", group_snap.group_snap_name); } else if (get_trash_res == 0) { - f->dump_string("original_name", trash_original_name); + f->dump_string("original_namespace_type", + get_snap_namespace_name( + trash_snap.original_namespace_type)); + f->dump_string("original_name", trash_snap.original_name); } else if (get_mirror_res == 0) { f->dump_string("state", mirror_snap_state); f->open_array_section("mirror_peer_uuids"); @@ -187,7 +190,7 @@ int do_list_snaps(librbd::Image& image, Formatter *f, bool all_snaps, librados:: if (all_snaps) { std::ostringstream oss; - oss << snap_namespace_name; + oss << get_snap_namespace_name(snap_namespace); if (get_group_res == 0) { std::string pool_name = pool_map[group_snap.group_pool]; @@ -195,7 +198,9 @@ int do_list_snaps(librbd::Image& image, Formatter *f, bool all_snaps, librados:: << group_snap.group_name << "@" << group_snap.group_snap_name << ")"; } else if (get_trash_res == 0) { - oss << " (" << trash_original_name << ")"; + oss << " (" + << get_snap_namespace_name(trash_snap.original_namespace_type) + << " " << trash_snap.original_name << ")"; } else if (get_mirror_res == 0) { oss << " (" << mirror_snap_state << " " << "peer_uuids:[" << mirror_snap.mirror_peer_uuids << "]"; -- 2.39.5