]> git.apps.os.sepia.ceph.com Git - ceph-ci.git/commitdiff
librbd: simplify in-flight IO tracking for write-block image dispatch
authorJason Dillaman <dillaman@redhat.com>
Mon, 31 Aug 2020 22:08:24 +0000 (18:08 -0400)
committerJason Dillaman <dillaman@redhat.com>
Fri, 18 Sep 2020 03:52:32 +0000 (23:52 -0400)
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 <dillaman@redhat.com>
src/librbd/io/WriteBlockImageDispatch.cc
src/librbd/io/WriteBlockImageDispatch.h

index d7895f1658cb9b93d117061d917f56584f2ca15d..e2b5315fda590a967907f4a63dc479988bbbc6af 100644 (file)
@@ -66,9 +66,9 @@ void WriteBlockImageDispatch<I>::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<I>::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<I>::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;
 }
 
index 00e2c89c00313c22b7ae380f9391c2d4d2498875..4383e2e21c691b9a159513fe7a4a80a6c655c39c 100644 (file)
@@ -13,7 +13,6 @@
 #include "librbd/io/ReadResult.h"
 #include "librbd/io/Types.h"
 #include <list>
-#include <set>
 
 struct Context;
 
@@ -93,17 +92,16 @@ private:
   struct C_BlockedWrites;
 
   typedef std::list<Context*> Contexts;
-  typedef std::set<uint64_t> 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);