mirror of
https://github.com/ceph/ceph
synced 2025-02-23 19:17:37 +00:00
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:
parent
1c8b679d0c
commit
1554fbc87e
@ -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) {
|
||||
|
@ -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;
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user