ceph_assert(m->get_type() == MSG_OSD_PG_UPDATE_LOG_MISSING);
ObjectStore::Transaction t;
- std::optional<eversion_t> op_trim_to, op_roll_forward_to;
+ std::optional<eversion_t> op_trim_to, op_pg_committed_to;
if (m->pg_trim_to != eversion_t())
op_trim_to = m->pg_trim_to;
- if (m->pg_roll_forward_to != eversion_t())
- op_roll_forward_to = m->pg_roll_forward_to;
- logger().debug("op_trim_to = {}, op_roll_forward_to = {}",
+ if (m->pg_committed_to != eversion_t())
+ op_pg_committed_to = m->pg_committed_to;
+ logger().debug("op_trim_to = {}, op_pg_committed_to = {}",
op_trim_to.has_value() ? *op_trim_to : eversion_t(),
- op_roll_forward_to.has_value() ? *op_roll_forward_to : eversion_t());
+ op_pg_committed_to.has_value() ? *op_pg_committed_to : eversion_t());
peering_state.append_log_entries_update_missing(
- m->entries, t, op_trim_to, op_roll_forward_to);
+ m->entries, t, op_trim_to, op_pg_committed_to);
return interruptor::make_interruptible(shard_services.get_store().do_transaction(
coll_ref, std::move(t))).then_interruptible(
mempool::osd_pglog::list<pg_log_entry_t> entries;
// piggybacked osd/pg state
eversion_t pg_trim_to; // primary->replica: trim to here
- eversion_t pg_roll_forward_to; // primary->replica: trim rollback info to here
+
+ /**
+ * pg_committed_to
+ *
+ * Propagates PeeringState::pg_committed_to to replicas as with
+ * MOSDRepOp, ECSubWrite
+ *
+ * Historical Note: Prior to early 2024, this field was named
+ * pg_roll_forward_to. pg_committed_to is a safe value to rollforward to as
+ * it is a conservative bound on versions that can become divergent. Switching
+ * it to be populated by pg_committed_to rather than mlcod mirrors MOSDRepOp
+ * and upgrade cases in both directions should be safe as mlcod is <= pct
+ * and replicas (both ec and replicated) only actually rely on versions <= this
+ * field being non-divergent. This note may be removed in main after U is
+ * released.
+ */
+ eversion_t pg_committed_to;
epoch_t get_epoch() const { return map_epoch; }
spg_t get_pgid() const { return pgid; }
epoch_t min_epoch,
ceph_tid_t rep_tid,
eversion_t pg_trim_to,
- eversion_t pg_roll_forward_to)
+ eversion_t pg_committed_to)
: MOSDFastDispatchOp{MSG_OSD_PG_UPDATE_LOG_MISSING, HEAD_VERSION,
COMPAT_VERSION},
map_epoch(epoch),
rep_tid(rep_tid),
entries(entries),
pg_trim_to(pg_trim_to),
- pg_roll_forward_to(pg_roll_forward_to)
+ pg_committed_to(pg_committed_to)
{}
private:
<< " rep_tid " << rep_tid
<< " entries " << entries
<< " trim_to " << pg_trim_to
- << " roll_forward_to " << pg_roll_forward_to
+ << " pg_committed_to " << pg_committed_to
<< ")";
}
encode(entries, payload);
encode(min_epoch, payload);
encode(pg_trim_to, payload);
- encode(pg_roll_forward_to, payload);
+ encode(pg_committed_to, payload);
}
void decode_payload() override {
using ceph::decode;
}
if (header.version >= 3) {
decode(pg_trim_to, p);
- decode(pg_roll_forward_to, p);
+ decode(pg_committed_to, p);
}
}
private:
bool PeeringState::append_log_entries_update_missing(
const mempool::osd_pglog::list<pg_log_entry_t> &entries,
ObjectStore::Transaction &t, std::optional<eversion_t> trim_to,
- std::optional<eversion_t> roll_forward_to)
+ std::optional<eversion_t> pg_committed_to)
{
ceph_assert(!entries.empty());
ceph_assert(entries.begin()->version > info.last_update);
entries,
rollbacker.get());
- if (roll_forward_to && entries.rbegin()->soid > info.last_backfill) {
+ if (pg_committed_to && entries.rbegin()->soid > info.last_backfill) {
pg_log.roll_forward(rollbacker.get());
}
- if (roll_forward_to && *roll_forward_to > pg_log.get_can_rollback_to()) {
- pg_log.roll_forward_to(*roll_forward_to, rollbacker.get());
- last_rollback_info_trimmed_to_applied = *roll_forward_to;
+ if (pg_committed_to && *pg_committed_to > pg_log.get_can_rollback_to()) {
+ pg_log.roll_forward_to(*pg_committed_to, rollbacker.get());
+ last_rollback_info_trimmed_to_applied = *pg_committed_to;
}
info.last_update = pg_log.get_head();
const mempool::osd_pglog::list<pg_log_entry_t> &entries,
ObjectStore::Transaction &t,
std::optional<eversion_t> trim_to,
- std::optional<eversion_t> roll_forward_to)
+ std::optional<eversion_t> pg_committed_to)
{
psdout(10) << entries << dendl;
ceph_assert(is_primary());
bool rebuild_missing = append_log_entries_update_missing(
- entries, t, trim_to, roll_forward_to);
+ entries, t, trim_to, pg_committed_to);
for (auto i = acting_recovery_backfill.begin();
i != acting_recovery_backfill.end();
++i) {
const mempool::osd_pglog::list<pg_log_entry_t> &entries,
ObjectStore::Transaction &t,
std::optional<eversion_t> trim_to,
- std::optional<eversion_t> roll_forward_to);
+ std::optional<eversion_t> pg_committed_to);
/**
* Updates local log to reflect new write from primary.
const mempool::osd_pglog::list<pg_log_entry_t> &entries,
ObjectStore::Transaction &t,
std::optional<eversion_t> trim_to,
- std::optional<eversion_t> roll_forward_to);
+ std::optional<eversion_t> pg_committed_to);
/// Update missing set to reflect e (TODOSAM: not sure why this is needed)
void add_local_next_event(const pg_log_entry_t& e) {
op->get_req());
ceph_assert(m->get_type() == MSG_OSD_PG_UPDATE_LOG_MISSING);
ObjectStore::Transaction t;
- std::optional<eversion_t> op_trim_to, op_roll_forward_to;
+ std::optional<eversion_t> op_trim_to, op_pg_committed_to;
if (m->pg_trim_to != eversion_t())
op_trim_to = m->pg_trim_to;
- if (m->pg_roll_forward_to != eversion_t())
- op_roll_forward_to = m->pg_roll_forward_to;
+ if (m->pg_committed_to != eversion_t())
+ op_pg_committed_to = m->pg_committed_to;
dout(20) << __func__
- << " op_trim_to = " << op_trim_to << " op_roll_forward_to = "
- << op_roll_forward_to << dendl;
+ << " op_trim_to = " << op_trim_to << " op_pg_committed_to = "
+ << op_pg_committed_to << dendl;
recovery_state.append_log_entries_update_missing(
- m->entries, t, op_trim_to, op_roll_forward_to);
+ m->entries, t, op_trim_to, op_pg_committed_to);
eversion_t new_lcod = info.last_complete;
Context *complete = new LambdaContext(