From 406c699fb7a618d77c4d1bf1be2ca4e6315ee8a0 Mon Sep 17 00:00:00 2001 From: Jason Dillaman Date: Fri, 21 Feb 2020 13:45:53 -0500 Subject: [PATCH] librbd: only create new mirror image state records for primary mirror snapshots The consolidation of primary and non-primary mirror snapshot namespaces resulted in the creation of image state records for non-primary snapshots. This was resulting in non-primary snapshots being prematurely marked as complete. Signed-off-by: Jason Dillaman --- src/librbd/operation/SnapshotCreateRequest.cc | 6 +++--- .../librbd/operation/test_mock_SnapshotCreateRequest.cc | 6 ++++-- 2 files changed, 7 insertions(+), 5 deletions(-) diff --git a/src/librbd/operation/SnapshotCreateRequest.cc b/src/librbd/operation/SnapshotCreateRequest.cc index 457e4014352f..e51e4389506c 100644 --- a/src/librbd/operation/SnapshotCreateRequest.cc +++ b/src/librbd/operation/SnapshotCreateRequest.cc @@ -256,9 +256,9 @@ Context *SnapshotCreateRequest::handle_create_object_map(int *result) { template Context *SnapshotCreateRequest::send_create_image_state() { I &image_ctx = this->m_image_ctx; - auto type = cls::rbd::get_snap_namespace_type(m_snap_namespace); - - if (type != cls::rbd::SNAPSHOT_NAMESPACE_TYPE_MIRROR) { + auto mirror_ns = boost::get( + &m_snap_namespace); + if (mirror_ns == nullptr || !mirror_ns->is_primary()) { update_snap_context(); image_ctx.io_work_queue->unblock_writes(); return this->create_context_finisher(0); diff --git a/src/test/librbd/operation/test_mock_SnapshotCreateRequest.cc b/src/test/librbd/operation/test_mock_SnapshotCreateRequest.cc index da7c6492ef5b..47506a96da29 100644 --- a/src/test/librbd/operation/test_mock_SnapshotCreateRequest.cc +++ b/src/test/librbd/operation/test_mock_SnapshotCreateRequest.cc @@ -381,8 +381,10 @@ TEST_F(TestMockOperationSnapshotCreateRequest, SetImageState) { C_SaferCond cond_ctx; MockSnapshotCreateRequest *req = new MockSnapshotCreateRequest( - mock_image_ctx, &cond_ctx, cls::rbd::MirrorSnapshotNamespace(), - "snap1", 0, false); + mock_image_ctx, &cond_ctx, + cls::rbd::MirrorSnapshotNamespace{ + cls::rbd::MIRROR_SNAPSHOT_STATE_PRIMARY, {}, "", CEPH_NOSNAP}, + "snap1", 0, false); { std::shared_lock owner_locker{mock_image_ctx.owner_lock}; req->send(); -- 2.47.3