DEFINE_CEPH_FEATURE_RETIRED(16, 1, QUERY_T, JEWEL, LUMINOUS)
DEFINE_CEPH_FEATURE(16, 3, SERVER_OCTOPUS)
+DEFINE_CEPH_FEATURE(16, 3, OSD_REPOP_MLCOD)
DEFINE_CEPH_FEATURE_RETIRED(17, 1, INDEP_PG_MAP, JEWEL, LUMINOUS)
DEFINE_CEPH_FEATURE(17, 3, OS_PERF_STAT_NS)
CEPH_FEATURE_CEPHX_V2 | \
CEPH_FEATURE_OSD_PGLOG_HARDLIMIT | \
CEPH_FEATUREMASK_SERVER_OCTOPUS | \
+ CEPH_FEATUREMASK_OSD_REPOP_MLCOD | \
0ULL)
#define CEPH_FEATURES_SUPPORTED_DEFAULT CEPH_FEATURES_ALL
class MOSDRepOp : public MOSDFastDispatchOp {
private:
- static constexpr int HEAD_VERSION = 2;
+ static constexpr int HEAD_VERSION = 3;
static constexpr int COMPAT_VERSION = 1;
public:
// 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
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()
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 {}
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 << ")";
}
tid,
reqid,
trim_to,
- at_version,
+ min_last_complete_ondisk,
added.size() ? *(added.begin()) : hobject_t(),
removed.size() ? *(removed.begin()) : hobject_t(),
log_entries,
ceph_tid_t tid,
osd_reqid_t reqid,
eversion_t pg_trim_to,
- eversion_t pg_roll_forward_to,
+ eversion_t min_last_complete_ondisk,
hobject_t new_temp_oid,
hobject_t discard_temp_oid,
const bufferlist &log_entries,
wr->pg_stats = get_info().stats;
wr->pg_trim_to = pg_trim_to;
- wr->pg_roll_forward_to = pg_roll_forward_to;
+
+ if (HAVE_FEATURE(parent->min_peer_features(), OSD_REPOP_MLCOD)) {
+ wr->min_last_complete_ondisk = min_last_complete_ondisk;
+ } else {
+ /* Some replicas need this field to be at_version. New replicas
+ * will ignore it */
+ wr->set_rollback_to(at_version);
+ }
wr->new_temp_oid = new_temp_oid;
wr->discard_temp_oid = discard_temp_oid;
ceph_tid_t tid,
osd_reqid_t reqid,
eversion_t pg_trim_to,
- eversion_t pg_roll_forward_to,
+ eversion_t min_last_complete_ondisk,
hobject_t new_temp_oid,
hobject_t discard_temp_oid,
const vector<pg_log_entry_t> &log_entries,
tid,
reqid,
pg_trim_to,
- pg_roll_forward_to,
+ min_last_complete_ondisk,
new_temp_oid,
discard_temp_oid,
logs,
ceph_tid_t tid,
osd_reqid_t reqid,
eversion_t pg_trim_to,
- eversion_t pg_roll_forward_to,
+ eversion_t min_last_complete_ondisk,
hobject_t new_temp_oid,
hobject_t discard_temp_oid,
const bufferlist &log_entries,
ceph_tid_t tid,
osd_reqid_t reqid,
eversion_t pg_trim_to,
- eversion_t pg_roll_forward_to,
+ eversion_t min_last_complete_ondisk,
hobject_t new_temp_oid,
hobject_t discard_temp_oid,
const vector<pg_log_entry_t> &log_entries,