From 78fe19260afdd36df53dd24564542d3efc1a214f Mon Sep 17 00:00:00 2001 From: Jason Dillaman Date: Mon, 31 Aug 2020 18:08:24 -0400 Subject: [PATCH] librbd: simplify in-flight IO tracking for write-block image dispatch Now that we don't need to worry about read requests issuing a finish callback, we can use a simple counter to track in-flight writes. Signed-off-by: Jason Dillaman --- src/librbd/io/WriteBlockImageDispatch.cc | 13 ++++++------- src/librbd/io/WriteBlockImageDispatch.h | 4 +--- 2 files changed, 7 insertions(+), 10 deletions(-) diff --git a/src/librbd/io/WriteBlockImageDispatch.cc b/src/librbd/io/WriteBlockImageDispatch.cc index d7895f1658c..e2b5315fda5 100644 --- a/src/librbd/io/WriteBlockImageDispatch.cc +++ b/src/librbd/io/WriteBlockImageDispatch.cc @@ -66,9 +66,9 @@ void WriteBlockImageDispatch::block_writes(Context *on_blocked) { ++m_write_blockers; ldout(cct, 5) << m_image_ctx << ", " << "num=" << m_write_blockers << dendl; - if (!m_write_blocker_contexts.empty() || !m_in_flight_write_tids.empty()) { + if (!m_write_blocker_contexts.empty() || m_in_flight_writes > 0) { ldout(cct, 5) << "waiting for in-flight writes to complete: " - << "write_tids=" << m_in_flight_write_tids << dendl; + << "in_flight_writes=" << m_in_flight_writes << dendl; m_write_blocker_contexts.push_back(on_blocked); return; } @@ -200,12 +200,11 @@ void WriteBlockImageDispatch::handle_finished(int r, uint64_t tid) { ldout(cct, 20) << "r=" << r << ", tid=" << tid << dendl; std::unique_lock locker{m_lock}; - auto it = m_in_flight_write_tids.find(tid); - ceph_assert(it != m_in_flight_write_tids.end()); - m_in_flight_write_tids.erase(it); + ceph_assert(m_in_flight_writes > 0); + --m_in_flight_writes; bool writes_blocked = false; - if (m_write_blockers > 0 && m_in_flight_write_tids.empty()) { + if (m_write_blockers > 0 && m_in_flight_writes == 0) { ldout(cct, 10) << "flushing all in-flight IO for blocked writes" << dendl; writes_blocked = true; } @@ -227,11 +226,11 @@ bool WriteBlockImageDispatch::process_io( return true; } + ++m_in_flight_writes; *on_finish = new LambdaContext([this, tid, on_finish=*on_finish](int r) { handle_finished(r, tid); on_finish->complete(r); }); - m_in_flight_write_tids.insert(tid); return false; } diff --git a/src/librbd/io/WriteBlockImageDispatch.h b/src/librbd/io/WriteBlockImageDispatch.h index 00e2c89c003..4383e2e21c6 100644 --- a/src/librbd/io/WriteBlockImageDispatch.h +++ b/src/librbd/io/WriteBlockImageDispatch.h @@ -13,7 +13,6 @@ #include "librbd/io/ReadResult.h" #include "librbd/io/Types.h" #include -#include struct Context; @@ -93,17 +92,16 @@ private: struct C_BlockedWrites; typedef std::list Contexts; - typedef std::set Tids; ImageCtxT* m_image_ctx; mutable ceph::shared_mutex m_lock; Contexts m_on_dispatches; - Tids m_in_flight_write_tids; uint32_t m_write_blockers = 0; Contexts m_write_blocker_contexts; Contexts m_unblocked_write_waiter_contexts; + uint64_t m_in_flight_writes = 0; void handle_finished(int r, uint64_t tid); -- 2.39.5