* OSD sub op - for internal ops on pobjects between primary and replicas(/stripes/whatever)
*/
-class MOSDRepOp : public MessageInstance<MOSDRepOp, MOSDFastDispatchOp> {
-public:
- friend factory;
+class MOSDRepOp : public MOSDFastDispatchOp {
private:
- static constexpr int HEAD_VERSION = 2;
+ static constexpr int HEAD_VERSION = 3;
static constexpr int COMPAT_VERSION = 1;
public:
spg_t pgid;
- bufferlist::const_iterator p;
+ ceph::buffer::list::const_iterator p;
// Decoding flags. Decoding is only needed for messages caught by pipe reader.
bool final_decode_needed;
__u8 acks_wanted;
// transaction to exec
- bufferlist logbl;
+ ceph::buffer::list logbl;
pg_stat_t pg_stats;
// subop metadata
// piggybacked osd/og state
eversion_t pg_trim_to; // primary->replica: trim to here
- eversion_t pg_roll_forward_to; // primary->replica: trim rollback
- // info to here
+ eversion_t min_last_complete_ondisk; // lower bound on committed version
hobject_t new_temp_oid; ///< new temp object that we must now start tracking
hobject_t discard_temp_oid; ///< previously used temp object that we can now stop tracking
/// non-empty if this transaction involves a hit_set history update
- boost::optional<pg_hit_set_history_t> updated_hit_set_history;
+ std::optional<pg_hit_set_history_t> updated_hit_set_history;
epoch_t get_map_epoch() const override {
return map_epoch;
}
void decode_payload() override {
+ using ceph::decode;
p = payload.cbegin();
// split to partial and final
decode(map_epoch, p);
}
void finish_decode() {
+ using ceph::decode;
if (!final_decode_needed)
return; // Message is already final decoded
decode(poid, p);
decode(from, p);
decode(updated_hit_set_history, p);
- decode(pg_roll_forward_to, p);
+
+ if (header.version >= 3) {
+ decode(min_last_complete_ondisk, p);
+ } else {
+ /* This field used to mean pg_roll_foward_to, but ReplicatedBackend
+ * simply assumes that we're rolling foward to version. */
+ eversion_t pg_roll_forward_to;
+ decode(pg_roll_forward_to, p);
+ }
final_decode_needed = false;
}
encode(discard_temp_oid, payload);
encode(from, payload);
encode(updated_hit_set_history, payload);
- encode(pg_roll_forward_to, payload);
+ encode(min_last_complete_ondisk, payload);
}
MOSDRepOp()
- : MessageInstance(MSG_OSD_REPOP, HEAD_VERSION, COMPAT_VERSION),
+ : MOSDFastDispatchOp{MSG_OSD_REPOP, HEAD_VERSION, COMPAT_VERSION},
map_epoch(0),
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, epoch_t min_epoch, ceph_tid_t rtid, eversion_t v)
- : MessageInstance(MSG_OSD_REPOP, HEAD_VERSION, COMPAT_VERSION),
+ : MOSDFastDispatchOp{MSG_OSD_REPOP, HEAD_VERSION, COMPAT_VERSION},
map_epoch(mape),
min_epoch(min_epoch),
reqid(r),
version(v) {
set_tid(rtid);
}
+
+ void set_rollback_to(const eversion_t &rollback_to) {
+ header.version = 2;
+ min_last_complete_ondisk = rollback_to;
+ }
private:
~MOSDRepOp() override {}
public:
std::string_view get_type_name() const override { return "osd_repop"; }
- void print(ostream& out) const override {
+ void print(std::ostream& out) const override {
out << "osd_repop(" << reqid
<< " " << pgid << " e" << map_epoch << "/" << min_epoch;
if (!final_decode_needed) {
out << " " << poid << " v " << version;
if (updated_hit_set_history)
out << ", has_updated_hit_set_history";
+ if (header.version < 3) {
+ out << ", rollback_to(legacy)=" << min_last_complete_ondisk;
+ } else {
+ out << ", mlcod=" << min_last_complete_ondisk;
+ }
}
out << ")";
}
+private:
+ template<class T, typename... Args>
+ friend boost::intrusive_ptr<T> ceph::make_message(Args&&... args);
};
-
#endif