]> git.apps.os.sepia.ceph.com Git - ceph.git/commitdiff
librbd: add function to wait writes unblocked
authorMykola Golub <mgolub@suse.com>
Wed, 14 Mar 2018 12:11:56 +0000 (14:11 +0200)
committerJason Dillaman <dillaman@redhat.com>
Tue, 14 Aug 2018 22:29:45 +0000 (18:29 -0400)
Signed-off-by: Mykola Golub <mgolub@suse.com>
src/librbd/io/ImageRequestWQ.cc
src/librbd/io/ImageRequestWQ.h

index cbcdf1010ab959483dc374cb822646c87dab8f82..2c87e606a209cb30cdb102c0d94496dfdbe66933 100644 (file)
@@ -540,6 +540,7 @@ void ImageRequestWQ<I>::unblock_writes() {
   CephContext *cct = m_image_ctx.cct;
 
   bool wake_up = false;
+  Contexts waiter_contexts;
   {
     RWLock::WLocker locker(m_lock);
     assert(m_write_blockers > 0);
@@ -549,14 +550,36 @@ void ImageRequestWQ<I>::unblock_writes() {
                   << m_write_blockers << dendl;
     if (m_write_blockers == 0) {
       wake_up = true;
+      std::swap(waiter_contexts, m_unblocked_write_waiter_contexts);
     }
   }
 
   if (wake_up) {
+    for (auto ctx : waiter_contexts) {
+      ctx->complete(0);
+    }
     this->signal();
   }
 }
 
+template <typename I>
+void ImageRequestWQ<I>::wait_on_writes_unblocked(Context *on_unblocked) {
+  assert(m_image_ctx.owner_lock.is_locked());
+  CephContext *cct = m_image_ctx.cct;
+
+  {
+    RWLock::WLocker locker(m_lock);
+    ldout(cct, 20) << &m_image_ctx << ", " << "write_blockers="
+                   << m_write_blockers << dendl;
+    if (!m_unblocked_write_waiter_contexts.empty() || m_write_blockers > 0) {
+      m_unblocked_write_waiter_contexts.push_back(on_unblocked);
+      return;
+    }
+  }
+
+  on_unblocked->complete(0);
+}
+
 template <typename I>
 void ImageRequestWQ<I>::set_require_lock(Direction direction, bool enabled) {
   CephContext *cct = m_image_ctx.cct;
index 87e5198da63c9d92c47a7402a308901f90d30d95..ebb0c4bd305ea985beb5800cf8f122bf758b1169 100644 (file)
@@ -69,6 +69,8 @@ public:
   void block_writes(Context *on_blocked);
   void unblock_writes();
 
+  void wait_on_writes_unblocked(Context *on_unblocked);
+
   void set_require_lock(Direction direction, bool enabled);
 
   void apply_qos_limit(uint64_t limit, const uint64_t flag);
@@ -93,6 +95,7 @@ private:
   mutable RWLock m_lock;
   Contexts m_write_blocker_contexts;
   uint32_t m_write_blockers = 0;
+  Contexts m_unblocked_write_waiter_contexts;
   bool m_require_lock_on_read = false;
   bool m_require_lock_on_write = false;
   std::atomic<unsigned> m_queued_reads { 0 };