From 7f111cdfd3152a8ce483edb31a1342a3900b532b Mon Sep 17 00:00:00 2001 From: Mykola Golub Date: Wed, 16 May 2018 10:34:50 +0300 Subject: [PATCH] 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) --- src/tools/rbd_mirror/ImageReplayer.cc | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-) diff --git a/src/tools/rbd_mirror/ImageReplayer.cc b/src/tools/rbd_mirror/ImageReplayer.cc index 3af0e3a0d5c5b..367fbb90c884b 100644 --- a/src/tools/rbd_mirror/ImageReplayer.cc +++ b/src/tools/rbd_mirror/ImageReplayer.cc @@ -1212,12 +1212,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(); @@ -1277,6 +1283,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); -- 2.39.5