From 0d81674eee92536503bdfacad8fdebe42fee5a19 Mon Sep 17 00:00:00 2001 From: Jason Dillaman Date: Mon, 24 Oct 2016 11:43:33 -0400 Subject: [PATCH] librbd: ensure consistency groups will gracefully fail on older OSDs Attempting to retrieve the group spec will fail on older OSDs, so it must be executed as an individual step in the refresh state machine. Also fixed code style issues for out parameters. Signed-off-by: Jason Dillaman --- src/cls/rbd/cls_rbd_client.cc | 53 +++++++++++-------- src/cls/rbd/cls_rbd_client.h | 13 ++--- src/include/rbd/librbd.hpp | 4 +- src/librbd/Group.cc | 17 +++--- src/librbd/Group.h | 5 +- src/librbd/image/RefreshRequest.cc | 48 +++++++++++++++-- src/librbd/image/RefreshRequest.h | 6 +++ src/librbd/internal.cc | 9 +++- src/librbd/librbd.cc | 8 +-- src/test/cls_rbd/test_cls_rbd.cc | 13 ++--- .../librbd/image/test_mock_RefreshRequest.cc | 29 ++++++++-- src/test/librbd/test_ConsistencyGroups.cc | 8 +-- src/tools/rbd/action/Group.cc | 4 +- 13 files changed, 153 insertions(+), 64 deletions(-) diff --git a/src/cls/rbd/cls_rbd_client.cc b/src/cls/rbd/cls_rbd_client.cc index 44d3572f693..9cbbef31f08 100644 --- a/src/cls/rbd/cls_rbd_client.cc +++ b/src/cls/rbd/cls_rbd_client.cc @@ -74,7 +74,6 @@ namespace librbd { ::encode(snap, parent_bl); op->exec("rbd", "get_parent", parent_bl); - op->exec("rbd", "image_get_group", empty_bl); rados::cls::lock::get_lock_info_start(op, RBD_LOCK_NAME); } @@ -84,8 +83,7 @@ namespace librbd { std::map *lockers, bool *exclusive_lock, std::string *lock_tag, - ::SnapContext *snapc, parent_info *parent, - cls::rbd::GroupSpec *group_ref) { + ::SnapContext *snapc, parent_info *parent) { assert(size); assert(features); assert(incompatible_features); @@ -93,7 +91,6 @@ namespace librbd { assert(exclusive_lock); assert(snapc); assert(parent); - assert(group_ref); try { uint8_t order; @@ -110,8 +107,6 @@ namespace librbd { ::decode(parent->spec.image_id, *it); ::decode(parent->spec.snap_id, *it); ::decode(parent->overlap, *it); - // group_image_get_group - ::decode(*group_ref, *it); // get_lock_info ClsLockType lock_type = LOCK_NONE; @@ -137,8 +132,7 @@ namespace librbd { bool *exclusive_lock, string *lock_tag, ::SnapContext *snapc, - parent_info *parent, - cls::rbd::GroupSpec *group_ref) + parent_info *parent) { librados::ObjectReadOperation op; get_mutable_metadata_start(&op, read_only); @@ -153,7 +147,7 @@ namespace librbd { return get_mutable_metadata_finish(&it, size, features, incompatible_features, lockers, exclusive_lock, lock_tag, snapc, - parent, group_ref); + parent); } void create_image(librados::ObjectWriteOperation *op, uint64_t size, @@ -1702,9 +1696,10 @@ namespace librbd { } int group_image_list(librados::IoCtx *ioctx, - const std::string &oid, const cls::rbd::GroupImageSpec &start, + const std::string &oid, + const cls::rbd::GroupImageSpec &start, uint64_t max_return, - std::vector& images) + std::vector *images) { bufferlist bl, bl2; ::encode(start, bl); @@ -1716,7 +1711,7 @@ namespace librbd { bufferlist::iterator iter = bl2.begin(); try { - ::decode(images, iter); + ::decode(*images, iter); } catch (const buffer::error &err) { return -EBADMSG; } @@ -1751,24 +1746,38 @@ namespace librbd { return ioctx->exec(oid, "rbd", "image_remove_group", bl, bl2); } - int image_get_group(librados::IoCtx *ioctx, const std::string &oid, - cls::rbd::GroupSpec &group_spec) + void image_get_group_start(librados::ObjectReadOperation *op) { - bufferlist in, out; - - int r = ioctx->exec(oid, "rbd", "image_get_group", in, out); - if (r < 0) - return r; + bufferlist in_bl; + op->exec("rbd", "image_get_group", in_bl); + } - bufferlist::iterator iter = out.begin(); + int image_get_group_finish(bufferlist::iterator *iter, + cls::rbd::GroupSpec *group_spec) + { try { - ::decode(group_spec, iter); + ::decode(*group_spec, *iter); } catch (const buffer::error &err) { return -EBADMSG; } - return 0; } + int image_get_group(librados::IoCtx *ioctx, const std::string &oid, + cls::rbd::GroupSpec *group_spec) + { + librados::ObjectReadOperation op; + image_get_group_start(&op); + + bufferlist out_bl; + int r = ioctx->operate(oid, &op, &out_bl); + if (r < 0) { + return r; + } + + bufferlist::iterator iter = out_bl.begin(); + return image_get_group_finish(&iter, group_spec); + } + } // namespace cls_client } // namespace librbd diff --git a/src/cls/rbd/cls_rbd_client.h b/src/cls/rbd/cls_rbd_client.h index d16033d1935..0b74a25394f 100644 --- a/src/cls/rbd/cls_rbd_client.h +++ b/src/cls/rbd/cls_rbd_client.h @@ -35,8 +35,7 @@ namespace librbd { std::map *lockers, bool *exclusive_lock, std::string *lock_tag, - ::SnapContext *snapc, parent_info *parent, - cls::rbd::GroupSpec *uplink); + ::SnapContext *snapc, parent_info *parent); int get_mutable_metadata(librados::IoCtx *ioctx, const std::string &oid, bool read_only, uint64_t *size, uint64_t *features, uint64_t *incompatible_features, @@ -45,8 +44,7 @@ namespace librbd { bool *exclusive_lock, std::string *lock_tag, ::SnapContext *snapc, - parent_info *parent, - cls::rbd::GroupSpec *uplink); + parent_info *parent); // low-level interface (mainly for testing) void create_image(librados::ObjectWriteOperation *op, uint64_t size, @@ -346,15 +344,18 @@ namespace librbd { int group_image_list(librados::IoCtx *ioctx, const std::string &oid, const cls::rbd::GroupImageSpec &start, uint64_t max_return, - std::vector& images); + std::vector *images); int group_image_set(librados::IoCtx *ioctx, const std::string &oid, const cls::rbd::GroupImageStatus &st); int image_add_group(librados::IoCtx *ioctx, const std::string &oid, const cls::rbd::GroupSpec &group_spec); int image_remove_group(librados::IoCtx *ioctx, const std::string &oid, const cls::rbd::GroupSpec &group_spec); + void image_get_group_start(librados::ObjectReadOperation *op); + int image_get_group_finish(bufferlist::iterator *iter, + cls::rbd::GroupSpec *group_spec); int image_get_group(librados::IoCtx *ioctx, const std::string &oid, - cls::rbd::GroupSpec &s); + cls::rbd::GroupSpec *group_spec); } // namespace cls_client } // namespace librbd diff --git a/src/include/rbd/librbd.hpp b/src/include/rbd/librbd.hpp index fb5e6d0ebcd..83e61d44610 100644 --- a/src/include/rbd/librbd.hpp +++ b/src/include/rbd/librbd.hpp @@ -164,14 +164,14 @@ public: // RBD consistency groups support functions int group_create(IoCtx& io_ctx, const char *group_name); int group_remove(IoCtx& io_ctx, const char *group_name); - int group_list(IoCtx& io_ctx, std::vector& names); + int group_list(IoCtx& io_ctx, std::vector *names); int group_image_add(IoCtx& io_ctx, const char *group_name, IoCtx& image_io_ctx, const char *image_name); int group_image_remove(IoCtx& io_ctx, const char *group_name, IoCtx& image_io_ctx, const char *image_name); int group_image_list(IoCtx& io_ctx, const char *group_name, - std::vector& images); + std::vector *images); private: /* We don't allow assignment or copying */ diff --git a/src/librbd/Group.cc b/src/librbd/Group.cc index b6efdbcc59b..fd37e9a349a 100644 --- a/src/librbd/Group.cc +++ b/src/librbd/Group.cc @@ -1,5 +1,6 @@ // -*- mode:C++; tab-width:8; c-basic-offset:2; indent-tabs-mode:t -*- // vim: ts=8 sw=2 smarttab + #include "common/errno.h" #include "librbd/AioCompletion.h" @@ -76,7 +77,7 @@ int group_remove(librados::IoCtx& io_ctx, const char *group_name) ldout(cct, 20) << "group_remove " << &io_ctx << " " << group_name << dendl; std::vector images; - int r = group_image_list(io_ctx, group_name, images); + int r = group_image_list(io_ctx, group_name, &images); if (r < 0 && r != -ENOENT) { lderr(cct) << "error listing group images" << dendl; return r; @@ -119,7 +120,7 @@ int group_remove(librados::IoCtx& io_ctx, const char *group_name) return 0; } -int group_list(IoCtx& io_ctx, vector& names) +int group_list(IoCtx& io_ctx, vector *names) { CephContext *cct = (CephContext *)io_ctx.cct(); ldout(cct, 20) << "group_list " << &io_ctx << dendl; @@ -129,14 +130,15 @@ int group_list(IoCtx& io_ctx, vector& names) int r; do { map groups; - r = cls_client::group_dir_list(&io_ctx, RBD_GROUP_DIRECTORY, last_read, max_read, &groups); + r = cls_client::group_dir_list(&io_ctx, RBD_GROUP_DIRECTORY, last_read, + max_read, &groups); if (r < 0) { lderr(cct) << "error listing group in directory: " << cpp_strerror(r) << dendl; return r; } for (pair group : groups) { - names.push_back(group.first); + names->push_back(group.first); } if (!groups.empty()) { last_read = groups.rbegin()->first; @@ -288,7 +290,7 @@ int group_image_remove(librados::IoCtx& group_ioctx, const char *group_name, int group_image_list(librados::IoCtx& group_ioctx, const char *group_name, - std::vector& images) + std::vector *images) { CephContext *cct = (CephContext *)group_ioctx.cct(); ldout(cct, 20) << "group_image_list " << &group_ioctx @@ -317,7 +319,7 @@ int group_image_list(librados::IoCtx& group_ioctx, cls::rbd::GroupImageSpec start_last; r = cls_client::group_image_list(&group_ioctx, group_header_oid, - start_last, max_read, image_ids_page); + start_last, max_read, &image_ids_page); if (r < 0) { lderr(cct) << "error reading image list from consistency group: " @@ -344,7 +346,7 @@ int group_image_list(librados::IoCtx& group_ioctx, return r; } - images.push_back( + images->push_back( group_image_status_t { image_name, i.spec.pool_id, @@ -379,4 +381,5 @@ int image_get_group(ImageCtx *ictx, group_spec_t *group_spec) return 0; } + } // namespace librbd diff --git a/src/librbd/Group.h b/src/librbd/Group.h index 8840b506e2f..9dcc9eb508f 100644 --- a/src/librbd/Group.h +++ b/src/librbd/Group.h @@ -8,13 +8,14 @@ namespace librbd { // Consistency groups functions int group_create(librados::IoCtx& io_ctx, const char *imgname); int group_remove(librados::IoCtx& io_ctx, const char *group_name); -int group_list(librados::IoCtx& io_ctx, std::vector& names); +int group_list(librados::IoCtx& io_ctx, std::vector *names); int group_image_add(librados::IoCtx& group_ioctx, const char *group_name, librados::IoCtx& image_ioctx, const char *image_name); int group_image_remove(librados::IoCtx& group_ioctx, const char *group_name, librados::IoCtx& image_ioctx, const char *image_name); int group_image_list(librados::IoCtx& group_ioctx, const char *group_name, - std::vector& images); + std::vector *images); int image_get_group(ImageCtx *ictx, group_spec_t *group_spec); } + #endif // CEPH_LIBRBD_GROUP_H diff --git a/src/librbd/image/RefreshRequest.cc b/src/librbd/image/RefreshRequest.cc index 14d7e8784a6..160d6cdd663 100644 --- a/src/librbd/image/RefreshRequest.cc +++ b/src/librbd/image/RefreshRequest.cc @@ -256,8 +256,7 @@ Context *RefreshRequest::handle_v2_get_mutable_metadata(int *result) { &m_lockers, &m_exclusive_locked, &m_lock_tag, &m_snapc, - &m_parent_md, - &m_group_spec); + &m_parent_md); } if (*result < 0) { lderr(cct) << "failed to retrieve mutable metadata: " @@ -338,6 +337,48 @@ Context *RefreshRequest::handle_v2_get_flags(int *result) { return m_on_finish; } + send_v2_get_group(); + return nullptr; +} + +template +void RefreshRequest::send_v2_get_group() { + CephContext *cct = m_image_ctx.cct; + ldout(cct, 10) << this << " " << __func__ << dendl; + + librados::ObjectReadOperation op; + cls_client::image_get_group_start(&op); + + using klass = RefreshRequest; + librados::AioCompletion *comp = create_rados_ack_callback< + klass, &klass::handle_v2_get_group>(this); + m_out_bl.clear(); + int r = m_image_ctx.md_ctx.aio_operate(m_image_ctx.header_oid, comp, &op, + &m_out_bl); + assert(r == 0); + comp->release(); +} + +template +Context *RefreshRequest::handle_v2_get_group(int *result) { + CephContext *cct = m_image_ctx.cct; + ldout(cct, 10) << this << " " << __func__ << ": " + << "r=" << *result << dendl; + + if (*result == 0) { + bufferlist::iterator it = m_out_bl.begin(); + cls_client::image_get_group_finish(&it, &m_group_spec); + } + if (*result == -EOPNOTSUPP) { + // Older OSD doesn't support RBD groups + *result = 0; + ldout(cct, 10) << "OSD does not support consistency groups" << dendl; + } else if (*result < 0) { + lderr(cct) << "failed to retrieve group: " << cpp_strerror(*result) + << dendl; + return m_on_finish; + } + send_v2_get_snapshots(); return nullptr; } @@ -931,11 +972,10 @@ void RefreshRequest::apply() { } else { m_image_ctx.features = m_features; m_image_ctx.flags = m_flags; + m_image_ctx.group_spec = m_group_spec; m_image_ctx.parent_md = m_parent_md; } - m_image_ctx.group_spec = m_group_spec; - for (size_t i = 0; i < m_snapc.snaps.size(); ++i) { std::vector::const_iterator it = std::find( m_image_ctx.snaps.begin(), m_image_ctx.snaps.end(), diff --git a/src/librbd/image/RefreshRequest.h b/src/librbd/image/RefreshRequest.h index 79e616ba1b6..ff496a1d8b1 100644 --- a/src/librbd/image/RefreshRequest.h +++ b/src/librbd/image/RefreshRequest.h @@ -52,6 +52,9 @@ private: * V2_GET_FLAGS | * | | * v | + * V2_GET_GROUP | + * | | + * v | * V2_GET_SNAPSHOTS (skip if no snaps) | * | | * v | @@ -155,6 +158,9 @@ private: void send_v2_get_flags(); Context *handle_v2_get_flags(int *result); + void send_v2_get_group(); + Context *handle_v2_get_group(int *result); + void send_v2_get_snapshots(); Context *handle_v2_get_snapshots(int *result); diff --git a/src/librbd/internal.cc b/src/librbd/internal.cc index a48c47ba977..13dc586c4dc 100644 --- a/src/librbd/internal.cc +++ b/src/librbd/internal.cc @@ -1554,8 +1554,13 @@ int mirror_image_disable_internal(ImageCtx *ictx, bool force, } cls::rbd::GroupSpec s; - r = cls_client::image_get_group(&io_ctx, header_oid, s); - if (s.is_valid()) { + r = cls_client::image_get_group(&io_ctx, header_oid, &s); + if (r < 0 && r != -EOPNOTSUPP) { + lderr(cct) << "error querying consistency group" << dendl; + ictx->owner_lock.put_read(); + ictx->state->close(); + return r; + } else if (s.is_valid()) { lderr(cct) << "image is in a consistency group - not removing" << dendl; ictx->owner_lock.put_read(); ictx->state->close(); diff --git a/src/librbd/librbd.cc b/src/librbd/librbd.cc index 207b7d9e80d..ae9d63b25ce 100644 --- a/src/librbd/librbd.cc +++ b/src/librbd/librbd.cc @@ -483,7 +483,7 @@ namespace librbd { return r; } - int RBD::group_list(IoCtx& io_ctx, vector& names) + int RBD::group_list(IoCtx& io_ctx, vector *names) { TracepointProvider::initialize(get_cct(io_ctx)); tracepoint(librbd, group_list_enter, io_ctx.get_pool_name().c_str(), @@ -491,7 +491,7 @@ namespace librbd { int r = librbd::group_list(io_ctx, names); if (r >= 0) { - for (auto itr : names) { + for (auto itr : *names) { tracepoint(librbd, group_list_entry, itr.c_str()); } } @@ -524,7 +524,7 @@ namespace librbd { } int RBD::group_image_list(IoCtx& group_ioctx, const char *group_name, - std::vector& images) + std::vector *images) { TracepointProvider::initialize(get_cct(group_ioctx)); tracepoint(librbd, group_image_list_enter, group_ioctx.get_pool_name().c_str(), @@ -3237,7 +3237,7 @@ extern "C" int rbd_group_image_list(rados_ioctx_t group_p, group_ioctx.get_id(), group_name); std::vector cpp_images; - int r = librbd::group_image_list(group_ioctx, group_name, cpp_images); + int r = librbd::group_image_list(group_ioctx, group_name, &cpp_images); if (r == -ENOENT) { tracepoint(librbd, group_image_list_exit, 0); diff --git a/src/test/cls_rbd/test_cls_rbd.cc b/src/test/cls_rbd/test_cls_rbd.cc index af1d1c1deac..01a4d7a5039 100644 --- a/src/test/cls_rbd/test_cls_rbd.cc +++ b/src/test/cls_rbd/test_cls_rbd.cc @@ -1057,19 +1057,18 @@ TEST_F(TestClsRbd, get_mutable_metadata_features) std::string lock_tag; ::SnapContext snapc; parent_info parent; - cls::rbd::GroupSpec group_spec; ASSERT_EQ(0, get_mutable_metadata(&ioctx, oid, true, &size, &features, &incompatible_features, &lockers, &exclusive_lock, &lock_tag, &snapc, - &parent, &group_spec)); + &parent)); ASSERT_EQ(static_cast(RBD_FEATURE_EXCLUSIVE_LOCK), features); ASSERT_EQ(0U, incompatible_features); ASSERT_EQ(0, get_mutable_metadata(&ioctx, oid, false, &size, &features, &incompatible_features, &lockers, &exclusive_lock, &lock_tag, &snapc, - &parent, &group_spec)); + &parent)); ASSERT_EQ(static_cast(RBD_FEATURE_EXCLUSIVE_LOCK), features); ASSERT_EQ(static_cast(RBD_FEATURE_EXCLUSIVE_LOCK), incompatible_features); @@ -2004,14 +2003,16 @@ TEST_F(TestClsRbd, group_image_list) { vector images; cls::rbd::GroupImageSpec empty_image_spec = cls::rbd::GroupImageSpec(); - ASSERT_EQ(0, group_image_list(&ioctx, group_id, empty_image_spec, 1024, images)); + ASSERT_EQ(0, group_image_list(&ioctx, group_id, empty_image_spec, 1024, + &images)); ASSERT_EQ(1U, images.size()); ASSERT_EQ(image_id, images[0].spec.image_id); ASSERT_EQ(pool_id, images[0].spec.pool_id); ASSERT_EQ(cls::rbd::GROUP_IMAGE_LINK_STATE_INCOMPLETE, images[0].state); cls::rbd::GroupImageStatus last_image = *images.rbegin(); - ASSERT_EQ(0, group_image_list(&ioctx, group_id, last_image.spec, 1024, images)); + ASSERT_EQ(0, group_image_list(&ioctx, group_id, last_image.spec, 1024, + &images)); ASSERT_EQ(0U, images.size()); } @@ -2113,7 +2114,7 @@ TEST_F(TestClsRbd, image_get_group) { ASSERT_EQ(0, image_add_group(&ioctx, image_id, spec_add)); cls::rbd::GroupSpec spec; - ASSERT_EQ(0, image_get_group(&ioctx, image_id, spec)); + ASSERT_EQ(0, image_get_group(&ioctx, image_id, &spec)); ASSERT_EQ(group_id, spec.group_id); ASSERT_EQ(pool_id, spec.pool_id); diff --git a/src/test/librbd/image/test_mock_RefreshRequest.cc b/src/test/librbd/image/test_mock_RefreshRequest.cc index 008fd217cae..00654ec4491 100644 --- a/src/test/librbd/image/test_mock_RefreshRequest.cc +++ b/src/test/librbd/image/test_mock_RefreshRequest.cc @@ -151,9 +151,6 @@ public: EXPECT_CALL(get_mock_io_ctx(mock_image_ctx.md_ctx), exec(mock_image_ctx.header_oid, _, StrEq("rbd"), StrEq("get_parent"), _, _, _)) .WillOnce(DoDefault()); - EXPECT_CALL(get_mock_io_ctx(mock_image_ctx.md_ctx), - exec(mock_image_ctx.header_oid, _, StrEq("rbd"), StrEq("image_get_group"), _, _, _)) - .WillOnce(DoDefault()); EXPECT_CALL(get_mock_io_ctx(mock_image_ctx.md_ctx), exec(mock_image_ctx.header_oid, _, StrEq("lock"), StrEq("get_info"), _, _, _)) .WillOnce(DoDefault()); @@ -170,6 +167,18 @@ public: } } + void expect_get_group(MockRefreshImageCtx &mock_image_ctx, int r) { + auto &expect = EXPECT_CALL(get_mock_io_ctx(mock_image_ctx.md_ctx), + exec(mock_image_ctx.header_oid, _, StrEq("rbd"), + StrEq("image_get_group"), _, _, _)); + if (r < 0) { + expect.WillOnce(Return(r)); + } else { + expect.WillOnce(DoDefault()); + } + } + + void expect_get_snapshots(MockRefreshImageCtx &mock_image_ctx, int r) { auto &expect = EXPECT_CALL(get_mock_io_ctx(mock_image_ctx.md_ctx), exec(mock_image_ctx.header_oid, _, StrEq("rbd"), StrEq("get_snapshot_name"), _, _, _)); @@ -375,6 +384,7 @@ TEST_F(TestMockImageRefreshRequest, SuccessV2) { InSequence seq; expect_get_mutable_metadata(mock_image_ctx, 0); expect_get_flags(mock_image_ctx, 0); + expect_get_group(mock_image_ctx, 0); expect_refresh_parent_is_required(mock_refresh_parent_request, false); if (ictx->test_features(RBD_FEATURE_EXCLUSIVE_LOCK)) { expect_init_exclusive_lock(mock_image_ctx, mock_exclusive_lock, 0); @@ -404,6 +414,7 @@ TEST_F(TestMockImageRefreshRequest, SuccessSnapshotV2) { expect_get_mutable_metadata(mock_image_ctx, 0); expect_get_flags(mock_image_ctx, 0); expect_get_flags(mock_image_ctx, 0); + expect_get_group(mock_image_ctx, 0); expect_get_snapshots(mock_image_ctx, 0); expect_snap_namespace_list(mock_image_ctx, 0); expect_refresh_parent_is_required(mock_refresh_parent_request, false); @@ -437,6 +448,7 @@ TEST_F(TestMockImageRefreshRequest, SuccessSetSnapshotV2) { expect_get_mutable_metadata(mock_image_ctx, 0); expect_get_flags(mock_image_ctx, 0); expect_get_flags(mock_image_ctx, 0); + expect_get_group(mock_image_ctx, 0); expect_get_snapshots(mock_image_ctx, 0); expect_snap_namespace_list(mock_image_ctx, 0); expect_refresh_parent_is_required(mock_refresh_parent_request, false); @@ -488,6 +500,7 @@ TEST_F(TestMockImageRefreshRequest, SuccessChild) { InSequence seq; expect_get_mutable_metadata(mock_image_ctx, 0); expect_get_flags(mock_image_ctx, 0); + expect_get_group(mock_image_ctx, 0); expect_refresh_parent_is_required(*mock_refresh_parent_request, true); expect_refresh_parent_send(mock_image_ctx, *mock_refresh_parent_request, 0); if (ictx->test_features(RBD_FEATURE_EXCLUSIVE_LOCK)) { @@ -553,6 +566,7 @@ TEST_F(TestMockImageRefreshRequest, DisableExclusiveLock) { InSequence seq; expect_get_mutable_metadata(mock_image_ctx, 0); expect_get_flags(mock_image_ctx, 0); + expect_get_group(mock_image_ctx, 0); expect_refresh_parent_is_required(mock_refresh_parent_request, false); expect_shut_down_exclusive_lock(mock_image_ctx, *mock_exclusive_lock, 0); @@ -603,6 +617,7 @@ TEST_F(TestMockImageRefreshRequest, DisableExclusiveLockWhileAcquiringLock) { InSequence seq; expect_get_mutable_metadata(mock_image_ctx, 0); expect_get_flags(mock_image_ctx, 0); + expect_get_group(mock_image_ctx, 0); expect_refresh_parent_is_required(mock_refresh_parent_request, false); C_SaferCond ctx; @@ -643,6 +658,7 @@ TEST_F(TestMockImageRefreshRequest, JournalDisabledByPolicy) { InSequence seq; expect_get_mutable_metadata(mock_image_ctx, 0); expect_get_flags(mock_image_ctx, 0); + expect_get_group(mock_image_ctx, 0); expect_refresh_parent_is_required(mock_refresh_parent_request, false); MockJournalPolicy mock_journal_policy; @@ -688,6 +704,7 @@ TEST_F(TestMockImageRefreshRequest, EnableJournalWithExclusiveLock) { InSequence seq; expect_get_mutable_metadata(mock_image_ctx, 0); expect_get_flags(mock_image_ctx, 0); + expect_get_group(mock_image_ctx, 0); expect_refresh_parent_is_required(mock_refresh_parent_request, false); MockJournalPolicy mock_journal_policy; @@ -732,6 +749,7 @@ TEST_F(TestMockImageRefreshRequest, EnableJournalWithoutExclusiveLock) { InSequence seq; expect_get_mutable_metadata(mock_image_ctx, 0); expect_get_flags(mock_image_ctx, 0); + expect_get_group(mock_image_ctx, 0); expect_refresh_parent_is_required(mock_refresh_parent_request, false); expect_set_require_lock_on_read(mock_image_ctx); @@ -774,6 +792,7 @@ TEST_F(TestMockImageRefreshRequest, DisableJournal) { InSequence seq; expect_get_mutable_metadata(mock_image_ctx, 0); expect_get_flags(mock_image_ctx, 0); + expect_get_group(mock_image_ctx, 0); expect_refresh_parent_is_required(mock_refresh_parent_request, false); expect_block_writes(mock_image_ctx, 0); expect_clear_require_lock_on_read(mock_image_ctx); @@ -814,6 +833,7 @@ TEST_F(TestMockImageRefreshRequest, EnableObjectMapWithExclusiveLock) { InSequence seq; expect_get_mutable_metadata(mock_image_ctx, 0); expect_get_flags(mock_image_ctx, 0); + expect_get_group(mock_image_ctx, 0); expect_refresh_parent_is_required(mock_refresh_parent_request, false); expect_open_object_map(mock_image_ctx, &mock_object_map, 0); @@ -849,6 +869,7 @@ TEST_F(TestMockImageRefreshRequest, EnableObjectMapWithoutExclusiveLock) { InSequence seq; expect_get_mutable_metadata(mock_image_ctx, 0); expect_get_flags(mock_image_ctx, 0); + expect_get_group(mock_image_ctx, 0); expect_refresh_parent_is_required(mock_refresh_parent_request, false); C_SaferCond ctx; @@ -895,6 +916,7 @@ TEST_F(TestMockImageRefreshRequest, DisableObjectMap) { InSequence seq; expect_get_mutable_metadata(mock_image_ctx, 0); expect_get_flags(mock_image_ctx, 0); + expect_get_group(mock_image_ctx, 0); expect_refresh_parent_is_required(mock_refresh_parent_request, false); expect_close_object_map(mock_image_ctx, *mock_object_map, 0); @@ -932,6 +954,7 @@ TEST_F(TestMockImageRefreshRequest, OpenObjectMapError) { InSequence seq; expect_get_mutable_metadata(mock_image_ctx, 0); expect_get_flags(mock_image_ctx, 0); + expect_get_group(mock_image_ctx, 0); expect_refresh_parent_is_required(mock_refresh_parent_request, false); expect_open_object_map(mock_image_ctx, mock_object_map, -EFBIG); diff --git a/src/test/librbd/test_ConsistencyGroups.cc b/src/test/librbd/test_ConsistencyGroups.cc index 71c01a1d8d9..a7e7f019029 100644 --- a/src/test/librbd/test_ConsistencyGroups.cc +++ b/src/test/librbd/test_ConsistencyGroups.cc @@ -51,14 +51,14 @@ TEST_F(TestLibCG, group_create) ASSERT_EQ(0, rbd.group_create(ioctx, "mygroup")); vector groups; - ASSERT_EQ(0, rbd.group_list(ioctx, groups)); + ASSERT_EQ(0, rbd.group_list(ioctx, &groups)); ASSERT_EQ(1U, groups.size()); ASSERT_EQ("mygroup", groups[0]); ASSERT_EQ(0, rbd.group_remove(ioctx, "mygroup")); groups.clear(); - ASSERT_EQ(0, rbd.group_list(ioctx, groups)); + ASSERT_EQ(0, rbd.group_list(ioctx, &groups)); ASSERT_EQ(0U, groups.size()); } @@ -78,7 +78,7 @@ TEST_F(TestLibCG, add_image) ASSERT_EQ(0, rbd.group_image_add(ioctx, group_name, ioctx, image_name)); vector images; - ASSERT_EQ(0, rbd.group_image_list(ioctx, group_name, images)); + ASSERT_EQ(0, rbd.group_image_list(ioctx, group_name, &images)); ASSERT_EQ(1U, images.size()); ASSERT_EQ("myimage", images[0].name); ASSERT_EQ(ioctx.get_id(), images[0].pool); @@ -86,6 +86,6 @@ TEST_F(TestLibCG, add_image) ASSERT_EQ(0, rbd.group_image_remove(ioctx, group_name, ioctx, image_name)); images.clear(); - ASSERT_EQ(0, rbd.group_image_list(ioctx, group_name, images)); + ASSERT_EQ(0, rbd.group_image_list(ioctx, group_name, &images)); ASSERT_EQ(0U, images.size()); } diff --git a/src/tools/rbd/action/Group.cc b/src/tools/rbd/action/Group.cc index 3ad38e5fb5a..5a8dcd53256 100644 --- a/src/tools/rbd/action/Group.cc +++ b/src/tools/rbd/action/Group.cc @@ -68,7 +68,7 @@ int execute_list(const po::variables_map &vm) { librbd::RBD rbd; std::vector names; - r = rbd.group_list(io_ctx, names); + r = rbd.group_list(io_ctx, &names); if (r == -ENOENT) r = 0; @@ -257,7 +257,7 @@ int execute_list_images(const po::variables_map &vm) { librbd::RBD rbd; std::vector images; - r = rbd.group_image_list(io_ctx, group_name.c_str(), images); + r = rbd.group_image_list(io_ctx, group_name.c_str(), &images); if (r == -ENOENT) r = 0; -- 2.39.5