]> git.apps.os.sepia.ceph.com Git - ceph-ci.git/commitdiff
rbd-mirror: do not attempt to replay incomplete primary snapshots
authorJason Dillaman <dillaman@redhat.com>
Wed, 19 Feb 2020 17:03:10 +0000 (12:03 -0500)
committerJason Dillaman <dillaman@redhat.com>
Wed, 19 Feb 2020 17:19:14 +0000 (12:19 -0500)
In case we race with the creation of a primary mirror snapshot,
do not attempt to replay incomplete snapshots. Once the image
state has been successfully written, the snapshot will be flagged
as complete and an update notification will be sent.

Signed-off-by: Jason Dillaman <dillaman@redhat.com>
src/test/rbd_mirror/image_replayer/snapshot/test_mock_Replayer.cc
src/tools/rbd_mirror/image_replayer/snapshot/Replayer.cc

index e1e83ca454354e90bb4d3228ba2708e2350bb2a4..fa6018087c4eed7c009634ddfa19c43fb18347c9 100644 (file)
@@ -597,17 +597,17 @@ TEST_F(TestMockImageReplayerSnapshotReplayer, SyncSnapshot) {
   mock_remote_image_ctx.snap_info = {
     {1U, librbd::SnapInfo{"snap1", cls::rbd::MirrorSnapshotNamespace{
        cls::rbd::MIRROR_SNAPSHOT_STATE_PRIMARY, {"remote mirror peer uuid"},
-       "", 0U},
+       "", 0U, true, 0, {}},
      0, {}, 0, 0, {}}},
     {2U, librbd::SnapInfo{"snap2", cls::rbd::UserSnapshotNamespace{},
      0, {}, 0, 0, {}}},
     {3U, librbd::SnapInfo{"snap3", cls::rbd::MirrorSnapshotNamespace{
        cls::rbd::MIRROR_SNAPSHOT_STATE_PRIMARY, {""},
-       "", 0U},
+       "", 0U, true, 0, {}},
      0, {}, 0, 0, {}}},
     {4U, librbd::SnapInfo{"snap4", cls::rbd::MirrorSnapshotNamespace{
        cls::rbd::MIRROR_SNAPSHOT_STATE_PRIMARY, {"remote mirror peer uuid"},
-       "", 0U},
+       "", 0U, true, 0, {}},
      0, {}, 0, 0, {}}}};
 
   MockThreads mock_threads(m_threads);
