From: Mykola Golub Date: Wed, 16 May 2018 07:34:50 +0000 (+0300) Subject: rbd-mirror: don't reregister asok hook in process entry thread X-Git-Tag: v12.2.6~58^2~1 X-Git-Url: http://git-server-git.apps.pok.os.sepia.ceph.com/?a=commitdiff_plain;h=07f76e6dc5b927f07b75ddb19038a799dc8d69c3;p=ceph.git rbd-mirror: don't reregister asok hook in process entry thread It might get stuck if the asok is busy executing a command. Instead kick status update, which will call reregister on finish. Fixes: http://tracker.ceph.com/issues/24141 Signed-off-by: Mykola Golub (cherry picked from commit 43e50bd582ba2d1b66f55d7f8d2b7f030da99ee6) --- diff --git a/src/tools/rbd_mirror/ImageReplayer.cc b/src/tools/rbd_mirror/ImageReplayer.cc index 39dc9933d01..e8de2fa7be7 100644 --- a/src/tools/rbd_mirror/ImageReplayer.cc +++ b/src/tools/rbd_mirror/ImageReplayer.cc @@ -1238,12 +1238,18 @@ void ImageReplayer::handle_process_entry_ready(int r) { dout(20) << dendl; assert(r == 0); + bool update_status = false; { RWLock::RLocker snap_locker(m_local_image_ctx->snap_lock); - m_local_image_name = m_local_image_ctx->name; + if (m_local_image_name != m_local_image_ctx->name) { + m_local_image_name = m_local_image_ctx->name; + update_status = true; + } } - reregister_admin_socket_hook(); + if (update_status) { + reschedule_update_status_task(0); + } // attempt to process the next event handle_replay_ready(); @@ -1303,6 +1309,8 @@ bool ImageReplayer::start_mirror_image_status_update(bool force, template void ImageReplayer::finish_mirror_image_status_update() { + reregister_admin_socket_hook(); + Context *on_finish = nullptr; { Mutex::Locker locker(m_lock);