Skip to content

Commit e5c3dd3

Browse files
committed
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 <[email protected]>
1 parent ed09f34 commit e5c3dd3

File tree

4 files changed

+32
-25
lines changed

4 files changed

+32
-25
lines changed

PendingReleaseNotes

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -230,6 +230,8 @@ CephFS: Disallow delegating preallocated inode ranges to clients. Config
230230
intended primarily as a building block for cloning new groups from group
231231
snapshots created with `rbd group snap create` command, but has also been
232232
exposed via the new `--snap-id` option for `rbd clone` command.
233+
* RBD: The output of `rbd snap ls --all` command now includes the original
234+
type for trashed snapshots.
233235

234236
>=18.0.0
235237

qa/workunits/rbd/cli_generic.sh

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -782,7 +782,7 @@ test_clone_v2() {
782782
rbd snap unprotect test1@1
783783

784784
rbd snap remove test1@1
785-
rbd snap list --all test1 | grep -E "trash \(1\) *$"
785+
rbd snap list --all test1 | grep -E "trash \(user 1\) *$"
786786

787787
rbd snap create test1@2
788788
rbd rm test1 2>&1 | grep 'image has snapshots'

qa/workunits/rbd/rbd_mirror_helpers.sh

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1215,7 +1215,7 @@ test_snap_moved_to_trash()
12151215
local snap_name=$4
12161216

12171217
rbd --cluster ${cluster} snap ls ${pool}/${image} --all |
1218-
grep -F " trash (${snap_name})"
1218+
grep -F " trash (user ${snap_name})"
12191219
}
12201220

12211221
wait_for_snap_moved_to_trash()

src/tools/rbd/action/Snap.cc

Lines changed: 28 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,22 @@ static const std::string ALL_NAME("all");
2424
namespace at = argument_types;
2525
namespace po = boost::program_options;
2626

27+
std::string get_snap_namespace_name(librbd::snap_namespace_type_t type)
28+
{
29+
switch (type) {
30+
case RBD_SNAP_NAMESPACE_TYPE_USER:
31+
return "user";
32+
case RBD_SNAP_NAMESPACE_TYPE_GROUP:
33+
return "group";
34+
case RBD_SNAP_NAMESPACE_TYPE_TRASH:
35+
return "trash";
36+
case RBD_SNAP_NAMESPACE_TYPE_MIRROR:
37+
return "mirror";
38+
default:
39+
return "unknown (" + stringify(type) + ")";
40+
}
41+
}
42+
2743
int do_list_snaps(librbd::Image& image, Formatter *f, bool all_snaps, librados::Rados& rados)
2844
{
2945
std::vector<librbd::snap_info_t> snaps;
@@ -86,24 +102,8 @@ int do_list_snaps(librbd::Image& image, Formatter *f, bool all_snaps, librados::
86102
return r;
87103
}
88104

89-
std::string snap_namespace_name = "Unknown";
90-
switch (snap_namespace) {
91-
case RBD_SNAP_NAMESPACE_TYPE_USER:
92-
snap_namespace_name = "user";
93-
break;
94-
case RBD_SNAP_NAMESPACE_TYPE_GROUP:
95-
snap_namespace_name = "group";
96-
break;
97-
case RBD_SNAP_NAMESPACE_TYPE_TRASH:
98-
snap_namespace_name = "trash";
99-
break;
100-
case RBD_SNAP_NAMESPACE_TYPE_MIRROR:
101-
snap_namespace_name = "mirror";
102-
break;
103-
}
104-
105105
int get_trash_res = -ENOENT;
106-
std::string trash_original_name;
106+
librbd::snap_trash_namespace_t trash_snap;
107107
int get_group_res = -ENOENT;
108108
librbd::snap_group_namespace_t group_snap;
109109
int get_mirror_res = -ENOENT;
@@ -113,8 +113,8 @@ int do_list_snaps(librbd::Image& image, Formatter *f, bool all_snaps, librados::
113113
get_group_res = image.snap_get_group_namespace(s->id, &group_snap,
114114
sizeof(group_snap));
115115
} else if (snap_namespace == RBD_SNAP_NAMESPACE_TYPE_TRASH) {
116-
get_trash_res = image.snap_get_trash_namespace(
117-
s->id, &trash_original_name);
116+
get_trash_res = image.snap_get_trash_namespace2(
117+
s->id, &trash_snap, sizeof(trash_snap));
118118
} else if (snap_namespace == RBD_SNAP_NAMESPACE_TYPE_MIRROR) {
119119
get_mirror_res = image.snap_get_mirror_namespace(
120120
s->id, &mirror_snap, sizeof(mirror_snap));
@@ -152,14 +152,17 @@ int do_list_snaps(librbd::Image& image, Formatter *f, bool all_snaps, librados::
152152
f->dump_string("timestamp", tt_str);
153153
if (all_snaps) {
154154
f->open_object_section("namespace");
155-
f->dump_string("type", snap_namespace_name);
155+
f->dump_string("type", get_snap_namespace_name(snap_namespace));
156156
if (get_group_res == 0) {
157157
std::string pool_name = pool_map[group_snap.group_pool];
158158
f->dump_string("pool", pool_name);
159159
f->dump_string("group", group_snap.group_name);
160160
f->dump_string("group snap", group_snap.group_snap_name);
161161
} else if (get_trash_res == 0) {
162-
f->dump_string("original_name", trash_original_name);
162+
f->dump_string("original_namespace_type",
163+
get_snap_namespace_name(
164+
trash_snap.original_namespace_type));
165+
f->dump_string("original_name", trash_snap.original_name);
163166
} else if (get_mirror_res == 0) {
164167
f->dump_string("state", mirror_snap_state);
165168
f->open_array_section("mirror_peer_uuids");
@@ -187,15 +190,17 @@ int do_list_snaps(librbd::Image& image, Formatter *f, bool all_snaps, librados::
187190

188191
if (all_snaps) {
189192
std::ostringstream oss;
190-
oss << snap_namespace_name;
193+
oss << get_snap_namespace_name(snap_namespace);
191194

192195
if (get_group_res == 0) {
193196
std::string pool_name = pool_map[group_snap.group_pool];
194197
oss << " (" << pool_name << "/"
195198
<< group_snap.group_name << "@"
196199
<< group_snap.group_snap_name << ")";
197200
} else if (get_trash_res == 0) {
198-
oss << " (" << trash_original_name << ")";
201+
oss << " ("
202+
<< get_snap_namespace_name(trash_snap.original_namespace_type)
203+
<< " " << trash_snap.original_name << ")";
199204
} else if (get_mirror_res == 0) {
200205
oss << " (" << mirror_snap_state << " "
201206
<< "peer_uuids:[" << mirror_snap.mirror_peer_uuids << "]";

0 commit comments

Comments
 (0)