]> git-server-git.apps.pok.os.sepia.ceph.com Git - ceph.git/commitdiff
rbd-mirror: missing remote primary should result in warning health
authorJason Dillaman <dillaman@redhat.com>
Mon, 17 Jul 2017 19:36:21 +0000 (15:36 -0400)
committerJason Dillaman <dillaman@redhat.com>
Tue, 18 Jul 2017 14:47:47 +0000 (10:47 -0400)
Signed-off-by: Jason Dillaman <dillaman@redhat.com>
src/test/rbd_mirror/test_ImageReplayer.cc
src/test/rbd_mirror/test_mock_ImageReplayer.cc
src/tools/rbd_mirror/ImageReplayer.cc

index c94d2ccee3ee1cccc4ab8fef18074eb8aedea314..1bdc62e96de46422a0d394f09b8f6dc11d36033b 100644 (file)
@@ -459,7 +459,7 @@ TEST_F(TestImageReplayer, BootstrapMirrorDisabling)
   create_replayer<>();
   C_SaferCond cond;
   m_replayer->start(&cond);
-  ASSERT_EQ(0, cond.wait());
+  ASSERT_EQ(-EREMOTEIO, cond.wait());
   ASSERT_TRUE(m_replayer->is_stopped());
 }
 
@@ -474,7 +474,7 @@ TEST_F(TestImageReplayer, BootstrapDemoted)
   create_replayer<>();
   C_SaferCond cond;
   m_replayer->start(&cond);
-  ASSERT_EQ(0, cond.wait());
+  ASSERT_EQ(-EREMOTEIO, cond.wait());
   ASSERT_TRUE(m_replayer->is_stopped());
 }
 
index aa514db923abffee94680075754eb1d213512755..a80ec323ed322d78e976b8f5b1cd177a9a24e738 100644 (file)
@@ -572,7 +572,7 @@ TEST_F(TestMockImageReplayer, LocalImageDNE) {
 
   C_SaferCond start_ctx;
   m_image_replayer->start(&start_ctx);
-  ASSERT_EQ(0, start_ctx.wait());
+  ASSERT_EQ(-EREMOTEIO, start_ctx.wait());
 }
 
 TEST_F(TestMockImageReplayer, PrepareLocalImageError) {
index 37bc528cefe35bc6fed764dca79f9d82fd11ef9c..9783a842d635a6b458a272a98088919ea14819e3 100644 (file)
@@ -333,7 +333,9 @@ image_replayer::HealthState ImageReplayer<I>::get_health_state() const {
   if (!m_mirror_image_status_state) {
     return image_replayer::HEALTH_STATE_OK;
   } else if (*m_mirror_image_status_state ==
-      cls::rbd::MIRROR_IMAGE_STATUS_STATE_SYNCING) {
+               cls::rbd::MIRROR_IMAGE_STATUS_STATE_SYNCING ||
+             *m_mirror_image_status_state ==
+               cls::rbd::MIRROR_IMAGE_STATUS_STATE_UNKNOWN) {
     return image_replayer::HEALTH_STATE_WARNING;
   }
   return image_replayer::HEALTH_STATE_ERROR;
@@ -458,7 +460,7 @@ void ImageReplayer<I>::bootstrap() {
   dout(20) << dendl;
 
   if (m_remote_images.empty()) {
-    on_start_fail(0, "waiting for primary remote image");
+    on_start_fail(-EREMOTEIO, "waiting for primary remote image");
     return;
   }
 
@@ -513,8 +515,8 @@ void ImageReplayer<I>::handle_bootstrap(int r) {
 
   if (r == -EREMOTEIO) {
     m_local_image_tag_owner = "";
-    dout(5) << "remote image is non-primary or local image is primary" << dendl;
-    on_start_fail(0, "remote image is non-primary or local image is primary");
+    dout(5) << "remote image is non-primary" << dendl;
+    on_start_fail(-EREMOTEIO, "remote image is non-primary");
     return;
   } else if (r == -EEXIST) {
     m_local_image_tag_owner = "";
@@ -695,7 +697,7 @@ void ImageReplayer<I>::on_start_fail(int r, const std::string &desc)
         Mutex::Locker locker(m_lock);
         assert(m_state == STATE_STARTING);
         m_state = STATE_STOPPING;
-        if (r < 0 && r != -ECANCELED) {
+        if (r < 0 && r != -ECANCELED && r != -EREMOTEIO) {
           derr << "start failed: " << cpp_strerror(r) << dendl;
         } else {
           dout(20) << "start canceled" << dendl;
@@ -1391,7 +1393,11 @@ void ImageReplayer<I>::send_mirror_status_update(const OptionalState &opt_state)
     }
     // FALLTHROUGH
   case STATE_STOPPED:
-    if (last_r < 0) {
+    if (last_r == -EREMOTEIO) {
+      status.state = cls::rbd::MIRROR_IMAGE_STATUS_STATE_UNKNOWN;
+      status.description = state_desc;
+      mirror_image_status_state = status.state;
+    } else if (last_r < 0) {
       status.state = cls::rbd::MIRROR_IMAGE_STATUS_STATE_ERROR;
       status.description = state_desc;
       mirror_image_status_state = status.state;