From a316c1c1687a0c5188a0cf947e93a4f7e483c0b1 Mon Sep 17 00:00:00 2001 From: Jason Dillaman Date: Sun, 22 Dec 2019 17:56:59 -0500 Subject: [PATCH] rbd-mirror: fix race between replay shutdown and notification Signed-off-by: Jason Dillaman --- src/tools/rbd_mirror/ImageReplayer.cc | 23 ++++++++++++----------- 1 file changed, 12 insertions(+), 11 deletions(-) diff --git a/src/tools/rbd_mirror/ImageReplayer.cc b/src/tools/rbd_mirror/ImageReplayer.cc index f75d2962f50d3..e993e55507db7 100644 --- a/src/tools/rbd_mirror/ImageReplayer.cc +++ b/src/tools/rbd_mirror/ImageReplayer.cc @@ -961,26 +961,27 @@ template void ImageReplayer::handle_replayer_notification() { dout(10) << dendl; - // detect a rename of the local image - std::string local_image_name; - { - std::shared_lock image_locker{m_local_image_ctx->image_lock}; - local_image_name = m_local_image_ctx->name; + std::unique_lock locker{m_lock}; + if (m_state != STATE_REPLAYING) { + // might be attempting to shut down + return; } { - std::unique_lock locker{m_lock}; - ceph_assert(m_state == STATE_REPLAYING); - ceph_assert(m_replayer != nullptr); - - if (m_local_image_name != local_image_name) { + // detect a rename of the local image + ceph_assert(m_local_image_ctx != nullptr); + std::shared_lock image_locker{m_local_image_ctx->image_lock}; + if (m_local_image_name != m_local_image_ctx->name) { // will re-register with new name after next status update dout(10) << "image renamed" << dendl; - m_local_image_name = local_image_name; + m_local_image_name = m_local_image_ctx->name; } } // replayer cannot be shut down while notification is in-flight + ceph_assert(m_replayer != nullptr); + locker.unlock(); + if (m_replayer->is_resync_requested()) { dout(10) << "resync requested" << dendl; m_resync_requested = true; -- 2.39.5