]> git.apps.os.sepia.ceph.com Git - ceph.git/commitdiff
Objecter::_op_submit_with_budget: add timeout before call
authorSamuel Just <sjust@redhat.com>
Mon, 2 Feb 2015 21:57:00 +0000 (13:57 -0800)
committerSage Weil <sage@redhat.com>
Sun, 1 Mar 2015 05:19:14 +0000 (21:19 -0800)
Objecter::_send_op depends on the ontimeout field being filled in
to avoid 10340 and 9582.

Fixes: 10340
Signed-off-by: Samuel Just <sjust@redhat.com>
(cherry picked from commit cfcfafcb0f33994dbda1efe478ef3ab822ff50d4)

src/osdc/Objecter.cc

index e9d0ade7b0380c32e00d1c871415aef012bb5465..5b4d314fead3f7cbd3d51c4b6083929f2ecd3acc 100644 (file)
@@ -1679,10 +1679,13 @@ class C_CancelOp : public Context
   ceph_tid_t tid;
   Objecter *objecter;
 public:
-  C_CancelOp(ceph_tid_t t, Objecter *objecter) : tid(t), objecter(objecter) {}
+  C_CancelOp(Objecter *objecter) : objecter(objecter) {}
   void finish(int r) {
     objecter->op_cancel(tid, -ETIMEDOUT);
   }
+  void set_tid(ceph_tid_t _tid) {
+    tid = _tid;
+  }
 };
 
 ceph_tid_t Objecter::op_submit(Op *op, int *ctx_budget)
@@ -1711,11 +1714,17 @@ ceph_tid_t Objecter::_op_submit_with_budget(Op *op, RWLock::Context& lc, int *ct
     }
   }
 
+  C_CancelOp *cb = NULL;
+  if (osd_timeout > 0) {
+    cb = new C_CancelOp(this);
+    op->ontimeout = cb;
+  }
+
   ceph_tid_t tid = _op_submit(op, lc);
 
-  if (osd_timeout > 0) {
+  if (cb) {
+    cb->set_tid(tid);
     Mutex::Locker l(timer_lock);
-    op->ontimeout = new C_CancelOp(tid, this);
     timer.add_event_after(osd_timeout, op->ontimeout);
   }