From 95714715c85889d02cfaaa733264f541ecd4e6dc Mon Sep 17 00:00:00 2001 From: Mykola Golub Date: Fri, 19 Mar 2021 14:37:17 +0000 Subject: [PATCH] librbd: link group snapshot when creating non-primary snapshot Signed-off-by: Mykola Golub Signed-off-by: Prasanna Kumar Kalever --- .../snapshot/CreateNonPrimaryRequest.cc | 10 ++++-- .../mirror/snapshot/CreateNonPrimaryRequest.h | 24 ++++++++++---- src/librbd/mirror/snapshot/PromoteRequest.cc | 2 +- .../test_mock_CreateNonPrimaryRequest.cc | 32 +++++++++---------- .../snapshot/test_mock_PromoteRequest.cc | 3 ++ .../snapshot/test_mock_Replayer.cc | 3 ++ .../image_replayer/snapshot/Replayer.cc | 3 +- 7 files changed, 50 insertions(+), 27 deletions(-) diff --git a/src/librbd/mirror/snapshot/CreateNonPrimaryRequest.cc b/src/librbd/mirror/snapshot/CreateNonPrimaryRequest.cc index f7dbe405d50..60202b156c1 100644 --- a/src/librbd/mirror/snapshot/CreateNonPrimaryRequest.cc +++ b/src/librbd/mirror/snapshot/CreateNonPrimaryRequest.cc @@ -31,11 +31,15 @@ template CreateNonPrimaryRequest::CreateNonPrimaryRequest( I* image_ctx, bool demoted, const std::string &primary_mirror_uuid, uint64_t primary_snap_id, const SnapSeqs& snap_seqs, - const ImageState &image_state, uint64_t *snap_id, Context *on_finish) + int64_t group_pool_id, const std::string &group_id, + const std::string &group_snap_id, const ImageState &image_state, + uint64_t *snap_id, Context *on_finish) : m_image_ctx(image_ctx), m_demoted(demoted), m_primary_mirror_uuid(primary_mirror_uuid), m_primary_snap_id(primary_snap_id), m_snap_seqs(snap_seqs), - m_image_state(image_state), m_snap_id(snap_id), m_on_finish(on_finish) { + m_group_pool_id(group_pool_id), m_group_id(group_id), + m_group_snap_id(group_snap_id), m_image_state(image_state), + m_snap_id(snap_id), m_on_finish(on_finish) { m_default_ns_ctx.dup(m_image_ctx->md_ctx); m_default_ns_ctx.set_namespace(""); } @@ -190,6 +194,8 @@ void CreateNonPrimaryRequest::create_snapshot() { ns.mirror_peer_uuids = m_mirror_peer_uuids; } ns.snap_seqs = m_snap_seqs; + ns.group_spec = {m_group_id, m_group_pool_id}; + ns.group_snap_id = m_group_snap_id; ns.complete = is_orphan(); ldout(cct, 15) << "ns=" << ns << dendl; diff --git a/src/librbd/mirror/snapshot/CreateNonPrimaryRequest.h b/src/librbd/mirror/snapshot/CreateNonPrimaryRequest.h index 36f155413c6..17d97f2d5ec 100644 --- a/src/librbd/mirror/snapshot/CreateNonPrimaryRequest.h +++ b/src/librbd/mirror/snapshot/CreateNonPrimaryRequest.h @@ -30,12 +30,16 @@ public: const std::string &primary_mirror_uuid, uint64_t primary_snap_id, const SnapSeqs& snap_seqs, + int64_t group_pool_id, + const std::string &group_id, + const std::string &group_snap_id, const ImageState &image_state, uint64_t *snap_id, Context *on_finish) { return new CreateNonPrimaryRequest(image_ctx, demoted, primary_mirror_uuid, - primary_snap_id, snap_seqs, image_state, - snap_id, on_finish); + primary_snap_id, snap_seqs, + group_pool_id, group_id, group_snap_id, + image_state, snap_id, on_finish); } CreateNonPrimaryRequest(ImageCtxT *image_ctx, @@ -43,6 +47,9 @@ public: const std::string &primary_mirror_uuid, uint64_t primary_snap_id, const SnapSeqs& snap_seqs, + int64_t group_pool_id, + const std::string &group_id, + const std::string &group_snap_id, const ImageState &image_state, uint64_t *snap_id, Context *on_finish); @@ -76,11 +83,14 @@ private: */ ImageCtxT *m_image_ctx; - bool m_demoted; - std::string m_primary_mirror_uuid; - uint64_t m_primary_snap_id; - SnapSeqs m_snap_seqs; - ImageState m_image_state; + const bool m_demoted; + const std::string m_primary_mirror_uuid; + const uint64_t m_primary_snap_id; + const SnapSeqs m_snap_seqs; + const int64_t m_group_pool_id; + const std::string m_group_id; + const std::string m_group_snap_id; + const ImageState m_image_state; uint64_t *m_snap_id; Context *m_on_finish; diff --git a/src/librbd/mirror/snapshot/PromoteRequest.cc b/src/librbd/mirror/snapshot/PromoteRequest.cc index 068c96a307d..eb2858cb4a2 100644 --- a/src/librbd/mirror/snapshot/PromoteRequest.cc +++ b/src/librbd/mirror/snapshot/PromoteRequest.cc @@ -62,7 +62,7 @@ void PromoteRequest::create_orphan_snapshot() { &PromoteRequest::handle_create_orphan_snapshot>(this); auto req = CreateNonPrimaryRequest::create( - m_image_ctx, false, "", CEPH_NOSNAP, {}, {}, nullptr, ctx); + m_image_ctx, false, "", CEPH_NOSNAP, {}, -1, {}, {}, {}, nullptr, ctx); req->send(); } diff --git a/src/test/librbd/mirror/snapshot/test_mock_CreateNonPrimaryRequest.cc b/src/test/librbd/mirror/snapshot/test_mock_CreateNonPrimaryRequest.cc index bba726149d8..e73dd6d5c3b 100644 --- a/src/test/librbd/mirror/snapshot/test_mock_CreateNonPrimaryRequest.cc +++ b/src/test/librbd/mirror/snapshot/test_mock_CreateNonPrimaryRequest.cc @@ -195,8 +195,8 @@ TEST_F(TestMockMirrorSnapshotCreateNonPrimaryRequest, Success) { C_SaferCond ctx; auto req = new MockCreateNonPrimaryRequest(&mock_image_ctx, false, - "mirror_uuid", 123, {{1, 2}}, {}, - nullptr, &ctx); + "mirror_uuid", 123, {{1, 2}}, -1, {}, + {}, {}, nullptr, &ctx); req->send(); ASSERT_EQ(0, ctx.wait()); } @@ -227,8 +227,8 @@ TEST_F(TestMockMirrorSnapshotCreateNonPrimaryRequest, SuccessDemoted) { C_SaferCond ctx; auto req = new MockCreateNonPrimaryRequest(&mock_image_ctx, true, - "mirror_uuid", 123, {{1, 2}}, {}, - nullptr, &ctx); + "mirror_uuid", 123, {{1, 2}}, -1, + {}, {}, {}, nullptr, &ctx); req->send(); ASSERT_EQ(0, ctx.wait()); } @@ -247,8 +247,8 @@ TEST_F(TestMockMirrorSnapshotCreateNonPrimaryRequest, RefreshError) { C_SaferCond ctx; auto req = new MockCreateNonPrimaryRequest(&mock_image_ctx, false, - "mirror_uuid", 123, {{1, 2}}, {}, - nullptr, &ctx); + "mirror_uuid", 123, {{1, 2}}, -1, + {}, {}, {}, nullptr, &ctx); req->send(); ASSERT_EQ(-EINVAL, ctx.wait()); } @@ -270,8 +270,8 @@ TEST_F(TestMockMirrorSnapshotCreateNonPrimaryRequest, GetMirrorImageError) { C_SaferCond ctx; auto req = new MockCreateNonPrimaryRequest(&mock_image_ctx, false, - "mirror_uuid", 123, {{1, 2}}, {}, - nullptr, &ctx); + "mirror_uuid", 123, {{1, 2}}, -1, + {}, {}, {}, nullptr, &ctx); req->send(); ASSERT_EQ(-EINVAL, ctx.wait()); } @@ -295,8 +295,8 @@ TEST_F(TestMockMirrorSnapshotCreateNonPrimaryRequest, CanNotError) { C_SaferCond ctx; auto req = new MockCreateNonPrimaryRequest(&mock_image_ctx, false, - "mirror_uuid", 123, {{1, 2}}, {}, - nullptr, &ctx); + "mirror_uuid", 123, {{1, 2}}, -1, + {}, {}, {}, nullptr, &ctx); req->send(); ASSERT_EQ(-EINVAL, ctx.wait()); } @@ -322,8 +322,8 @@ TEST_F(TestMockMirrorSnapshotCreateNonPrimaryRequest, GetMirrorPeersError) { C_SaferCond ctx; auto req = new MockCreateNonPrimaryRequest(&mock_image_ctx, true, - "mirror_uuid", 123, {{1, 2}}, {}, - nullptr, &ctx); + "mirror_uuid", 123, {{1, 2}}, -1, + {}, {}, {}, nullptr, &ctx); req->send(); ASSERT_EQ(-EPERM, ctx.wait()); } @@ -348,8 +348,8 @@ TEST_F(TestMockMirrorSnapshotCreateNonPrimaryRequest, CreateSnapshotError) { C_SaferCond ctx; auto req = new MockCreateNonPrimaryRequest(&mock_image_ctx, false, - "mirror_uuid", 123, {{1, 2}}, {}, - nullptr, &ctx); + "mirror_uuid", 123, {{1, 2}}, -1, + {}, {}, {}, nullptr, &ctx); req->send(); ASSERT_EQ(-EINVAL, ctx.wait()); } @@ -377,8 +377,8 @@ TEST_F(TestMockMirrorSnapshotCreateNonPrimaryRequest, WriteImageStateError) { C_SaferCond ctx; auto req = new MockCreateNonPrimaryRequest(&mock_image_ctx, false, - "mirror_uuid", 123, {{1, 2}}, {}, - nullptr, &ctx); + "mirror_uuid", 123, {{1, 2}}, -1, + {}, {}, {}, nullptr, &ctx); req->send(); ASSERT_EQ(-EINVAL, ctx.wait()); } diff --git a/src/test/librbd/mirror/snapshot/test_mock_PromoteRequest.cc b/src/test/librbd/mirror/snapshot/test_mock_PromoteRequest.cc index 6dcde3d25f5..3bb51dbfb3a 100644 --- a/src/test/librbd/mirror/snapshot/test_mock_PromoteRequest.cc +++ b/src/test/librbd/mirror/snapshot/test_mock_PromoteRequest.cc @@ -95,6 +95,9 @@ struct CreateNonPrimaryRequest { const std::string &primary_mirror_uuid, uint64_t primary_snap_id, SnapSeqs snap_seqs, + int64_t group_pool_id, + const std::string &group_id, + const std::string &group_snap_id, const ImageState &image_state, uint64_t *snap_id, Context *on_finish) { diff --git a/src/test/rbd_mirror/image_replayer/snapshot/test_mock_Replayer.cc b/src/test/rbd_mirror/image_replayer/snapshot/test_mock_Replayer.cc index 21afa6d52bb..3d899300add 100644 --- a/src/test/rbd_mirror/image_replayer/snapshot/test_mock_Replayer.cc +++ b/src/test/rbd_mirror/image_replayer/snapshot/test_mock_Replayer.cc @@ -161,6 +161,9 @@ struct CreateNonPrimaryRequest { const std::string &primary_mirror_uuid, uint64_t primary_snap_id, const SnapSeqs& snap_seqs, + uint64_t local_group_pool_id, + const std::string &local_group_id, + const std::string &local_group_snap_id, const ImageState &image_state, uint64_t *snap_id, Context *on_finish) { diff --git a/src/tools/rbd_mirror/image_replayer/snapshot/Replayer.cc b/src/tools/rbd_mirror/image_replayer/snapshot/Replayer.cc index 20fe59ebdf7..668f5a25298 100644 --- a/src/tools/rbd_mirror/image_replayer/snapshot/Replayer.cc +++ b/src/tools/rbd_mirror/image_replayer/snapshot/Replayer.cc @@ -1008,7 +1008,8 @@ void Replayer::create_non_primary_snapshot() { auto req = librbd::mirror::snapshot::CreateNonPrimaryRequest::create( local_image_ctx, m_remote_mirror_snap_ns.is_demoted(), m_state_builder->remote_mirror_uuid, m_remote_snap_id_end, - m_local_mirror_snap_ns.snap_seqs, m_image_state, &m_local_snap_id_end, ctx); + m_local_mirror_snap_ns.snap_seqs, -1, {}, {}, m_image_state, + &m_local_snap_id_end, ctx); req->send(); } -- 2.39.5