From: Jason Dillaman Date: Wed, 18 May 2016 03:31:02 +0000 (-0400) Subject: rbd-mirror: track bootstrap state within image status X-Git-Tag: v11.0.0~496^2~3 X-Git-Url: http://git-server-git.apps.pok.os.sepia.ceph.com/?a=commitdiff_plain;h=e5dd97b4bf4a993911febf34dce90470a2a91d59;p=ceph.git rbd-mirror: track bootstrap state within image status Signed-off-by: Jason Dillaman --- diff --git a/src/tools/rbd_mirror/ImageReplayer.cc b/src/tools/rbd_mirror/ImageReplayer.cc index dbc93a86a78..34d28423fa0 100644 --- a/src/tools/rbd_mirror/ImageReplayer.cc +++ b/src/tools/rbd_mirror/ImageReplayer.cc @@ -372,8 +372,6 @@ void ImageReplayer::bootstrap() { dout(20) << "bootstrap params: " << "local_image_name=" << m_local_image_name << dendl; - update_mirror_image_status(); - // TODO: add a new bootstrap state and support canceling Context *ctx = create_context_callback< ImageReplayer, &ImageReplayer::handle_bootstrap>(this); @@ -384,13 +382,25 @@ void ImageReplayer::bootstrap() { m_threads->work_queue, m_threads->timer, &m_threads->timer_lock, m_local_mirror_uuid, m_remote_mirror_uuid, m_remote_journaler, &m_client_meta, ctx, &m_progress_cxt); + + { + Mutex::Locker locker(m_lock); + m_bootstrap_request = request; + } + request->send(); + update_mirror_image_status(); } template void ImageReplayer::handle_bootstrap(int r) { dout(20) << "r=" << r << dendl; + { + Mutex::Locker locker(m_lock); + m_bootstrap_request = nullptr; + } + if (r == -EREMOTEIO) { dout(5) << "remote image is non-primary or local image is primary" << dendl; on_start_fail_start(0, "remote image is non-primary or local image is primary"); @@ -1067,8 +1077,7 @@ void ImageReplayer::update_mirror_image_status(bool final, switch (m_state) { case STATE_STARTING: - // TODO: a better way to detect syncing state. - if (!m_asok_hook) { + if (m_bootstrap_request != nullptr) { status.state = cls::rbd::MIRROR_IMAGE_STATUS_STATE_SYNCING; status.description = m_state_desc.empty() ? "syncing" : m_state_desc; } else { diff --git a/src/tools/rbd_mirror/ImageReplayer.h b/src/tools/rbd_mirror/ImageReplayer.h index af8133d92be..42ad9f92a25 100644 --- a/src/tools/rbd_mirror/ImageReplayer.h +++ b/src/tools/rbd_mirror/ImageReplayer.h @@ -40,6 +40,7 @@ namespace mirror { struct Threads; +namespace image_replayer { template class BootstrapRequest; } namespace image_replayer { template class ReplayStatusFormatter; } /** @@ -231,6 +232,8 @@ private: AdminSocketHook *m_asok_hook = nullptr; + image_replayer::BootstrapRequest *m_bootstrap_request = nullptr; + librbd::journal::MirrorPeerClientMeta m_client_meta; ReplayEntry m_replay_entry;