]> git.apps.os.sepia.ceph.com Git - ceph.git/commitdiff
osd/ReplicatedPG: improve proxy read cancelation
authorSage Weil <sage@redhat.com>
Sun, 7 Dec 2014 01:45:28 +0000 (17:45 -0800)
committerSage Weil <sage@redhat.com>
Sun, 11 Jan 2015 04:35:31 +0000 (20:35 -0800)
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>
src/osd/ReplicatedPG.cc
src/osd/ReplicatedPG.h

index 6872a2370c1f1d8ef68add5bc22ede91b23e361d..bea2a5f032c5d13d128586abb72f66840918c849 100644 (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) {
index 2707f337d6e1cad3a081fe3755d74622ef6bddfd..5f3264ca164796d8bbe7e7e8fe178f5e084f07c1 100644 (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;