Skip to content

Commit a4ff703

Browse files
authored
Merge pull request ceph#59153 from ajarr/wip-67436
rbd: fix CLI output of `rbd group snap info` command when a group snapshot with no member images Reviewed-by: Ilya Dryomov <[email protected]> Reviewed-by: Sunil Angadi <[email protected]>
2 parents 9b32634 + 9ea0312 commit a4ff703

File tree

5 files changed

+72
-15
lines changed

5 files changed

+72
-15
lines changed

qa/workunits/rbd/rbd_groups.sh

Lines changed: 22 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -210,15 +210,32 @@ check_snapshot_info()
210210
local snap_name=$2
211211
local image_count=$3
212212

213-
local snap_info=$(rbd group snap info $group_name@$snap_name --format=json)
214-
local actual_snap_name=$(jq -r ".name" <<< "$snap_info")
213+
local snap_info_json=$(
214+
rbd group snap info $group_name@$snap_name --format=json)
215+
local actual_snap_name=$(jq -r ".name" <<< "$snap_info_json")
215216
test "$actual_snap_name" = "$snap_name" || return 1
216217

217-
local snap_state=$(jq -r ".state" <<< "$snap_info")
218+
local snap_state=$(jq -r ".state" <<< "$snap_info_json")
218219
test "$snap_state" = "complete" || return 1
219220

220-
local actual_image_count=$(jq '.images | length' <<< "$snap_info")
221-
test "$actual_image_count" = "$image_count"
221+
local actual_image_count=$(jq '.images | length' <<< "$snap_info_json")
222+
test "$actual_image_count" = "$image_count" || return 1
223+
224+
local image_snap_name=$(jq -r '.image_snap_name' <<< "$snap_info_json")
225+
local snap_info=$(rbd group snap info $group_name@$snap_name)
226+
local snap_state=$(grep -w 'state:' <<< "$snap_info" | tr -d '\t')
227+
test "$snap_state" = "state: complete" || return 1
228+
local image_snap_field=$(grep -w 'image snap:' <<< "$snap_info")
229+
local images_field=$(grep -w 'images:' <<< "$snap_info")
230+
if ((image_count != 0)); then
231+
test -n "$image_snap_name" || return 1
232+
test -n "$image_snap_field" || return 1
233+
test -n "$images_field" || return 1
234+
else
235+
test -z "$image_snap_name" || return 1
236+
test -z "$image_snap_field" || return 1
237+
test -z "$images_field" || return 1
238+
fi
222239
}
223240

224241
echo "TEST: create remove consistency group"

