From 8b46dd1dc009981f2fcae7b0e05155e81841c4a5 Mon Sep 17 00:00:00 2001 From: Samuel Just Date: Thu, 16 Jan 2014 15:27:36 -0800 Subject: [PATCH] messages/: include shard information in various pg messages We can no longer use the messenger source information to determine the origin of the message since an osd might have more than one shard of a particular pg. Thus, we need to include a pg_shard_t from field to indicate origin. Similarly, pg_t is no longer sufficient to specify the destination pg, we instead use spg_t. In the event that we get a message from an old peer, we default from to pg_shard_t(get_source().num(), ghobject_t::no_shard()) and spg_t to spg_t(pgid, ghobject_t::no_shard()). This suffices because non-NO_SHARD shards can only appear once ec pools have been enabled -- and doing that bans unenlightened osds. Signed-off-by: Samuel Just --- src/common/hobject.h | 1 + src/include/encoding.h | 6 +++++ src/messages/MBackfillReserve.h | 16 +++++++++---- src/messages/MOSDPGBackfill.h | 16 +++++++++---- src/messages/MOSDPGInfo.h | 20 +++++++++++++++- src/messages/MOSDPGLog.h | 28 +++++++++++++++++----- src/messages/MOSDPGNotify.h | 20 +++++++++++++++- src/messages/MOSDPGPull.h | 18 ++++++++++---- src/messages/MOSDPGPush.h | 18 ++++++++++---- src/messages/MOSDPGPushReply.h | 19 +++++++++++---- src/messages/MOSDPGQuery.h | 39 ++++++++++++++++++++++++------ src/messages/MOSDPGRemove.h | 42 +++++++++++++++++++++++++++------ src/messages/MOSDPGScan.h | 31 +++++++++++++++++++----- src/messages/MOSDPGTrim.h | 19 +++++++++++---- src/messages/MOSDRepScrub.h | 19 ++++++++++----- src/messages/MOSDSubOp.h | 25 ++++++++++++++++---- src/messages/MOSDSubOpReply.h | 31 ++++++++++++++++++------ src/messages/MRecoveryReserve.h | 15 ++++++++---- 18 files changed, 305 insertions(+), 78 deletions(-) diff --git a/src/common/hobject.h b/src/common/hobject.h index 8d97411584769..f31604b43bc34 100644 --- a/src/common/hobject.h +++ b/src/common/hobject.h @@ -247,6 +247,7 @@ struct ghobject_t { public: static const shard_t NO_SHARD = UINT8_MAX; + static shard_t no_shard() { return NO_SHARD; } static const gen_t NO_GEN = UINT64_MAX; ghobject_t() : generation(NO_GEN), shard_id(NO_SHARD) {} diff --git a/src/include/encoding.h b/src/include/encoding.h index ddb94ecb45d1d..d0974823c1fbc 100644 --- a/src/include/encoding.h +++ b/src/include/encoding.h @@ -320,6 +320,12 @@ inline void decode(boost::optional &p, bufferlist::iterator &bp) // pair template +inline void encode(const std::pair &p, bufferlist &bl, uint64_t features) +{ + encode(p.first, bl, features); + encode(p.second, bl, features); +} +template inline void encode(const std::pair &p, bufferlist &bl) { encode(p.first, bl); diff --git a/src/messages/MBackfillReserve.h b/src/messages/MBackfillReserve.h index ce35ce76efe94..d30e285cc5dcb 100644 --- a/src/messages/MBackfillReserve.h +++ b/src/messages/MBackfillReserve.h @@ -18,10 +18,10 @@ #include "msg/Message.h" class MBackfillReserve : public Message { - static const int HEAD_VERSION = 2; + static const int HEAD_VERSION = 3; static const int COMPAT_VERSION = 1; public: - pg_t pgid; + spg_t pgid; epoch_t query_epoch; enum { REQUEST = 0, @@ -35,7 +35,7 @@ public: : Message(MSG_OSD_BACKFILL_RESERVE, HEAD_VERSION, COMPAT_VERSION), query_epoch(0), type(-1), priority(-1) {} MBackfillReserve(int type, - pg_t pgid, + spg_t pgid, epoch_t query_epoch, unsigned prio = -1) : Message(MSG_OSD_BACKFILL_RESERVE, HEAD_VERSION, COMPAT_VERSION), pgid(pgid), query_epoch(query_epoch), @@ -65,20 +65,26 @@ public: void decode_payload() { bufferlist::iterator p = payload.begin(); - ::decode(pgid, p); + ::decode(pgid.pgid, p); ::decode(query_epoch, p); ::decode(type, p); if (header.version > 1) ::decode(priority, p); else priority = 0; + if (header.version >= 3) + ::decode(pgid.shard, p); + else + pgid.shard = ghobject_t::no_shard(); + } void encode_payload(uint64_t features) { - ::encode(pgid, payload); + ::encode(pgid.pgid, payload); ::encode(query_epoch, payload); ::encode(type, payload); ::encode(priority, payload); + ::encode(pgid.shard, payload); } }; diff --git a/src/messages/MOSDPGBackfill.h b/src/messages/MOSDPGBackfill.h index 5700f9675268f..e9ec661cbb5d8 100644 --- a/src/messages/MOSDPGBackfill.h +++ b/src/messages/MOSDPGBackfill.h @@ -19,7 +19,7 @@ #include "osd/osd_types.h" class MOSDPGBackfill : public Message { - static const int HEAD_VERSION = 2; + static const int HEAD_VERSION = 3; static const int COMPAT_VERSION = 1; public: enum { @@ -38,7 +38,7 @@ public: __u32 op; epoch_t map_epoch, query_epoch; - pg_t pgid; + spg_t pgid; hobject_t last_backfill; bool compat_stat_sum; pg_stat_t stats; @@ -48,7 +48,7 @@ public: ::decode(op, p); ::decode(map_epoch, p); ::decode(query_epoch, p); - ::decode(pgid, p); + ::decode(pgid.pgid, p); ::decode(last_backfill, p); // For compatibility with version 1 @@ -64,25 +64,31 @@ public: if (!last_backfill.is_max() && last_backfill.pool == -1) last_backfill.pool = pgid.pool(); + if (header.version >= 3) + ::decode(pgid.shard, p); + else + pgid.shard = ghobject_t::no_shard(); } virtual void encode_payload(uint64_t features) { ::encode(op, payload); ::encode(map_epoch, payload); ::encode(query_epoch, payload); - ::encode(pgid, payload); + ::encode(pgid.pgid, payload); ::encode(last_backfill, payload); // For compatibility with version 1 ::encode(stats.stats, payload); ::encode(stats, payload); + + ::encode(pgid.shard, payload); } MOSDPGBackfill() : Message(MSG_OSD_PG_BACKFILL, HEAD_VERSION, COMPAT_VERSION), compat_stat_sum(false) {} - MOSDPGBackfill(__u32 o, epoch_t e, epoch_t qe, pg_t p) + MOSDPGBackfill(__u32 o, epoch_t e, epoch_t qe, spg_t p) : Message(MSG_OSD_PG_BACKFILL, HEAD_VERSION, COMPAT_VERSION), op(o), map_epoch(e), query_epoch(e), diff --git a/src/messages/MOSDPGInfo.h b/src/messages/MOSDPGInfo.h index 448b43bff32c2..83e74fb8c36bd 100644 --- a/src/messages/MOSDPGInfo.h +++ b/src/messages/MOSDPGInfo.h @@ -20,7 +20,7 @@ #include "osd/osd_types.h" class MOSDPGInfo : public Message { - static const int HEAD_VERSION = 3; + static const int HEAD_VERSION = 4; static const int COMPAT_VERSION = 1; epoch_t epoch; @@ -79,6 +79,14 @@ public: p++) ::encode(pair( p->first.epoch_sent, p->first.query_epoch), payload); + + // v4 needs from, to + for (vector >::iterator p = pg_list.begin(); + p != pg_list.end(); + ++p) { + ::encode(p->first.from, payload); + ::encode(p->first.to, payload); + } } void decode_payload() { bufferlist::iterator p = payload.begin(); @@ -113,6 +121,16 @@ public: i->first.query_epoch = epoch; } } + + // v4 needs from and to + if (header.version >= 4) { + for (vector >::iterator i = pg_list.begin(); + i != pg_list.end(); + i++) { + ::decode(i->first.from, p); + ::decode(i->first.to, p); + } + } } }; diff --git a/src/messages/MOSDPGLog.h b/src/messages/MOSDPGLog.h index 906a8595100cd..44cd98962b870 100644 --- a/src/messages/MOSDPGLog.h +++ b/src/messages/MOSDPGLog.h @@ -20,7 +20,7 @@ class MOSDPGLog : public Message { - static const int HEAD_VERSION = 3; + static const int HEAD_VERSION = 4; static const int COMPAT_VERSION = 2; epoch_t epoch; @@ -31,22 +31,29 @@ class MOSDPGLog : public Message { epoch_t query_epoch; public: + shard_id_t to; + shard_id_t from; pg_info_t info; pg_log_t log; pg_missing_t missing; pg_interval_map_t past_intervals; epoch_t get_epoch() { return epoch; } - pg_t get_pgid() { return info.pgid; } + spg_t get_pgid() { return spg_t(info.pgid.pgid, to); } epoch_t get_query_epoch() { return query_epoch; } MOSDPGLog() : Message(MSG_OSD_PG_LOG, HEAD_VERSION, COMPAT_VERSION) { } - MOSDPGLog(version_t mv, pg_info_t& i) + MOSDPGLog(shard_id_t to, shard_id_t from, version_t mv, pg_info_t& i) : Message(MSG_OSD_PG_LOG, HEAD_VERSION, COMPAT_VERSION), - epoch(mv), query_epoch(mv), info(i) { } - MOSDPGLog(version_t mv, pg_info_t& i, epoch_t query_epoch) + epoch(mv), query_epoch(mv), + to(to), from(from), + info(i) { } + MOSDPGLog(shard_id_t to, shard_id_t from, + version_t mv, pg_info_t& i, epoch_t query_epoch) : Message(MSG_OSD_PG_LOG, HEAD_VERSION, COMPAT_VERSION), - epoch(mv), query_epoch(query_epoch), info(i) { } + epoch(mv), query_epoch(query_epoch), + to(to), from(from), + info(i) { } private: ~MOSDPGLog() {} @@ -66,6 +73,8 @@ public: ::encode(missing, payload); ::encode(query_epoch, payload); ::encode(past_intervals, payload); + ::encode(to, payload); + ::encode(from, payload); } void decode_payload() { bufferlist::iterator p = payload.begin(); @@ -79,6 +88,13 @@ public: if (header.version >= 3) { ::decode(past_intervals, p); } + if (header.version >= 4) { + ::decode(to, p); + ::decode(from, p); + } else { + to = ghobject_t::NO_SHARD; + from = ghobject_t::NO_SHARD; + } } }; diff --git a/src/messages/MOSDPGNotify.h b/src/messages/MOSDPGNotify.h index 3d2b269f8354a..6b9bdb33a8256 100644 --- a/src/messages/MOSDPGNotify.h +++ b/src/messages/MOSDPGNotify.h @@ -25,7 +25,7 @@ class MOSDPGNotify : public Message { - static const int HEAD_VERSION = 4; + static const int HEAD_VERSION = 5; static const int COMPAT_VERSION = 2; epoch_t epoch; @@ -83,6 +83,14 @@ public: ::encode(pair( p->first.epoch_sent, p->first.query_epoch), payload); + + // v5 needs from, to + for (vector >::iterator p = pg_list.begin(); + p != pg_list.end(); + ++p) { + ::encode(p->first.from, payload); + ::encode(p->first.to, payload); + } } void decode_payload() { epoch_t query_epoch; @@ -120,6 +128,16 @@ public: i->first.query_epoch = query_epoch; } } + + // v5 needs from and to + if (header.version >= 5) { + for (vector >::iterator i = pg_list.begin(); + i != pg_list.end(); + i++) { + ::decode(i->first.from, p); + ::decode(i->first.to, p); + } + } } void print(ostream& out) const { out << "pg_notify("; diff --git a/src/messages/MOSDPGPull.h b/src/messages/MOSDPGPull.h index 870db7f1a19c3..91072320fe677 100644 --- a/src/messages/MOSDPGPull.h +++ b/src/messages/MOSDPGPull.h @@ -19,12 +19,13 @@ #include "osd/osd_types.h" class MOSDPGPull : public Message { - static const int HEAD_VERSION = 1; + static const int HEAD_VERSION = 2; static const int COMPAT_VERSION = 1; public: - pg_t pgid; + pg_shard_t from; + spg_t pgid; epoch_t map_epoch; vector pulls; uint64_t cost; @@ -49,17 +50,26 @@ public: virtual void decode_payload() { bufferlist::iterator p = payload.begin(); - ::decode(pgid, p); + ::decode(pgid.pgid, p); ::decode(map_epoch, p); ::decode(pulls, p); ::decode(cost, p); + if (header.version >= 2) { + ::decode(pgid.shard, p); + ::decode(from, p); + } else { + pgid.shard = ghobject_t::NO_SHARD; + from = pg_shard_t(get_source().num(), ghobject_t::NO_SHARD); + } } virtual void encode_payload(uint64_t features) { - ::encode(pgid, payload); + ::encode(pgid.pgid, payload); ::encode(map_epoch, payload); ::encode(pulls, payload); ::encode(cost, payload); + ::encode(pgid.shard, payload); + ::encode(from, payload); } const char *get_type_name() const { return "MOSDPGPull"; } diff --git a/src/messages/MOSDPGPush.h b/src/messages/MOSDPGPush.h index acc0d2aee8e07..46a8f1becd44a 100644 --- a/src/messages/MOSDPGPush.h +++ b/src/messages/MOSDPGPush.h @@ -19,12 +19,13 @@ #include "osd/osd_types.h" class MOSDPGPush : public Message { - static const int HEAD_VERSION = 1; + static const int HEAD_VERSION = 2; static const int COMPAT_VERSION = 1; public: - pg_t pgid; + pg_shard_t from; + spg_t pgid; epoch_t map_epoch; vector pushes; uint64_t cost; @@ -49,17 +50,26 @@ public: virtual void decode_payload() { bufferlist::iterator p = payload.begin(); - ::decode(pgid, p); + ::decode(pgid.pgid, p); ::decode(map_epoch, p); ::decode(pushes, p); ::decode(cost, p); + if (header.version >= 2) { + ::decode(pgid.shard, p); + ::decode(from, p); + } else { + pgid.shard = ghobject_t::NO_SHARD; + from = pg_shard_t(get_source().num(), ghobject_t::NO_SHARD); + } } virtual void encode_payload(uint64_t features) { - ::encode(pgid, payload); + ::encode(pgid.pgid, payload); ::encode(map_epoch, payload); ::encode(pushes, payload); ::encode(cost, payload); + ::encode(pgid.shard, payload); + ::encode(from, payload); } const char *get_type_name() const { return "MOSDPGPush"; } diff --git a/src/messages/MOSDPGPushReply.h b/src/messages/MOSDPGPushReply.h index 192dc2c1f81c3..1875235dbb7d4 100644 --- a/src/messages/MOSDPGPushReply.h +++ b/src/messages/MOSDPGPushReply.h @@ -19,11 +19,12 @@ #include "osd/osd_types.h" class MOSDPGPushReply : public Message { - static const int HEAD_VERSION = 1; + static const int HEAD_VERSION = 2; static const int COMPAT_VERSION = 1; public: - pg_t pgid; + pg_shard_t from; + spg_t pgid; epoch_t map_epoch; vector replies; uint64_t cost; @@ -48,17 +49,27 @@ public: virtual void decode_payload() { bufferlist::iterator p = payload.begin(); - ::decode(pgid, p); + ::decode(pgid.pgid, p); ::decode(map_epoch, p); ::decode(replies, p); ::decode(cost, p); + + if (header.version >= 2) { + ::decode(pgid.shard, p); + ::decode(from, p); + } else { + pgid.shard = ghobject_t::NO_SHARD; + from = pg_shard_t(get_source().num(), ghobject_t::NO_SHARD); + } } virtual void encode_payload(uint64_t features) { - ::encode(pgid, payload); + ::encode(pgid.pgid, payload); ::encode(map_epoch, payload); ::encode(replies, payload); ::encode(cost, payload); + ::encode(pgid.shard, payload); + ::encode(from, payload); } void print(ostream& out) const { diff --git a/src/messages/MOSDPGQuery.h b/src/messages/MOSDPGQuery.h index b637412a38768..c2c6f695d39ab 100644 --- a/src/messages/MOSDPGQuery.h +++ b/src/messages/MOSDPGQuery.h @@ -16,6 +16,7 @@ #ifndef CEPH_MOSDPGQUERY_H #define CEPH_MOSDPGQUERY_H +#include "common/hobject.h" #include "msg/Message.h" /* @@ -23,18 +24,18 @@ */ class MOSDPGQuery : public Message { - static const int HEAD_VERSION = 2; + static const int HEAD_VERSION = 3; static const int COMPAT_VERSION = 1; version_t epoch; public: version_t get_epoch() { return epoch; } - map pg_list; + map pg_list; MOSDPGQuery() : Message(MSG_OSD_PG_QUERY, HEAD_VERSION, COMPAT_VERSION) {} - MOSDPGQuery(epoch_t e, map& ls) : + MOSDPGQuery(epoch_t e, map& ls) : Message(MSG_OSD_PG_QUERY, HEAD_VERSION, COMPAT_VERSION), @@ -48,7 +49,8 @@ public: const char *get_type_name() const { return "pg_query"; } void print(ostream& out) const { out << "pg_query("; - for (map::const_iterator p = pg_list.begin(); p != pg_list.end(); ++p) { + for (map::const_iterator p = pg_list.begin(); + p != pg_list.end(); ++p) { if (p != pg_list.begin()) out << ","; out << p->first; @@ -58,15 +60,38 @@ public: void encode_payload(uint64_t features) { ::encode(epoch, payload); - ::encode(pg_list, payload, features); + vector > _pg_list; + _pg_list.reserve(pg_list.size()); + vector _shard_list; + _shard_list.reserve(pg_list.size()); + for (map::iterator i = pg_list.begin(); + i != pg_list.end(); + ++i) { + _pg_list.push_back(make_pair(i->first.pgid, i->second)); + _shard_list.push_back(i->first.shard); + } + ::encode(_pg_list, payload, features); + ::encode(_shard_list, payload); } void decode_payload() { bufferlist::iterator p = payload.begin(); ::decode(epoch, p); - ::decode(pg_list, p); + vector > _pg_list; + ::decode(_pg_list, p); + vector _shard_list(_pg_list.size(), ghobject_t::no_shard()); + if (header.version >= 3) { + _shard_list.clear(); + ::decode(_shard_list, p); + } + assert(_pg_list.size() == _shard_list.size()); + for (unsigned i = 0; i < _pg_list.size(); ++i) { + pg_list.insert( + make_pair( + spg_t(_pg_list[i].first, _shard_list[i]), _pg_list[i].second)); + } if (header.version < 2) { - for (map::iterator i = pg_list.begin(); + for (map::iterator i = pg_list.begin(); i != pg_list.end(); ++i) { i->second.epoch_sent = epoch; diff --git a/src/messages/MOSDPGRemove.h b/src/messages/MOSDPGRemove.h index c6ec797466e4e..b55b5d28182de 100644 --- a/src/messages/MOSDPGRemove.h +++ b/src/messages/MOSDPGRemove.h @@ -16,20 +16,26 @@ #ifndef CEPH_MOSDPGREMOVE_H #define CEPH_MOSDPGREMOVE_H +#include "common/hobject.h" #include "msg/Message.h" class MOSDPGRemove : public Message { + + static const int HEAD_VERSION = 2; + static const int COMPAT_VERSION = 1; + epoch_t epoch; public: - vector pg_list; + vector pg_list; epoch_t get_epoch() { return epoch; } - MOSDPGRemove() : Message(MSG_OSD_PG_REMOVE) {} - MOSDPGRemove(epoch_t e, vector& l) : - Message(MSG_OSD_PG_REMOVE) { + MOSDPGRemove() : + Message(MSG_OSD_PG_REMOVE, HEAD_VERSION, COMPAT_VERSION) {} + MOSDPGRemove(epoch_t e, vector& l) : + Message(MSG_OSD_PG_REMOVE, HEAD_VERSION, COMPAT_VERSION) { this->epoch = e; pg_list.swap(l); } @@ -41,16 +47,38 @@ public: void encode_payload(uint64_t features) { ::encode(epoch, payload); - ::encode(pg_list, payload); + + vector _pg_list; + _pg_list.reserve(pg_list.size()); + vector _shard_list; + _shard_list.reserve(pg_list.size()); + for (vector::iterator i = pg_list.begin(); i != pg_list.end(); ++i) { + _pg_list.push_back(i->pgid); + _shard_list.push_back(i->shard); + } + ::encode(_pg_list, payload); + ::encode(_shard_list, payload); } void decode_payload() { bufferlist::iterator p = payload.begin(); ::decode(epoch, p); - ::decode(pg_list, p); + vector _pg_list; + ::decode(_pg_list, p); + + vector _shard_list(_pg_list.size(), ghobject_t::no_shard()); + if (header.version >= 2) { + _shard_list.clear(); + ::decode(_shard_list, p); + } + assert(_shard_list.size() == _pg_list.size()); + pg_list.reserve(_shard_list.size()); + for (unsigned i = 0; i < _shard_list.size(); ++i) { + pg_list.push_back(spg_t(_pg_list[i], _shard_list[i])); + } } void print(ostream& out) const { out << "osd pg remove(" << "epoch " << epoch << "; "; - for (vector::const_iterator i = pg_list.begin(); + for (vector::const_iterator i = pg_list.begin(); i != pg_list.end(); ++i) { out << "pg" << *i << "; "; diff --git a/src/messages/MOSDPGScan.h b/src/messages/MOSDPGScan.h index 4c86a3c7e7aa7..2c0c1ad7abc8a 100644 --- a/src/messages/MOSDPGScan.h +++ b/src/messages/MOSDPGScan.h @@ -19,6 +19,10 @@ #include "osd/osd_types.h" class MOSDPGScan : public Message { + + static const int HEAD_VERSION = 2; + static const int COMPAT_VERSION = 1; + public: enum { OP_SCAN_GET_DIGEST = 1, // just objects and versions @@ -34,7 +38,8 @@ public: __u32 op; epoch_t map_epoch, query_epoch; - pg_t pgid; + pg_shard_t from; + spg_t pgid; hobject_t begin, end; virtual void decode_payload() { @@ -42,7 +47,7 @@ public: ::decode(op, p); ::decode(map_epoch, p); ::decode(query_epoch, p); - ::decode(pgid, p); + ::decode(pgid.pgid, p); ::decode(begin, p); ::decode(end, p); @@ -51,22 +56,36 @@ public: begin.pool = pgid.pool(); if (!end.is_max() && end.pool == -1) end.pool = pgid.pool(); + + if (header.version >= 2) { + ::decode(from, p); + ::decode(pgid.shard, p); + } else { + from = pg_shard_t( + get_source().num(), + ghobject_t::NO_SHARD); + pgid.shard = ghobject_t::NO_SHARD; + } } virtual void encode_payload(uint64_t features) { ::encode(op, payload); ::encode(map_epoch, payload); ::encode(query_epoch, payload); - ::encode(pgid, payload); + ::encode(pgid.pgid, payload); ::encode(begin, payload); ::encode(end, payload); + ::encode(from, payload); + ::encode(pgid.shard, payload); } - MOSDPGScan() : Message(MSG_OSD_PG_SCAN) {} - MOSDPGScan(__u32 o, epoch_t e, epoch_t qe, pg_t p, hobject_t be, hobject_t en) - : Message(MSG_OSD_PG_SCAN), + MOSDPGScan() : Message(MSG_OSD_PG_SCAN, HEAD_VERSION, COMPAT_VERSION) {} + MOSDPGScan(__u32 o, pg_shard_t from, + epoch_t e, epoch_t qe, spg_t p, hobject_t be, hobject_t en) + : Message(MSG_OSD_PG_SCAN, HEAD_VERSION, COMPAT_VERSION), op(o), map_epoch(e), query_epoch(e), + from(from), pgid(p), begin(be), end(en) { } diff --git a/src/messages/MOSDPGTrim.h b/src/messages/MOSDPGTrim.h index ad52a7f5fe78a..12a0e7c824037 100644 --- a/src/messages/MOSDPGTrim.h +++ b/src/messages/MOSDPGTrim.h @@ -18,15 +18,19 @@ #include "msg/Message.h" class MOSDPGTrim : public Message { + + static const int HEAD_VERSION = 2; + static const int COMPAT_VERSION = 1; + public: epoch_t epoch; - pg_t pgid; + spg_t pgid; eversion_t trim_to; epoch_t get_epoch() { return epoch; } - MOSDPGTrim() : Message(MSG_OSD_PG_TRIM) {} - MOSDPGTrim(version_t mv, pg_t p, eversion_t tt) : + MOSDPGTrim() : Message(MSG_OSD_PG_TRIM, HEAD_VERSION, COMPAT_VERSION) {} + MOSDPGTrim(version_t mv, spg_t p, eversion_t tt) : Message(MSG_OSD_PG_TRIM), epoch(mv), pgid(p), trim_to(tt) { } private: @@ -40,14 +44,19 @@ public: void encode_payload(uint64_t features) { ::encode(epoch, payload); - ::encode(pgid, payload); + ::encode(pgid.pgid, payload); ::encode(trim_to, payload); + ::encode(pgid.shard, payload); } void decode_payload() { bufferlist::iterator p = payload.begin(); ::decode(epoch, p); - ::decode(pgid, p); + ::decode(pgid.pgid, p); ::decode(trim_to, p); + if (header.version >= 2) + ::decode(pgid.shard, p); + else + pgid.shard = ghobject_t::no_shard(); } }; diff --git a/src/messages/MOSDRepScrub.h b/src/messages/MOSDRepScrub.h index 4fae008c17e4d..3f67021ef14c1 100644 --- a/src/messages/MOSDRepScrub.h +++ b/src/messages/MOSDRepScrub.h @@ -24,10 +24,10 @@ struct MOSDRepScrub : public Message { - static const int HEAD_VERSION = 4; + static const int HEAD_VERSION = 5; static const int COMPAT_VERSION = 2; - pg_t pgid; // PG to scrub + spg_t pgid; // PG to scrub eversion_t scrub_from; // only scrub log entries after scrub_from eversion_t scrub_to; // last_update_applied when message sent epoch_t map_epoch; @@ -40,7 +40,7 @@ struct MOSDRepScrub : public Message { chunky(false), deep(false) { } - MOSDRepScrub(pg_t pgid, eversion_t scrub_from, eversion_t scrub_to, + MOSDRepScrub(spg_t pgid, eversion_t scrub_from, eversion_t scrub_to, epoch_t map_epoch) : Message(MSG_OSD_REP_SCRUB, HEAD_VERSION, COMPAT_VERSION), pgid(pgid), @@ -50,7 +50,7 @@ struct MOSDRepScrub : public Message { chunky(false), deep(false) { } - MOSDRepScrub(pg_t pgid, eversion_t scrub_to, epoch_t map_epoch, + MOSDRepScrub(spg_t pgid, eversion_t scrub_to, epoch_t map_epoch, hobject_t start, hobject_t end, bool deep) : Message(MSG_OSD_REP_SCRUB, HEAD_VERSION, COMPAT_VERSION), pgid(pgid), @@ -78,7 +78,7 @@ public: } void encode_payload(uint64_t features) { - ::encode(pgid, payload); + ::encode(pgid.pgid, payload); ::encode(scrub_from, payload); ::encode(scrub_to, payload); ::encode(map_epoch, payload); @@ -86,10 +86,11 @@ public: ::encode(start, payload); ::encode(end, payload); ::encode(deep, payload); + ::encode(pgid.shard, payload); } void decode_payload() { bufferlist::iterator p = payload.begin(); - ::decode(pgid, p); + ::decode(pgid.pgid, p); ::decode(scrub_from, p); ::decode(scrub_to, p); ::decode(map_epoch, p); @@ -107,6 +108,12 @@ public: chunky = false; deep = false; } + + if (header.version >= 5) { + ::decode(pgid.shard, p); + } else { + pgid.shard = ghobject_t::no_shard(); + } } }; diff --git a/src/messages/MOSDSubOp.h b/src/messages/MOSDSubOp.h index 7e9f087fec809..74022476f3e31 100644 --- a/src/messages/MOSDSubOp.h +++ b/src/messages/MOSDSubOp.h @@ -25,7 +25,7 @@ class MOSDSubOp : public Message { - static const int HEAD_VERSION = 8; + static const int HEAD_VERSION = 9; static const int COMPAT_VERSION = 1; public: @@ -35,7 +35,8 @@ public: osd_reqid_t reqid; // subop - pg_t pgid; + pg_shard_t from; + spg_t pgid; hobject_t poid; object_locator_t oloc; @@ -100,7 +101,7 @@ public: bufferlist::iterator p = payload.begin(); ::decode(map_epoch, p); ::decode(reqid, p); - ::decode(pgid, p); + ::decode(pgid.pgid, p); ::decode(poid, p); __u32 num_ops; @@ -158,12 +159,22 @@ public: ::decode(new_temp_oid, p); ::decode(discard_temp_oid, p); } + + if (header.version >= 9) { + ::decode(from, p); + ::decode(pgid.shard, p); + } else { + from = pg_shard_t( + get_source().num(), + ghobject_t::NO_SHARD); + pgid.shard = ghobject_t::NO_SHARD; + } } virtual void encode_payload(uint64_t features) { ::encode(map_epoch, payload); ::encode(reqid, payload); - ::encode(pgid, payload); + ::encode(pgid.pgid, payload); ::encode(poid, payload); __u32 num_ops = ops.size(); @@ -204,15 +215,19 @@ public: ::encode(omap_header, payload); ::encode(new_temp_oid, payload); ::encode(discard_temp_oid, payload); + ::encode(from, payload); + ::encode(pgid.shard, payload); } MOSDSubOp() : Message(MSG_OSD_SUBOP, HEAD_VERSION, COMPAT_VERSION) { } - MOSDSubOp(osd_reqid_t r, pg_t p, const hobject_t& po, bool noop_, int aw, + MOSDSubOp(osd_reqid_t r, pg_shard_t from, + spg_t p, const hobject_t& po, bool noop_, int aw, epoch_t mape, tid_t rtid, eversion_t v) : Message(MSG_OSD_SUBOP, HEAD_VERSION, COMPAT_VERSION), map_epoch(mape), reqid(r), + from(from), pgid(p), poid(po), acks_wanted(aw), diff --git a/src/messages/MOSDSubOpReply.h b/src/messages/MOSDSubOpReply.h index 6b0738a212f0e..270629f91f3d1 100644 --- a/src/messages/MOSDSubOpReply.h +++ b/src/messages/MOSDSubOpReply.h @@ -30,12 +30,15 @@ */ class MOSDSubOpReply : public Message { + static const int HEAD_VERSION = 2; + static const int COMPAT_VERSION = 1; public: epoch_t map_epoch; // subop metadata osd_reqid_t reqid; - pg_t pgid; + pg_shard_t from; + spg_t pgid; hobject_t poid; vector ops; @@ -54,7 +57,7 @@ public: bufferlist::iterator p = payload.begin(); ::decode(map_epoch, p); ::decode(reqid, p); - ::decode(pgid, p); + ::decode(pgid.pgid, p); ::decode(poid, p); unsigned num_ops; @@ -71,11 +74,21 @@ public: if (!poid.is_max() && poid.pool == -1) poid.pool = pgid.pool(); + + if (header.version >= 2) { + ::decode(from, p); + ::decode(pgid.shard, p); + } else { + from = pg_shard_t( + get_source().num(), + ghobject_t::NO_SHARD); + pgid.shard = ghobject_t::NO_SHARD; + } } virtual void encode_payload(uint64_t features) { ::encode(map_epoch, payload); ::encode(reqid, payload); - ::encode(pgid, payload); + ::encode(pgid.pgid, payload); ::encode(poid, payload); __u32 num_ops = ops.size(); ::encode(num_ops, payload); @@ -87,11 +100,13 @@ public: ::encode(last_complete_ondisk, payload); ::encode(peer_stat, payload); ::encode(attrset, payload); + ::encode(from, payload); + ::encode(pgid.shard, payload); } epoch_t get_map_epoch() { return map_epoch; } - pg_t get_pg() { return pgid; } + spg_t get_pg() { return pgid; } hobject_t get_poid() { return poid; } int get_ack_type() { return ack_type; } @@ -110,11 +125,13 @@ public: map& get_attrset() { return attrset; } public: - MOSDSubOpReply(MOSDSubOp *req, int result_, epoch_t e, int at) : - Message(MSG_OSD_SUBOPREPLY), + MOSDSubOpReply( + MOSDSubOp *req, pg_shard_t from, int result_, epoch_t e, int at) : + Message(MSG_OSD_SUBOPREPLY, HEAD_VERSION, COMPAT_VERSION), map_epoch(e), reqid(req->reqid), - pgid(req->pgid), + from(from), + pgid(req->pgid.pgid, req->from.shard), poid(req->poid), ops(req->ops), ack_type(at), diff --git a/src/messages/MRecoveryReserve.h b/src/messages/MRecoveryReserve.h index e87d8afc87114..2a88bfdeb9f3b 100644 --- a/src/messages/MRecoveryReserve.h +++ b/src/messages/MRecoveryReserve.h @@ -18,10 +18,10 @@ #include "msg/Message.h" class MRecoveryReserve : public Message { - static const int HEAD_VERSION = 1; + static const int HEAD_VERSION = 2; static const int COMPAT_VERSION = 1; public: - pg_t pgid; + spg_t pgid; epoch_t query_epoch; enum { REQUEST = 0, @@ -34,7 +34,7 @@ public: : Message(MSG_OSD_RECOVERY_RESERVE, HEAD_VERSION, COMPAT_VERSION), query_epoch(0), type(-1) {} MRecoveryReserve(int type, - pg_t pgid, + spg_t pgid, epoch_t query_epoch) : Message(MSG_OSD_RECOVERY_RESERVE, HEAD_VERSION, COMPAT_VERSION), pgid(pgid), query_epoch(query_epoch), @@ -63,15 +63,20 @@ public: void decode_payload() { bufferlist::iterator p = payload.begin(); - ::decode(pgid, p); + ::decode(pgid.pgid, p); ::decode(query_epoch, p); ::decode(type, p); + if (header.version >= 2) + ::decode(pgid.shard, p); + else + pgid.shard = ghobject_t::no_shard(); } void encode_payload(uint64_t features) { - ::encode(pgid, payload); + ::encode(pgid.pgid, payload); ::encode(query_epoch, payload); ::encode(type, payload); + ::encode(pgid.shard, payload); } }; -- 2.39.5