From: Sage Weil Date: Tue, 28 Feb 2017 02:56:03 +0000 (-0600) Subject: osd: min_epoch for MOSDRepOp[Reply] X-Git-Tag: v12.0.3~80^2~3 X-Git-Url: http://git-server-git.apps.pok.os.sepia.ceph.com/?a=commitdiff_plain;h=c33ee4e357af172f7f357d3bc78836127e55361f;p=ceph.git osd: min_epoch for MOSDRepOp[Reply] Signed-off-by: Sage Weil --- diff --git a/src/messages/MOSDRepOp.h b/src/messages/MOSDRepOp.h index e4a4ef8d0090..e2525158e4d9 100644 --- a/src/messages/MOSDRepOp.h +++ b/src/messages/MOSDRepOp.h @@ -24,11 +24,11 @@ class MOSDRepOp : public MOSDFastDispatchOp { - static const int HEAD_VERSION = 1; + static const int HEAD_VERSION = 2; static const int COMPAT_VERSION = 1; public: - epoch_t map_epoch; + epoch_t map_epoch, min_epoch; // metadata from original request osd_reqid_t reqid; @@ -66,6 +66,9 @@ public: epoch_t get_map_epoch() const override { return map_epoch; } + epoch_t get_min_epoch() const override { + return min_epoch; + } spg_t get_spg() const override { return pgid; } @@ -78,6 +81,10 @@ public: p = payload.begin(); // splitted to partial and final ::decode(map_epoch, p); + if (header.version >= 2) + ::decode(min_epoch, p); + else + min_epoch = map_epoch; ::decode(reqid, p); ::decode(pgid, p); } @@ -105,6 +112,10 @@ public: void encode_payload(uint64_t features) override { ::encode(map_epoch, payload); + if (HAVE_FEATURE(features, SERVER_LUMINOUS)) + ::encode(min_epoch, payload); + else + header.version = 1; ::encode(reqid, payload); ::encode(pgid, payload); ::encode(poid, payload); @@ -127,9 +138,10 @@ public: final_decode_needed(true), acks_wanted (0) {} MOSDRepOp(osd_reqid_t r, pg_shard_t from, spg_t p, const hobject_t& po, int aw, - epoch_t mape, ceph_tid_t rtid, eversion_t v) + epoch_t mape, epoch_t min_epoch, ceph_tid_t rtid, eversion_t v) : MOSDFastDispatchOp(MSG_OSD_REPOP, HEAD_VERSION, COMPAT_VERSION), map_epoch(mape), + min_epoch(min_epoch), reqid(r), pgid(p), final_decode_needed(false), @@ -146,9 +158,9 @@ public: const char *get_type_name() const override { return "osd_repop"; } void print(ostream& out) const override { out << "osd_repop(" << reqid - << " " << pgid; + << " " << pgid << " e" << map_epoch << "/" << min_epoch; if (!final_decode_needed) { - out << " " << poid << " v " << version; + out << " " << poid << " v " << version; if (updated_hit_set_history) out << ", has_updated_hit_set_history"; } diff --git a/src/messages/MOSDRepOpReply.h b/src/messages/MOSDRepOpReply.h index 04a5707dfbe9..890dade3d208 100644 --- a/src/messages/MOSDRepOpReply.h +++ b/src/messages/MOSDRepOpReply.h @@ -29,10 +29,10 @@ */ class MOSDRepOpReply : public MOSDFastDispatchOp { - static const int HEAD_VERSION = 1; + static const int HEAD_VERSION = 2; static const int COMPAT_VERSION = 1; public: - epoch_t map_epoch; + epoch_t map_epoch, min_epoch; // subop metadata osd_reqid_t reqid; @@ -53,6 +53,9 @@ public: epoch_t get_map_epoch() const override { return map_epoch; } + epoch_t get_min_epoch() const override { + return min_epoch; + } spg_t get_spg() const override { return pgid; } @@ -60,6 +63,10 @@ public: void decode_payload() override { p = payload.begin(); ::decode(map_epoch, p); + if (header.version >= 2) + ::decode(min_epoch, p); + else + min_epoch = map_epoch; ::decode(reqid, p); ::decode(pgid, p); } @@ -76,6 +83,10 @@ public: } void encode_payload(uint64_t features) override { ::encode(map_epoch, payload); + if (HAVE_FEATURE(features, SERVER_LUMINOUS)) + ::encode(min_epoch, payload); + else + header.version = 1; ::encode(reqid, payload); ::encode(pgid, payload); ::encode(ack_type, payload); @@ -84,8 +95,6 @@ public: ::encode(from, payload); } - epoch_t get_map_epoch() { return map_epoch; } - spg_t get_pg() { return pgid; } int get_ack_type() { return ack_type; } @@ -99,9 +108,11 @@ public: public: MOSDRepOpReply( - const MOSDRepOp *req, pg_shard_t from, int result_, epoch_t e, int at) : + const MOSDRepOp *req, pg_shard_t from, int result_, epoch_t e, epoch_t mine, + int at) : MOSDFastDispatchOp(MSG_OSD_REPOPREPLY, HEAD_VERSION, COMPAT_VERSION), map_epoch(e), + min_epoch(mine), reqid(req->reqid), from(from), pgid(req->pgid.pgid, req->from.shard), @@ -113,6 +124,7 @@ public: MOSDRepOpReply() : MOSDFastDispatchOp(MSG_OSD_REPOPREPLY, HEAD_VERSION, COMPAT_VERSION), map_epoch(0), + min_epoch(0), ack_type(0), result(0), final_decode_needed(true) {} private: @@ -123,7 +135,7 @@ public: void print(ostream& out) const override { out << "osd_repop_reply(" << reqid - << " " << pgid; + << " " << pgid << " e" << map_epoch << "/" << min_epoch; if (!final_decode_needed) { if (ack_type & CEPH_OSD_FLAG_ONDISK) out << " ondisk"; diff --git a/src/osd/ReplicatedBackend.cc b/src/osd/ReplicatedBackend.cc index 9be7a255c00b..b0b6053786a6 100644 --- a/src/osd/ReplicatedBackend.cc +++ b/src/osd/ReplicatedBackend.cc @@ -974,6 +974,7 @@ Message * ReplicatedBackend::generate_subop( spg_t(get_info().pgid.pgid, peer.shard), soid, acks_wanted, get_osdmap()->get_epoch(), + parent->get_last_peering_reset_epoch(), tid, at_version); // ship resulting transaction, log entries, and pg_stats @@ -1163,7 +1164,7 @@ void ReplicatedBackend::repop_applied(RepModifyRef rm) if (!rm->committed) ack = new MOSDRepOpReply( static_cast(m), parent->whoami_shard(), - 0, get_osdmap()->get_epoch(), CEPH_OSD_FLAG_ACK); + 0, get_osdmap()->get_epoch(), req->min_epoch, CEPH_OSD_FLAG_ACK); // send ack to acker only if we haven't sent a commit already if (ack) { @@ -1181,19 +1182,19 @@ void ReplicatedBackend::repop_commit(RepModifyRef rm) rm->committed = true; // send commit. - const Message *m = rm->op->get_req(); + const MOSDRepOp *m = static_cast(rm->op->get_req()); + assert(m->get_type() == MSG_OSD_REPOP); dout(10) << __func__ << " on op " << *m << ", sending commit to osd." << rm->ackerosd << dendl; - assert(m->get_type() == MSG_OSD_REPOP); assert(get_osdmap()->is_up(rm->ackerosd)); get_parent()->update_last_complete_ondisk(rm->last_complete); MOSDRepOpReply *reply = new MOSDRepOpReply( - static_cast(m), + m, get_parent()->whoami_shard(), - 0, get_osdmap()->get_epoch(), CEPH_OSD_FLAG_ONDISK); + 0, get_osdmap()->get_epoch(), m->get_min_epoch(), CEPH_OSD_FLAG_ONDISK); reply->set_last_complete_ondisk(rm->last_complete); reply->set_priority(CEPH_MSG_PRIO_HIGH); // this better match ack priority! get_parent()->send_message_osd_cluster(