]> git.apps.os.sepia.ceph.com Git - ceph-ci.git/commitdiff
rbd: include original namespace type in "rbd snap ls --all" output
authorIlya Dryomov <idryomov@gmail.com>
Mon, 10 Jun 2024 11:19:25 +0000 (13:19 +0200)
committerIlya Dryomov <idryomov@gmail.com>
Fri, 14 Jun 2024 07:26:35 +0000 (09:26 +0200)
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 <idryomov@gmail.com>
(cherry picked from commit e5c3dd391c84d6d9c25bcf9278c402c664e164c1)

PendingReleaseNotes
qa/workunits/rbd/cli_generic.sh
qa/workunits/rbd/rbd_mirror_helpers.sh
src/tools/rbd/action/Snap.cc

index 16e26192486af62d6fef38155b7dcbcbe3b14d68..235a81624f185e66db6981fe5bc29e3abb9bb9fb 100644 (file)
@@ -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
 
index cb062c24ad8d13bead678fc1b5d2d855f172fe5a..ca9ffde8113f2d5c8c21abf7b794f959ee5ad771 100755 (executable)
@@ -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'
index a1fa099bc4252cd8f453d1297378e090c469164f..ad114682be4be58ded6f74378a933607fc99db07 100755 (executable)
@@ -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()
index 725319d8d9cd6b05bb39f678ff834ac5b0a4f0e6..5f85f5d127d585c9b3dd71d7c0bda087d74681b3 100644 (file)
@@ -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<librbd::snap_info_t> 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 << "]";