From: Sage Weil Date: Mon, 13 Feb 2017 03:47:31 +0000 (-0500) Subject: messages/MOSDBackoff: add spg_t to message X-Git-Tag: v12.0.1~383^2~5 X-Git-Url: http://git-server-git.apps.pok.os.sepia.ceph.com/?a=commitdiff_plain;h=f06580e2abac4ae6beab03625f1784908b2b26ce;p=ceph.git messages/MOSDBackoff: add spg_t to message and make it an MOSDFastDispatchOp. Signed-off-by: Sage Weil --- diff --git a/src/messages/MOSDBackoff.h b/src/messages/MOSDBackoff.h index e501269b7ef..181aaf181b9 100644 --- a/src/messages/MOSDBackoff.h +++ b/src/messages/MOSDBackoff.h @@ -16,50 +16,65 @@ #ifndef CEPH_MOSDBACKOFF_H #define CEPH_MOSDBACKOFF_H -#include "msg/Message.h" +#include "MOSDFastDispatchOp.h" #include "osd/osd_types.h" -class MOSDBackoff : public Message { +class MOSDBackoff : public MOSDFastDispatchOp { public: + const int HEAD_VERSION = 1; + const int COMPAT_VERSION = 1; + + spg_t pgid; + epoch_t map_epoch = 0; uint8_t op = 0; ///< CEPH_OSD_BACKOFF_OP_* uint64_t id = 0; ///< unique id within this session hobject_t begin, end; ///< [) range to block, unless ==, block single obj - epoch_t osd_epoch = 0; - MOSDBackoff() : Message(CEPH_MSG_OSD_BACKOFF) {} - MOSDBackoff(uint8_t op_, uint64_t id_, - hobject_t begin_, hobject_t end_, epoch_t ep) - : Message(CEPH_MSG_OSD_BACKOFF), + spg_t get_spg() const override { + return pgid; + } + epoch_t get_map_epoch() const override { + return map_epoch; + } + + MOSDBackoff() + : MOSDFastDispatchOp(CEPH_MSG_OSD_BACKOFF, HEAD_VERSION, COMPAT_VERSION) {} + MOSDBackoff(spg_t pgid_, epoch_t ep, uint8_t op_, uint64_t id_, + hobject_t begin_, hobject_t end_) + : MOSDFastDispatchOp(CEPH_MSG_OSD_BACKOFF, HEAD_VERSION, COMPAT_VERSION), + pgid(pgid_), + map_epoch(ep), op(op_), id(id_), begin(begin_), - end(end_), - osd_epoch(ep) { } + end(end_) { } void encode_payload(uint64_t features) override { + ::encode(pgid, payload); + ::encode(map_epoch, payload); ::encode(op, payload); ::encode(id, payload); ::encode(begin, payload); ::encode(end, payload); - ::encode(osd_epoch, payload); } void decode_payload() override { auto p = payload.begin(); + ::decode(pgid, p); + ::decode(map_epoch, p); ::decode(op, p); ::decode(id, p); ::decode(begin, p); ::decode(end, p); - ::decode(osd_epoch, p); } const char *get_type_name() const override { return "osd_backoff"; } void print(ostream& out) const override { - out << "osd_backoff(" << ceph_osd_backoff_op_name(op) + out << "osd_backoff(" << pgid << " " << ceph_osd_backoff_op_name(op) << " id " << id << " [" << begin << "," << end << ")" - << " epoch " << osd_epoch << ")"; + << " e" << map_epoch << ")"; } }; diff --git a/src/osd/OSD.cc b/src/osd/OSD.cc index 92db3419e8c..fad41ca2868 100644 --- a/src/osd/OSD.cc +++ b/src/osd/OSD.cc @@ -6308,7 +6308,7 @@ epoch_t op_required_epoch(OpRequestRef op) } case CEPH_MSG_OSD_BACKOFF: { MOSDBackoff *m = static_cast(op->get_req()); - return m->osd_epoch; + return m->map_epoch; } case MSG_OSD_SUBOP: return replica_op_required_epoch(op); diff --git a/src/osd/PG.cc b/src/osd/PG.cc index 1f5e5a74a3a..8cab55fb7b4 100644 --- a/src/osd/PG.cc +++ b/src/osd/PG.cc @@ -2325,11 +2325,12 @@ void PG::add_backoff(SessionRef s, const hobject_t& begin, const hobject_t& end) } con->send_message( new MOSDBackoff( + info.pgid, + get_osdmap()->get_epoch(), CEPH_OSD_BACKOFF_OP_BLOCK, b->id, begin, - end, - get_osdmap()->get_epoch())); + end)); } void PG::release_backoffs(const hobject_t& begin, const hobject_t& end) @@ -2376,11 +2377,12 @@ void PG::release_backoffs(const hobject_t& begin, const hobject_t& end) if (con) { // OSD::ms_handle_reset clears s->con without a lock con->send_message( new MOSDBackoff( + info.pgid, + get_osdmap()->get_epoch(), CEPH_OSD_BACKOFF_OP_UNBLOCK, b->id, b->begin, - b->end, - get_osdmap()->get_epoch())); + b->end)); } if (b->is_new()) { b->state = Backoff::STATE_DELETING; diff --git a/src/osdc/Objecter.cc b/src/osdc/Objecter.cc index 10b4c151293..a23c783467f 100644 --- a/src/osdc/Objecter.cc +++ b/src/osdc/Objecter.cc @@ -3429,10 +3429,12 @@ void Objecter::handle_osd_backoff(MOSDBackoff *m) b.begin = m->begin; b.end = m->end; - // ack - Message *r = new MOSDBackoff(CEPH_OSD_BACKOFF_OP_ACK_BLOCK, - m->id, m->begin, m->end, - osdmap->get_epoch()); + // ack with original backoff's epoch so that the osd can discard this if + // there was a pg split. + Message *r = new MOSDBackoff(m->pgid, + m->map_epoch, + CEPH_OSD_BACKOFF_OP_ACK_BLOCK, + m->id, m->begin, m->end); // this priority must match the MOSDOps from _prepare_osd_op r->set_priority(cct->_conf->osd_client_op_priority); con->send_message(r);