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());
}
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());
}
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;
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;
}
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 = "";
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;
}
// 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;