From 42232bcff897f69bc1aad1a50ad4de83bc330d66 Mon Sep 17 00:00:00 2001 From: Mykola Golub Date: Mon, 8 Apr 2019 20:03:22 +0100 Subject: [PATCH] librbd: dispatch delayed requests only if read intersects Signed-off-by: Mykola Golub --- .../io/SimpleSchedulerObjectDispatch.cc | 22 ++++++++++++++++--- src/librbd/io/SimpleSchedulerObjectDispatch.h | 5 +++++ 2 files changed, 24 insertions(+), 3 deletions(-) diff --git a/src/librbd/io/SimpleSchedulerObjectDispatch.cc b/src/librbd/io/SimpleSchedulerObjectDispatch.cc index a76abf90372..82548a821ae 100644 --- a/src/librbd/io/SimpleSchedulerObjectDispatch.cc +++ b/src/librbd/io/SimpleSchedulerObjectDispatch.cc @@ -61,8 +61,7 @@ bool SimpleSchedulerObjectDispatch::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::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::flush( return false; } +template +bool SimpleSchedulerObjectDispatch::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 bool SimpleSchedulerObjectDispatch::try_delay_write( uint64_t object_no, uint64_t object_off, ceph::bufferlist&& data, diff --git a/src/librbd/io/SimpleSchedulerObjectDispatch.h b/src/librbd/io/SimpleSchedulerObjectDispatch.h index 6cfd4f62685..d52b8ef2721 100644 --- a/src/librbd/io/SimpleSchedulerObjectDispatch.h +++ b/src/librbd/io/SimpleSchedulerObjectDispatch.h @@ -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); -- 2.39.5