From: Jason Dillaman Date: Fri, 21 Feb 2020 18:45:53 +0000 (-0500) Subject: librbd: only create new mirror image state records for primary mirror snapshots X-Git-Tag: v15.1.1~298^2 X-Git-Url: http://git-server-git.apps.pok.os.sepia.ceph.com/?a=commitdiff_plain;h=406c699fb7a618d77c4d1bf1be2ca4e6315ee8a0;p=ceph.git 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 --- 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();