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 <sage@redhat.com>
This commit is contained in:
Sage Weil 2014-12-06 17:45:28 -08:00
parent 1c8b679d0c
commit 1554fbc87e
2 changed files with 8 additions and 1 deletions

View File

@ -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) {

View File

@ -217,11 +217,13 @@ public:
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;