From bfb71a4e63a15338544b25e5c21623add97692fd Mon Sep 17 00:00:00 2001 From: Zhiqiang Wang Date: Fri, 21 Nov 2014 14:01:24 +0800 Subject: [PATCH] osd: tiering: cancel and requeue proxy read when needed Cancel and requeue proxy read on the following cases: 1) on_shutdown 2) on_change 3) background promotion is done Signed-off-by: Zhiqiang Wang Conflicts: src/osd/ReplicatedPG.cc src/osd/ReplicatedPG.h --- src/osd/ReplicatedPG.cc | 55 +++++++++++++++++++++++++++++++++++++++++ src/osd/ReplicatedPG.h | 3 +++ 2 files changed, 58 insertions(+) diff --git a/src/osd/ReplicatedPG.cc b/src/osd/ReplicatedPG.cc index 46ec6eccb08cd..6154bb0459676 100644 --- a/src/osd/ReplicatedPG.cc +++ b/src/osd/ReplicatedPG.cc @@ -2021,6 +2021,49 @@ void ReplicatedPG::finish_proxy_read(hobject_t oid, ceph_tid_t tid, int r) complete_read_ctx(r, ctx); } +void ReplicatedPG::kick_proxy_read_blocked(hobject_t& soid) +{ + map >::iterator p = in_progress_proxy_reads.find(soid); + if (p == in_progress_proxy_reads.end()) + return; + + list& ls = p->second; + dout(10) << __func__ << " " << soid << " requeuing " << ls.size() << " requests" << dendl; + requeue_ops(ls); + in_progress_proxy_reads.erase(p); +} + +void ReplicatedPG::cancel_proxy_read(ProxyReadOpRef prdop) +{ + dout(10) << __func__ << " " << prdop->soid << dendl; + + // cancel objecter op, if we can + if (prdop->objecter_tid) { + osd->objecter->op_cancel(prdop->objecter_tid, -ECANCELED); + proxyread_ops.erase(prdop->objecter_tid); + prdop->objecter_tid = 0; + } +} + +void ReplicatedPG::cancel_proxy_read_ops(bool requeue) +{ + dout(10) << __func__ << dendl; + map::iterator p = proxyread_ops.begin(); + while (p != proxyread_ops.end()) { + cancel_proxy_read((p++)->second); + } + + if (requeue) { + for (map >::iterator p = in_progress_proxy_reads.begin(); + p != in_progress_proxy_reads.end(); p++) { + list& ls = p->second; + dout(10) << __func__ << " " << p->first << " requeuing " << ls.size() << " requests" << dendl; + requeue_ops(ls); + in_progress_proxy_reads.erase(p); + } + } +} + class PromoteCallback: public ReplicatedPG::CopyCallback { ObjectContextRef obc; ReplicatedPG *pg; @@ -6347,6 +6390,16 @@ void ReplicatedPG::process_copy_chunk(hobject_t oid, ceph_tid_t tid, int r) copy_ops.erase(cobc->obs.oi.soid); cobc->stop_block(); + + // cancel and requeue proxy reads on this object + kick_proxy_read_blocked(cobc->obs.oi.soid); + for (map::iterator it = proxyread_ops.begin(); + it != proxyread_ops.end(); it++) { + if (it->second->soid == cobc->obs.oi.soid) { + cancel_proxy_read(it->second); + } + } + kick_object_context_blocked(cobc); } @@ -10130,6 +10183,7 @@ void ReplicatedPG::on_shutdown() unreg_next_scrub(); cancel_copy_ops(false); cancel_flush_ops(false); + cancel_proxy_read_ops(false); apply_and_flush_repops(false); pgbackend->on_change(); @@ -10220,6 +10274,7 @@ void ReplicatedPG::on_change(ObjectStore::Transaction *t) cancel_copy_ops(is_primary()); cancel_flush_ops(is_primary()); + cancel_proxy_read_ops(is_primary()); // requeue object waiters if (is_primary()) { diff --git a/src/osd/ReplicatedPG.h b/src/osd/ReplicatedPG.h index 8307c86e7fefe..2707f337d6e1c 100644 --- a/src/osd/ReplicatedPG.h +++ b/src/osd/ReplicatedPG.h @@ -1343,6 +1343,9 @@ protected: void do_proxy_read(OpRequestRef op); void finish_proxy_read(hobject_t oid, ceph_tid_t tid, int r); + void kick_proxy_read_blocked(hobject_t& soid); + void cancel_proxy_read(ProxyReadOpRef prdop); + void cancel_proxy_read_ops(bool requeue); friend struct C_ProxyRead; -- 2.39.5