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) {}
// pair
template<class A, class B>
+inline void encode(const std::pair<A,B> &p, bufferlist &bl, uint64_t features)
+{
+ encode(p.first, bl, features);
+ encode(p.second, bl, features);
+}
+template<class A, class B>
inline void encode(const std::pair<A,B> &p, bufferlist &bl)
{
encode(p.first, bl);
#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,
: 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),
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);
}
};
#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 {
__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;
::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
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),
#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;
p++)
::encode(pair<epoch_t, epoch_t>(
p->first.epoch_sent, p->first.query_epoch), payload);
+
+ // v4 needs from, to
+ for (vector<pair<pg_notify_t, pg_interval_map_t> >::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();
i->first.query_epoch = epoch;
}
}
+
+ // v4 needs from and to
+ if (header.version >= 4) {
+ for (vector<pair<pg_notify_t, pg_interval_map_t> >::iterator i = pg_list.begin();
+ i != pg_list.end();
+ i++) {
+ ::decode(i->first.from, p);
+ ::decode(i->first.to, p);
+ }
+ }
}
};
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;
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() {}
::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();
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;
+ }
}
};
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;
::encode(pair<epoch_t, epoch_t>(
p->first.epoch_sent, p->first.query_epoch),
payload);
+
+ // v5 needs from, to
+ for (vector<pair<pg_notify_t, pg_interval_map_t> >::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;
i->first.query_epoch = query_epoch;
}
}
+
+ // v5 needs from and to
+ if (header.version >= 5) {
+ for (vector<pair<pg_notify_t, pg_interval_map_t> >::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(";
#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<PullOp> pulls;
uint64_t cost;
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"; }
#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<PushOp> pushes;
uint64_t cost;
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"; }
#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<PushReplyOp> replies;
uint64_t cost;
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 {
#ifndef CEPH_MOSDPGQUERY_H
#define CEPH_MOSDPGQUERY_H
+#include "common/hobject.h"
#include "msg/Message.h"
/*
*/
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_t,pg_query_t> pg_list;
+ map<spg_t, pg_query_t> pg_list;
MOSDPGQuery() : Message(MSG_OSD_PG_QUERY,
HEAD_VERSION,
COMPAT_VERSION) {}
- MOSDPGQuery(epoch_t e, map<pg_t,pg_query_t>& ls) :
+ MOSDPGQuery(epoch_t e, map<spg_t,pg_query_t>& ls) :
Message(MSG_OSD_PG_QUERY,
HEAD_VERSION,
COMPAT_VERSION),
const char *get_type_name() const { return "pg_query"; }
void print(ostream& out) const {
out << "pg_query(";
- for (map<pg_t,pg_query_t>::const_iterator p = pg_list.begin(); p != pg_list.end(); ++p) {
+ for (map<spg_t,pg_query_t>::const_iterator p = pg_list.begin();
+ p != pg_list.end(); ++p) {
if (p != pg_list.begin())
out << ",";
out << p->first;
void encode_payload(uint64_t features) {
::encode(epoch, payload);
- ::encode(pg_list, payload, features);
+ vector<pair<pg_t, pg_query_t> > _pg_list;
+ _pg_list.reserve(pg_list.size());
+ vector<shard_id_t> _shard_list;
+ _shard_list.reserve(pg_list.size());
+ for (map<spg_t, pg_query_t>::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<pair<pg_t, pg_query_t> > _pg_list;
+ ::decode(_pg_list, p);
+ vector<shard_id_t> _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<pg_t, pg_query_t>::iterator i = pg_list.begin();
+ for (map<spg_t, pg_query_t>::iterator i = pg_list.begin();
i != pg_list.end();
++i) {
i->second.epoch_sent = epoch;
#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_t> pg_list;
+ vector<spg_t> pg_list;
epoch_t get_epoch() { return epoch; }
- MOSDPGRemove() : Message(MSG_OSD_PG_REMOVE) {}
- MOSDPGRemove(epoch_t e, vector<pg_t>& l) :
- Message(MSG_OSD_PG_REMOVE) {
+ MOSDPGRemove() :
+ Message(MSG_OSD_PG_REMOVE, HEAD_VERSION, COMPAT_VERSION) {}
+ MOSDPGRemove(epoch_t e, vector<spg_t>& l) :
+ Message(MSG_OSD_PG_REMOVE, HEAD_VERSION, COMPAT_VERSION) {
this->epoch = e;
pg_list.swap(l);
}
void encode_payload(uint64_t features) {
::encode(epoch, payload);
- ::encode(pg_list, payload);
+
+ vector<pg_t> _pg_list;
+ _pg_list.reserve(pg_list.size());
+ vector<shard_id_t> _shard_list;
+ _shard_list.reserve(pg_list.size());
+ for (vector<spg_t>::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_t> _pg_list;
+ ::decode(_pg_list, p);
+
+ vector<shard_id_t> _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<pg_t>::const_iterator i = pg_list.begin();
+ for (vector<spg_t>::const_iterator i = pg_list.begin();
i != pg_list.end();
++i) {
out << "pg" << *i << "; ";
#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
__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() {
::decode(op, p);
::decode(map_epoch, p);
::decode(query_epoch, p);
- ::decode(pgid, p);
+ ::decode(pgid.pgid, p);
::decode(begin, p);
::decode(end, p);
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) {
}
#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:
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();
}
};
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;
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),
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),
}
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);
::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);
chunky = false;
deep = false;
}
+
+ if (header.version >= 5) {
+ ::decode(pgid.shard, p);
+ } else {
+ pgid.shard = ghobject_t::no_shard();
+ }
}
};
class MOSDSubOp : public Message {
- static const int HEAD_VERSION = 8;
+ static const int HEAD_VERSION = 9;
static const int COMPAT_VERSION = 1;
public:
osd_reqid_t reqid;
// subop
- pg_t pgid;
+ pg_shard_t from;
+ spg_t pgid;
hobject_t poid;
object_locator_t oloc;
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;
::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();
::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),
*/
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<OSDOp> ops;
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;
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);
::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; }
map<string,bufferptr>& 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),
#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,
: 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),
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);
}
};