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 <sage@redhat.com>
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);
}
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) {
vector<OSDOp> &ops;
version_t user_version;
int data_offset;
+ bool canceled; ///< true if canceled
ProxyReadOp(OpRequestRef _op, hobject_t oid, vector<OSDOp>& _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<ProxyReadOp> ProxyReadOpRef;