]> git.apps.os.sepia.ceph.com Git - ceph-ci.git/commitdiff
librbd: dispatch delayed requests only if read intersects
authorMykola Golub <mgolub@suse.com>
Mon, 8 Apr 2019 19:03:22 +0000 (20:03 +0100)
committerMykola Golub <mgolub@suse.com>
Mon, 8 Apr 2019 19:03:22 +0000 (20:03 +0100)
Signed-off-by: Mykola Golub <mgolub@suse.com>
src/librbd/io/SimpleSchedulerObjectDispatch.cc
src/librbd/io/SimpleSchedulerObjectDispatch.h

index a76abf903729e982dbaede6f7cf0ba9732d08fc6..82548a821ae50951b8b56526c3413c77b2d2376e 100644 (file)
@@ -61,8 +61,7 @@ bool SimpleSchedulerObjectDispatch<I>::ObjectRequests::try_delay_request(
     int op_flags, int object_dispatch_flags, Context* on_dispatched) {
   if (!m_delayed_requests.empty()) {
     if (snapc.seq != m_snapc.seq || op_flags != m_op_flags ||
-        data.length() == 0 ||
-        m_delayed_request_extents.intersects(object_off, data.length())) {
+        data.length() == 0 || intersects(object_off, data.length())) {
       return false;
     }
   } else {
@@ -222,7 +221,9 @@ bool SimpleSchedulerObjectDispatch<I>::read(
                  << object_len << dendl;
 
   Mutex::Locker locker(m_lock);
-  dispatch_delayed_requests(object_no);
+  if (intersects(object_no, object_off, object_len)) {
+    dispatch_delayed_requests(object_no);
+  }
 
   return false;
 }
@@ -322,6 +323,21 @@ bool SimpleSchedulerObjectDispatch<I>::flush(
   return false;
 }
 
+template <typename I>
+bool SimpleSchedulerObjectDispatch<I>::intersects(
+    uint64_t object_no, uint64_t object_off, uint64_t len) const {
+  ceph_assert(m_lock.is_locked());
+  auto cct = m_image_ctx->cct;
+
+  auto it = m_requests.find(object_no);
+  bool intersects = (it != m_requests.end()) &&
+      it->second->intersects(object_off, len);
+
+  ldout(cct, 20) << intersects << dendl;
+
+  return intersects;
+}
+
 template <typename I>
 bool SimpleSchedulerObjectDispatch<I>::try_delay_write(
     uint64_t object_no, uint64_t object_off, ceph::bufferlist&& data,
index 6cfd4f626850317de4741c7a338203be226355ba..d52b8ef27217b68e67996b0e5e12a2a9e66e418e 100644 (file)
@@ -143,6 +143,10 @@ private:
       return m_delayed_requests.size();
     }
 
+    bool intersects(uint64_t object_off, uint64_t len) const {
+      return m_delayed_request_extents.intersects(object_off, len);
+    }
+
     bool try_delay_request(uint64_t object_off, ceph::bufferlist&& data,
                            const ::SnapContext &snapc, int op_flags,
                            int object_dispatch_flags, Context* on_dispatched);
@@ -186,6 +190,7 @@ private:
                        ceph::bufferlist&& data, const ::SnapContext &snapc,
                        int op_flags, int object_dispatch_flags,
                        Context* on_dispatched);
+  bool intersects(uint64_t object_no, uint64_t object_off, uint64_t len) const;
 
   void dispatch_all_delayed_requests();
   void dispatch_delayed_requests(uint64_t object_no);