From 4a7192f63c3363356f6e1bee0fe8621fbfbba7f7 Mon Sep 17 00:00:00 2001 From: Jason Dillaman Date: Mon, 17 Jul 2017 15:36:21 -0400 Subject: [PATCH] rbd-mirror: missing remote primary should result in warning health Signed-off-by: Jason Dillaman --- src/test/rbd_mirror/test_ImageReplayer.cc | 4 ++-- src/test/rbd_mirror/test_mock_ImageReplayer.cc | 2 +- src/tools/rbd_mirror/ImageReplayer.cc | 18 ++++++++++++------ 3 files changed, 15 insertions(+), 9 deletions(-) diff --git a/src/test/rbd_mirror/test_ImageReplayer.cc b/src/test/rbd_mirror/test_ImageReplayer.cc index c94d2ccee3ee1..1bdc62e96de46 100644 --- a/src/test/rbd_mirror/test_ImageReplayer.cc +++ b/src/test/rbd_mirror/test_ImageReplayer.cc @@ -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()); } diff --git a/src/test/rbd_mirror/test_mock_ImageReplayer.cc b/src/test/rbd_mirror/test_mock_ImageReplayer.cc index aa514db923abf..a80ec323ed322 100644 --- a/src/test/rbd_mirror/test_mock_ImageReplayer.cc +++ b/src/test/rbd_mirror/test_mock_ImageReplayer.cc @@ -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) { diff --git a/src/tools/rbd_mirror/ImageReplayer.cc b/src/tools/rbd_mirror/ImageReplayer.cc index 37bc528cefe35..9783a842d635a 100644 --- a/src/tools/rbd_mirror/ImageReplayer.cc +++ b/src/tools/rbd_mirror/ImageReplayer.cc @@ -333,7 +333,9 @@ image_replayer::HealthState ImageReplayer::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::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::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::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::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; -- 2.39.5