]> git.apps.os.sepia.ceph.com Git - ceph.git/commitdiff
librbd: release lock executing deep copy progress callback 21727/head
authorMykola Golub <mgolub@suse.com>
Sun, 29 Apr 2018 08:24:42 +0000 (11:24 +0300)
committerMykola Golub <mgolub@suse.com>
Mon, 30 Apr 2018 19:24:19 +0000 (22:24 +0300)
Fixes: http://tracker.ceph.com/issues/23929
Signed-off-by: Mykola Golub <mgolub@suse.com>
src/librbd/deep_copy/ImageCopyRequest.cc
src/librbd/deep_copy/ImageCopyRequest.h

index 2006ea3bff05ae679ec3f2cb702c1f4def2fe5fe..4a315f9231bcd2f89a70454330cd27d3b72db7ab 100644 (file)
@@ -86,7 +86,7 @@ void ImageCopyRequest<I>::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<I>::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) {
index 27636db4de6b78fd112c8220566d395c99496318..bdba8fc59409ea00b8f86295ced8b8c988eeb9c2 100644 (file)
@@ -82,6 +82,7 @@ private:
   uint64_t m_current_ops = 0;
   std::priority_queue<
     uint64_t, std::vector<uint64_t>, std::greater<uint64_t>> m_copied_objects;
+  bool m_updating_progress = false;
   SnapMap m_snap_map;
   int m_ret_val = 0;