@@ -737,7 +737,7 @@ TEST_F(TestMockImageReplayerSnapshotReplayer, InterruptedSync) {
   mock_remote_image_ctx.snap_info = {
     {1U, librbd::SnapInfo{"snap1", cls::rbd::MirrorSnapshotNamespace{
        cls::rbd::MIRROR_SNAPSHOT_STATE_PRIMARY, {"remote mirror peer uuid"},
-       "", 0U},
+       "", 0U, true, 0, {}},
      0, {}, 0, 0, {}}}};
   mock_local_image_ctx.snap_info = {
     {11U, librbd::SnapInfo{"snap1", cls::rbd::MirrorSnapshotNamespace{
@@ -809,7 +809,7 @@ TEST_F(TestMockImageReplayerSnapshotReplayer, RemoteImageDemoted) {
   mock_remote_image_ctx.snap_info = {
     {1U, librbd::SnapInfo{"snap1", cls::rbd::MirrorSnapshotNamespace{
        cls::rbd::MIRROR_SNAPSHOT_STATE_PRIMARY_DEMOTED,
-       {"remote mirror peer uuid"}, "", 0U},
+       {"remote mirror peer uuid"}, "", 0U, true, 0, {}},
      0, {}, 0, 0, {}}}};
 
   // sync snap1
@@ -1091,7 +1091,7 @@ TEST_F(TestMockImageReplayerSnapshotReplayer, CopySnapshotsError) {
   mock_remote_image_ctx.snap_info = {
     {1U, librbd::SnapInfo{"snap1", cls::rbd::MirrorSnapshotNamespace{
        cls::rbd::MIRROR_SNAPSHOT_STATE_PRIMARY, {"remote mirror peer uuid"}, "",
-       0U},
+       0U, true, 0, {}},
      0, {}, 0, 0, {}}}};
 
   // sync snap1
@@ -1145,7 +1145,7 @@ TEST_F(TestMockImageReplayerSnapshotReplayer, GetImageStateError) {
   mock_remote_image_ctx.snap_info = {
     {1U, librbd::SnapInfo{"snap1", cls::rbd::MirrorSnapshotNamespace{
        cls::rbd::MIRROR_SNAPSHOT_STATE_PRIMARY, {"remote mirror peer uuid"}, "",
-       0U},
+       0U, true, 0, {}},
      0, {}, 0, 0, {}}}};
 
   // sync snap1
@@ -1201,7 +1201,7 @@ TEST_F(TestMockImageReplayerSnapshotReplayer, CreateNonPrimarySnapshotError) {
   mock_remote_image_ctx.snap_info = {
     {1U, librbd::SnapInfo{"snap1", cls::rbd::MirrorSnapshotNamespace{
        cls::rbd::MIRROR_SNAPSHOT_STATE_PRIMARY, {"remote mirror peer uuid"}, "",
-       0U},
+       0U, true, 0, {}},
      0, {}, 0, 0, {}}}};
 
   // sync snap1
@@ -1261,7 +1261,7 @@ TEST_F(TestMockImageReplayerSnapshotReplayer, CopyImageError) {
   mock_remote_image_ctx.snap_info = {
     {1U, librbd::SnapInfo{"snap1", cls::rbd::MirrorSnapshotNamespace{
        cls::rbd::MIRROR_SNAPSHOT_STATE_PRIMARY, {"remote mirror peer uuid"}, "",
-       0U},
+       0U, true, 0, {}},
      0, {}, 0, 0, {}}}};
 
   // sync snap1
@@ -1324,7 +1324,7 @@ TEST_F(TestMockImageReplayerSnapshotReplayer, UpdateNonPrimarySnapshotError) {
   mock_remote_image_ctx.snap_info = {
     {1U, librbd::SnapInfo{"snap1", cls::rbd::MirrorSnapshotNamespace{
        cls::rbd::MIRROR_SNAPSHOT_STATE_PRIMARY, {"remote mirror peer uuid"}, "",
-       0U},
+       0U, true, 0, {}},
      0, {}, 0, 0, {}}}};
 
   // sync snap1
@@ -1389,11 +1389,11 @@ TEST_F(TestMockImageReplayerSnapshotReplayer, UnlinkPeerError) {
   mock_remote_image_ctx.snap_info = {
     {1U, librbd::SnapInfo{"snap1", cls::rbd::MirrorSnapshotNamespace{
        cls::rbd::MIRROR_SNAPSHOT_STATE_PRIMARY, {"remote mirror peer uuid"}, "",
-       0U},
+       0U, true, 0, {}},
      0, {}, 0, 0, {}}},
     {2U, librbd::SnapInfo{"snap2", cls::rbd::MirrorSnapshotNamespace{
        cls::rbd::MIRROR_SNAPSHOT_STATE_PRIMARY, {"remote mirror peer uuid"},
-       "", 0U},
+       "", 0U, true, 0, {}},
      0, {}, 0, 0, {}}}};
   mock_local_image_ctx.snap_info = {
     {11U, librbd::SnapInfo{"snap1", cls::rbd::MirrorSnapshotNamespace{
index 0a926429975ce0e9b86a3ddb08742d00897107d1..2af646ca1af35a5fb6136149446e461a8d4a299a 100644 (file)
@@ -418,17 +418,22 @@ void Replayer<I>::scan_remote_mirror_snapshots() {
              << "remote_snap_id_start=" << m_remote_snap_id_start << ", "
              << "remote_snap_id_end=" << m_remote_snap_id_end << ", "
              << "remote_snap_ns=" << m_remote_mirror_snap_ns << dendl;
-
-    if (m_local_snap_id_end != CEPH_NOSNAP &&
-        !m_local_mirror_snap_ns.complete) {
-      // attempt to resume image-sync
-      dout(10) << "local image contains in-progress mirror snapshot"
-               << dendl;
-      copy_image();
+    if (m_remote_mirror_snap_ns.complete) {
+      if (m_local_snap_id_end != CEPH_NOSNAP &&
+          !m_local_mirror_snap_ns.complete) {
+        // attempt to resume image-sync
+        dout(10) << "local image contains in-progress mirror snapshot"
+                 << dendl;
+        copy_image();
+      } else {
+        copy_snapshots();
+      }
+      return;
     } else {
-      copy_snapshots();
+      // might have raced with the creation of a remote mirror snapshot
+      // so we will need to refresh and rescan once it completes
+      dout(15) << "remote mirror snapshot not complete" << dendl;
     }
-    return;
   }
 
   std::unique_lock locker{m_lock};