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 {
<< 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;
}
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,
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);
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);