]> git.apps.os.sepia.ceph.com Git - ceph.git/commitdiff
rbd-mirror: prepare local image shouldn't abort if image does not exist
authorJason Dillaman <dillaman@redhat.com>
Thu, 27 Feb 2020 01:18:57 +0000 (20:18 -0500)
committerJason Dillaman <dillaman@redhat.com>
Thu, 27 Feb 2020 21:33:21 +0000 (16:33 -0500)
If we already have a mirror image record, we should still bootstrap up
using the data we know like the old image id so that we can properly clean
up later.

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

index a66560d5a30aab08b2e5ef7157f6b2dcfe9cb5cc..1888607a622416e2a9e0d33eff93e415da2b7440 100644 (file)
@@ -321,13 +321,43 @@ TEST_F(TestMockImageReplayerPrepareLocalImageRequest, MirrorImageIdError) {
   ASSERT_EQ(-EINVAL, ctx.wait());
 }
 
-TEST_F(TestMockImageReplayerPrepareLocalImageRequest, DirGetNameError) {
+TEST_F(TestMockImageReplayerPrepareLocalImageRequest, DirGetNameDNE) {
   InSequence seq;
   MockGetMirrorImageIdRequest mock_get_mirror_image_id_request;
   expect_get_mirror_image_id(mock_get_mirror_image_id_request, "local image id",
                              0);
   expect_dir_get_name(m_local_io_ctx, "", -ENOENT);
 
+  MockGetMirrorInfoRequest mock_get_mirror_info_request;
+  expect_get_mirror_info(mock_get_mirror_info_request,
+                         {cls::rbd::MIRROR_IMAGE_MODE_JOURNAL,
+                          "global image id",
+                          cls::rbd::MIRROR_IMAGE_STATE_ENABLED},
+                         librbd::mirror::PROMOTION_STATE_NON_PRIMARY,
+                         "remote mirror uuid", 0);
+
+  MockJournalStateBuilder mock_journal_state_builder;
+  MockStateBuilder* mock_state_builder = nullptr;
+  std::string local_image_name;
+  C_SaferCond ctx;
+  auto req = MockPrepareLocalImageRequest::create(m_local_io_ctx,
+                                                  "global image id",
+                                                  &local_image_name,
+                                                  &mock_state_builder,
+                                                  m_threads->work_queue,
+                                                  &ctx);
+  req->send();
+
+  ASSERT_EQ(0, ctx.wait());
+}
+
+TEST_F(TestMockImageReplayerPrepareLocalImageRequest, DirGetNameError) {
+  InSequence seq;
+  MockGetMirrorImageIdRequest mock_get_mirror_image_id_request;
+  expect_get_mirror_image_id(mock_get_mirror_image_id_request, "local image id",
+                             0);
+  expect_dir_get_name(m_local_io_ctx, "", -EPERM);
+
   MockStateBuilder* mock_state_builder = nullptr;
   std::string local_image_name;
   C_SaferCond ctx;
@@ -339,7 +369,7 @@ TEST_F(TestMockImageReplayerPrepareLocalImageRequest, DirGetNameError) {
                                                   &ctx);
   req->send();
 
-  ASSERT_EQ(-ENOENT, ctx.wait());
+  ASSERT_EQ(-EPERM, ctx.wait());
 }
 
 TEST_F(TestMockImageReplayerPrepareLocalImageRequest, MirrorImageInfoError) {
index aa2b30f59344cc25760eb75c5df6859b58cda067..4cbf2bd923b3b05c1e951bbdc6a403574b68050a 100644 (file)
@@ -86,10 +86,13 @@ void PrepareLocalImageRequest<I>::handle_get_local_image_name(int r) {
     r = librbd::cls_client::dir_get_name_finish(&it, m_local_image_name);
   }
 
-  if (r < 0) {
-    if (r != -ENOENT) {
-      derr << "failed to retrieve image name: " << cpp_strerror(r) << dendl;
-    }
+  if (r == -ENOENT) {
+    // proceed we should have a mirror image record if we got this far
+    dout(10) << "image does not exist for local image id " << m_local_image_id
+             << dendl;
+    *m_local_image_name = "";
+  } else  if (r < 0) {
+    derr << "failed to retrieve image name: " << cpp_strerror(r) << dendl;
     finish(r);
     return;
   }