From 1554fbc87ee5abe2d4940648a33be3facf74a423 Mon Sep 17 00:00:00 2001 From: Sage Weil Date: Sat, 6 Dec 2014 17:45:28 -0800 Subject: [PATCH] osd/ReplicatedPG: improve proxy read cancelation Avoid taking the PG lock for a canceled read op (if we are lucky). Recheck after the lock is taken for good measure. Signed-off-by: Sage Weil --- src/osd/ReplicatedPG.cc | 5 +++++ src/osd/ReplicatedPG.h | 4 +++- 2 files changed, 8 insertions(+), 1 deletion(-) diff --git a/src/osd/ReplicatedPG.cc b/src/osd/ReplicatedPG.cc index 6872a2370c1..bea2a5f032c 100644 --- a/src/osd/ReplicatedPG.cc +++ b/src/osd/ReplicatedPG.cc @@ -1943,7 +1943,11 @@ struct C_ProxyRead : public Context { tid(0), prdop(prd) {} void finish(int r) { + if (prdop->canceled) + return; pg->lock(); + if (prdop->canceled) + return; if (last_peering_reset == pg->get_last_peering_reset()) { pg->finish_proxy_read(oid, tid, r); } @@ -2044,6 +2048,7 @@ void ReplicatedPG::kick_proxy_read_blocked(hobject_t& soid) void ReplicatedPG::cancel_proxy_read(ProxyReadOpRef prdop) { dout(10) << __func__ << " " << prdop->soid << dendl; + prdop->canceled = true; // cancel objecter op, if we can if (prdop->objecter_tid) { diff --git a/src/osd/ReplicatedPG.h b/src/osd/ReplicatedPG.h index 2707f337d6e..5f3264ca164 100644 --- a/src/osd/ReplicatedPG.h +++ b/src/osd/ReplicatedPG.h @@ -217,11 +217,13 @@ public: vector &ops; version_t user_version; int data_offset; + bool canceled; ///< true if canceled ProxyReadOp(OpRequestRef _op, hobject_t oid, vector& _ops) : op(_op), soid(oid), objecter_tid(0), ops(_ops), - user_version(0), data_offset(0) { } + user_version(0), data_offset(0), + canceled(false) { } }; typedef boost::shared_ptr ProxyReadOpRef;