src/librbd/api/Group.cc

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -500,9 +500,10 @@ int GroupSnapshot_to_group_snap_info2(
500500
group_snap->id = cls_group_snap.id;
501501
group_snap->name = cls_group_snap.name;
502502
group_snap->state = static_cast<group_snap_state_t>(cls_group_snap.state);
503-
group_snap->image_snap_name = calc_ind_image_snap_name(group_ioctx.get_id(),
504-
group_id,
505-
cls_group_snap.id);
503+
if (!image_snaps.empty()) {
504+
group_snap->image_snap_name = calc_ind_image_snap_name(
505+
group_ioctx.get_id(), group_id, cls_group_snap.id);
506+
}
506507
group_snap->image_snaps = std::move(image_snaps);
507508

508509
return 0;

src/test/librbd/test_Groups.cc

Lines changed: 27 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -505,8 +505,6 @@ TEST_F(TestGroup, snap_get_info)
505505

506506
const char *gp_name = "gp_snapgetinfo";
507507
ASSERT_EQ(0, rbd_group_create(ioctx2, gp_name));
508-
ASSERT_EQ(0, rbd_group_image_add(ioctx2, gp_name, ioctx,
509-
m_image_name.c_str()));
510508

511509
const char *gp_snap_name = "snap_snapshot";
512510
ASSERT_EQ(0, rbd_group_snap_create(ioctx2, gp_name, gp_snap_name));
@@ -517,6 +515,20 @@ TEST_F(TestGroup, snap_get_info)
517515
ASSERT_EQ(-ENOENT, rbd_group_snap_get_info(ioctx2, gp_name, "absent",
518516
&gp_snap_info));
519517

518+
ASSERT_EQ(0, rbd_group_snap_get_info(ioctx2, gp_name, gp_snap_name,
519+
&gp_snap_info));
520+
ASSERT_STREQ(gp_snap_name, gp_snap_info.name);
521+
ASSERT_EQ(RBD_GROUP_SNAP_STATE_COMPLETE, gp_snap_info.state);
522+
ASSERT_STREQ("", gp_snap_info.image_snap_name);
523+
ASSERT_EQ(0U, gp_snap_info.image_snaps_count);
524+
525+
rbd_group_snap_get_info_cleanup(&gp_snap_info);
526+
ASSERT_EQ(0, rbd_group_snap_remove(ioctx2, gp_name, gp_snap_name));
527+
528+
ASSERT_EQ(0, rbd_group_image_add(ioctx2, gp_name, ioctx,
529+
m_image_name.c_str()));
530+
ASSERT_EQ(0, rbd_group_snap_create(ioctx2, gp_name, gp_snap_name));
531+
520532
ASSERT_EQ(0, rbd_group_snap_get_info(ioctx2, gp_name, gp_snap_name,
521533
&gp_snap_info));
522534
ASSERT_STREQ(gp_snap_name, gp_snap_info.name);
@@ -545,8 +557,6 @@ TEST_F(TestGroup, snap_get_infoPP)
545557

546558
const char *gp_name = "gp_snapgetinfoPP";
547559
ASSERT_EQ(0, m_rbd.group_create(ioctx2, gp_name));
548-
ASSERT_EQ(0, m_rbd.group_image_add(ioctx2, gp_name, m_ioctx,
549-
m_image_name.c_str()));
550560

551561
const char *gp_snap_name = "snap_snapshot";
552562
ASSERT_EQ(0, m_rbd.group_snap_create(ioctx2, gp_name, gp_snap_name));
@@ -557,6 +567,19 @@ TEST_F(TestGroup, snap_get_infoPP)
557567
ASSERT_EQ(-ENOENT, m_rbd.group_snap_get_info(ioctx2, gp_name, "absent",
558568
&gp_snap_info));
559569

570+
ASSERT_EQ(0, m_rbd.group_snap_get_info(ioctx2, gp_name, gp_snap_name,
571+
&gp_snap_info));
572+
ASSERT_EQ(gp_snap_name, gp_snap_info.name);
573+
ASSERT_EQ(RBD_GROUP_SNAP_STATE_COMPLETE, gp_snap_info.state);
574+
ASSERT_EQ("", gp_snap_info.image_snap_name);
575+
ASSERT_EQ(0U, gp_snap_info.image_snaps.size());
576+
577+
ASSERT_EQ(0, m_rbd.group_snap_remove(ioctx2, gp_name, gp_snap_name));
578+
579+
ASSERT_EQ(0, m_rbd.group_image_add(ioctx2, gp_name, m_ioctx,
580+
m_image_name.c_str()));
581+
ASSERT_EQ(0, m_rbd.group_snap_create(ioctx2, gp_name, gp_snap_name));
582+
560583
ASSERT_EQ(0, m_rbd.group_snap_get_info(ioctx2, gp_name, gp_snap_name,
561584
&gp_snap_info));
562585
ASSERT_EQ(gp_snap_name, gp_snap_info.name);

src/test/pybind/test_rbd.py

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2918,6 +2918,18 @@ def test_group_snap_get_info(self):
29182918
self.group.remove_snap(snap_name)
29192919
assert_raises(ObjectNotFound, self.group.get_snap_info, snap_name)
29202920

2921+
def test_group_snap_get_info_no_member_images(self):
2922+
self.group.create_snap(snap_name)
2923+
2924+
snap_info_dict = self.group.get_snap_info(snap_name)
2925+
assert sorted(snap_info_dict.keys()) == self.gp_snap_keys
2926+
assert snap_info_dict['name'] == snap_name
2927+
assert snap_info_dict['state'] == RBD_GROUP_SNAP_STATE_COMPLETE
2928+
assert snap_info_dict['image_snap_name'] == ""
2929+
assert snap_info_dict['image_snaps'] == []
2930+
2931+
self.group.remove_snap(snap_name)
2932+
29212933
def test_group_snap(self):
29222934
global snap_name
29232935
eq([], list(self.group.list_snaps()))

src/tools/rbd/action/Group.cc

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -805,9 +805,13 @@ int execute_group_snap_info(const po::variables_map &vm,
805805
} else {
806806
std::cout << "rbd group snapshot '" << group_snap.name << "':\n"
807807
<< "\tid: " << group_snap.id << std::endl
808-
<< "\tstate: " << state_string << std::endl
809-
<< "\timage snap: " << group_snap.image_snap_name << std::endl
810-
<< "\timages:" << std::endl;
808+
<< "\tstate: " << state_string << std::endl;
809+
if (!group_snap.image_snaps.empty()) {
810+
std::cout << "\timage snap: " << group_snap.image_snap_name << std::endl
811+
<< "\timages:" << std::endl;
812+
} else {
813+
ceph_assert(group_snap.image_snap_name.empty());
814+
}
811815
}
812816

813817
std::sort(group_snap.image_snaps.begin(), group_snap.image_snaps.end(),

0 commit comments

Comments
 (0)