From: Mykola Golub Date: Wed, 14 Mar 2018 12:11:56 +0000 (+0200) Subject: librbd: add function to wait writes unblocked X-Git-Tag: v14.0.1~590^2~25 X-Git-Url: http://git-server-git.apps.pok.os.sepia.ceph.com/?a=commitdiff_plain;h=eed5415aec555adc397e91ef2810a913f9c4e628;p=ceph.git librbd: add function to wait writes unblocked Signed-off-by: Mykola Golub --- diff --git a/src/librbd/io/ImageRequestWQ.cc b/src/librbd/io/ImageRequestWQ.cc index cbcdf1010ab9..2c87e606a209 100644 --- a/src/librbd/io/ImageRequestWQ.cc +++ b/src/librbd/io/ImageRequestWQ.cc @@ -540,6 +540,7 @@ void ImageRequestWQ::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::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 +void ImageRequestWQ::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 void ImageRequestWQ::set_require_lock(Direction direction, bool enabled) { CephContext *cct = m_image_ctx.cct; diff --git a/src/librbd/io/ImageRequestWQ.h b/src/librbd/io/ImageRequestWQ.h index 87e5198da63c..ebb0c4bd305e 100644 --- a/src/librbd/io/ImageRequestWQ.h +++ b/src/librbd/io/ImageRequestWQ.h @@ -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 m_queued_reads { 0 };