From 93b9eb7dd8364ab27cc7a1399fd0bc0b68f41342 Mon Sep 17 00:00:00 2001 From: Mykola Golub Date: Sun, 29 Apr 2018 11:24:42 +0300 Subject: [PATCH] librbd: release lock executing deep copy progress callback Fixes: http://tracker.ceph.com/issues/23929 Signed-off-by: Mykola Golub --- src/librbd/deep_copy/ImageCopyRequest.cc | 14 ++++++++++---- src/librbd/deep_copy/ImageCopyRequest.h | 1 + 2 files changed, 11 insertions(+), 4 deletions(-) diff --git a/src/librbd/deep_copy/ImageCopyRequest.cc b/src/librbd/deep_copy/ImageCopyRequest.cc index 2006ea3bff0..4a315f9231b 100644 --- a/src/librbd/deep_copy/ImageCopyRequest.cc +++ b/src/librbd/deep_copy/ImageCopyRequest.cc @@ -86,7 +86,7 @@ void ImageCopyRequest::send_object_copies() { break; } } - complete = (m_current_ops == 0); + complete = (m_current_ops == 0) && !m_updating_progress; } if (complete) { @@ -139,16 +139,22 @@ void ImageCopyRequest::handle_object_copy(uint64_t object_no, int r) { } } else { m_copied_objects.push(object_no); - while (m_copied_objects.top() == + while (!m_updating_progress && m_copied_objects.top() == (m_object_number ? *m_object_number + 1 : 0)) { m_object_number = m_copied_objects.top(); m_copied_objects.pop(); - m_prog_ctx->update_progress(*m_object_number + 1, m_end_object_no); + uint64_t progress_object_no = *m_object_number + 1; + m_updating_progress = true; + m_lock.Unlock(); + m_prog_ctx->update_progress(progress_object_no, m_end_object_no); + m_lock.Lock(); + assert(m_updating_progress); + m_updating_progress = false; } } send_next_object_copy(); - complete = (m_current_ops == 0); + complete = (m_current_ops == 0) && !m_updating_progress; } if (complete) { diff --git a/src/librbd/deep_copy/ImageCopyRequest.h b/src/librbd/deep_copy/ImageCopyRequest.h index 27636db4de6..bdba8fc5940 100644 --- a/src/librbd/deep_copy/ImageCopyRequest.h +++ b/src/librbd/deep_copy/ImageCopyRequest.h @@ -82,6 +82,7 @@ private: uint64_t m_current_ops = 0; std::priority_queue< uint64_t, std::vector, std::greater> m_copied_objects; + bool m_updating_progress = false; SnapMap m_snap_map; int m_ret_val = 0; -- 2.39.5