From 938e03630e075af03780da139ae879b5b0377734 Mon Sep 17 00:00:00 2001 From: Samuel Just Date: Mon, 2 Feb 2015 13:57:00 -0800 Subject: [PATCH] Objecter::_op_submit_with_budget: add timeout before call Objecter::_send_op depends on the ontimeout field being filled in to avoid 10340 and 9582. Fixes: 10340 Signed-off-by: Samuel Just (cherry picked from commit cfcfafcb0f33994dbda1efe478ef3ab822ff50d4) --- src/osdc/Objecter.cc | 15 ++++++++++++--- 1 file changed, 12 insertions(+), 3 deletions(-) diff --git a/src/osdc/Objecter.cc b/src/osdc/Objecter.cc index e9d0ade7b0380..5b4d314fead3f 100644 --- a/src/osdc/Objecter.cc +++ b/src/osdc/Objecter.cc @@ -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); }