From: Sage Weil Date: Sun, 18 Aug 2013 00:01:53 +0000 (-0700) Subject: osdc/Objecter: allow ops to be canceled X-Git-Tag: v0.69~27^2~10 X-Git-Url: http://git-server-git.apps.pok.os.sepia.ceph.com/?a=commitdiff_plain;h=36d6e6fa40679be72bf8bce3f9d404dcf6ea6c10;p=ceph.git osdc/Objecter: allow ops to be canceled This is useful in general, and specifically will be useful for the rados COPY operation. Signed-off-by: Sage Weil --- diff --git a/src/osdc/Objecter.cc b/src/osdc/Objecter.cc index af6ebd6ae179..75292d13ac3a 100644 --- a/src/osdc/Objecter.cc +++ b/src/osdc/Objecter.cc @@ -1281,6 +1281,32 @@ tid_t Objecter::_op_submit(Op *op) return op->tid; } +int Objecter::op_cancel(tid_t tid) +{ + assert(client_lock.is_locked()); + assert(initialized); + + map::iterator p = ops.find(tid); + if (p == ops.end()) { + ldout(cct, 10) << __func__ << " tid " << tid << " dne" << dendl; + return -ENOENT; + } + + ldout(cct, 10) << __func__ << " tid " << tid << dendl; + Op *op = p->second; + if (op->onack) { + op->onack->complete(-ECANCELED); + op->onack = NULL; + } + if (op->oncommit) { + op->oncommit->complete(-ECANCELED); + op->oncommit = NULL; + } + op_cancel_map_check(op); + finish_op(op); + return 0; +} + bool Objecter::is_pg_changed(vector& o, vector& n, bool any_change) { if (o.empty() && n.empty()) diff --git a/src/osdc/Objecter.h b/src/osdc/Objecter.h index 4fdaa407a58b..f4ef5b762917 100644 --- a/src/osdc/Objecter.h +++ b/src/osdc/Objecter.h @@ -1255,6 +1255,9 @@ private: /** Clear the passed flags from the global op flag set */ void clear_global_op_flag(int flags) { global_op_flags &= ~flags; } + /// cancel an in-progress request + int op_cancel(tid_t tid); + // commands int osd_command(int osd, vector& cmd, bufferlist& inbl, tid_t *ptid, bufferlist *poutbl, string *prs, Context *onfinish) {