#define CEPH_MOSDPGLOG_H
#include "messages/MOSDPeeringOp.h"
+#include "osd/PGPeeringEvent.h"
-class MOSDPGLog : public MessageInstance<MOSDPGLog, MOSDPeeringOp> {
-public:
- friend factory;
+class MOSDPGLog : public MOSDPeeringOp {
private:
- static constexpr int HEAD_VERSION = 5;
+ static constexpr int HEAD_VERSION = 6;
static constexpr int COMPAT_VERSION = 5;
epoch_t epoch = 0;
pg_log_t log;
pg_missing_t missing;
PastIntervals past_intervals;
+ std::optional<pg_lease_t> lease;
epoch_t get_epoch() const { return epoch; }
spg_t get_pgid() const { return spg_t(info.pgid.pgid, to); }
false));
}
- MOSDPGLog() : MessageInstance(MSG_OSD_PG_LOG, HEAD_VERSION, COMPAT_VERSION) {
+ MOSDPGLog() : MOSDPeeringOp{MSG_OSD_PG_LOG, HEAD_VERSION, COMPAT_VERSION} {
set_priority(CEPH_MSG_PRIO_HIGH);
}
MOSDPGLog(shard_id_t to, shard_id_t from,
- version_t mv, pg_info_t& i, epoch_t query_epoch)
- : MessageInstance(MSG_OSD_PG_LOG, HEAD_VERSION, COMPAT_VERSION),
+ version_t mv, const pg_info_t& i, epoch_t query_epoch)
+ : MOSDPeeringOp{MSG_OSD_PG_LOG, HEAD_VERSION, COMPAT_VERSION},
epoch(mv), query_epoch(query_epoch),
to(to), from(from),
info(i) {
public:
std::string_view get_type_name() const override { return "PGlog"; }
- void inner_print(ostream& out) const override {
+ void inner_print(std::ostream& out) const override {
// NOTE: log is not const, but operator<< doesn't touch fields
// swapped out by OSD code.
out << "log " << log
<< " pi " << past_intervals;
+ if (lease) {
+ out << " " << *lease;
+ }
}
void encode_payload(uint64_t features) override {
encode(epoch, payload);
encode(info, payload);
encode(log, payload);
- encode(missing, payload);
+ encode(missing, payload, features);
if (!HAVE_FEATURE(features, SERVER_NAUTILUS)) {
// pre-nautilus OSDs do not set last_peering_reset properly
encode(epoch, payload);
encode(past_intervals, payload);
encode(to, payload);
encode(from, payload);
+ encode(lease, payload);
}
void decode_payload() override {
+ using ceph::decode;
auto p = payload.cbegin();
decode(epoch, p);
decode(info, p);
decode(past_intervals, p);
decode(to, p);
decode(from, p);
+ if (header.version >= 6) {
+ decode(lease, p);
+ }
}
+private:
+ template<class T, typename... Args>
+ friend boost::intrusive_ptr<T> ceph::make_message(Args&&... args);
};
#endif