From: Sage Weil Date: Tue, 11 Apr 2017 21:26:16 +0000 (-0400) Subject: messages/MOSDPGNotify: streamline luminous+ encoding X-Git-Tag: v12.0.3~129^2~18 X-Git-Url: http://git-server-git.apps.pok.os.sepia.ceph.com/?a=commitdiff_plain;h=e7ccadec516676806727f004e07342f29420acce;p=ceph.git messages/MOSDPGNotify: streamline luminous+ encoding Signed-off-by: Sage Weil --- diff --git a/src/messages/MOSDPGNotify.h b/src/messages/MOSDPGNotify.h index 700b579d029d..a0b118aceb86 100644 --- a/src/messages/MOSDPGNotify.h +++ b/src/messages/MOSDPGNotify.h @@ -58,112 +58,118 @@ public: const char *get_type_name() const override { return "PGnot"; } void encode_payload(uint64_t features) override { - // Use query_epoch for first entry for backwards compatibility - epoch_t query_epoch = epoch; - if (pg_list.size()) - query_epoch = pg_list.begin()->first.query_epoch; + if (!HAVE_FEATURE(features, SERVER_LUMINOUS)) { + // for jewel+kraken compat only + header.version = 5; + + // Use query_epoch for first entry for backwards compatibility + epoch_t query_epoch = epoch; + if (pg_list.size()) + query_epoch = pg_list.begin()->first.query_epoch; - ::encode(epoch, payload); - - // v2 was vector - __u32 n = pg_list.size(); - ::encode(n, payload); - for (vector >::iterator p = pg_list.begin(); - p != pg_list.end(); - p++) - ::encode(p->first.info, payload); - - ::encode(query_epoch, payload); - - // v3 needs the PastIntervals for each record - for (vector >::iterator p = pg_list.begin(); - p != pg_list.end(); - p++) { - if (HAVE_FEATURE(features, SERVER_LUMINOUS)) { - ::encode(p->second, payload); - } else { - header.version = 5; + ::encode(epoch, payload); + + // v2 was vector + __u32 n = pg_list.size(); + ::encode(n, payload); + for (auto p = pg_list.begin(); + p != pg_list.end(); + p++) + ::encode(p->first.info, payload); + + ::encode(query_epoch, payload); + + // v3 needs the PastIntervals for each record + for (auto p = pg_list.begin(); + p != pg_list.end(); + p++) { p->second.encode_classic(payload); } - } - // v4 needs epoch_sent, query_epoch - for (vector >::iterator p = pg_list.begin(); - p != pg_list.end(); - p++) - ::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); + // v4 needs epoch_sent, query_epoch + for (vector >::iterator p = pg_list.begin(); + p != pg_list.end(); + p++) + ::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); + } + return; } + + ::encode(epoch, payload); + ::encode(pg_list, payload); } + void decode_payload() override { - epoch_t query_epoch; bufferlist::iterator p = payload.begin(); - ::decode(epoch, p); - - // decode pg_info_t portion of the vector - __u32 n; - ::decode(n, p); - pg_list.resize(n); - for (unsigned i=0; i= 3) { - // get the PastIntervals portion - for (unsigned i=0; i= 6) { - ::decode(pg_list[i].second, p); - } else { + if (header.version >= 3) { + // get the PastIntervals portion + for (unsigned i=0; i >::iterator i = pg_list.begin(); - i != pg_list.end(); - i++) { - if (header.version >= 4) { - pair dec; - ::decode(dec, p); - i->first.epoch_sent = dec.first; - i->first.query_epoch = dec.second; - } else { - i->first.epoch_sent = epoch; - i->first.query_epoch = query_epoch; - } - } - // v5 needs from and to - if (header.version >= 5) { - for (vector >::iterator i = pg_list.begin(); + // v3 needs epoch_sent, query_epoch + for (auto i = pg_list.begin(); i != pg_list.end(); i++) { - ::decode(i->first.from, p); - ::decode(i->first.to, p); + if (header.version >= 4) { + pair dec; + ::decode(dec, p); + i->first.epoch_sent = dec.first; + i->first.query_epoch = dec.second; + } else { + i->first.epoch_sent = epoch; + i->first.query_epoch = query_epoch; + } + } + + // v5 needs from and to + if (header.version >= 5) { + for (auto i = pg_list.begin(); + i != pg_list.end(); + i++) { + ::decode(i->first.from, p); + ::decode(i->first.to, p); + } } + return; } + + ::decode(epoch, p); + ::decode(pg_list, p); } void print(ostream& out) const override { out << "pg_notify("; - for (vector >::const_iterator i = pg_list.begin(); + for (auto i = pg_list.begin(); i != pg_list.end(); ++i) { if (i != pg_list.begin()) - out << ","; - out << i->first.info.pgid; - if (i->second.size()) - out << "(" << i->second.size() << ")"; + out << " "; + out << i->first << "=" << i->second; } out << " epoch " << epoch << ")";