bool async) {
logger().debug("{}", __func__);
if (is_primary()) {
- ceph_assert(trim_to <= peering_state.get_last_update_ondisk());
+ ceph_assert(trim_to <= peering_state.get_pg_committed_to());
}
/* TODO: when we add snap mapper and projected log support,
* we'll likely want to update them here.
clear_recovery_state();
- last_update_ondisk = eversion_t();
+ pg_committed_to = eversion_t();
missing_loc.clear();
pl->clear_primary_state();
}
min_last_complete_ondisk = eversion_t(0,0); // we don't know (yet)!
if (is_primary()) {
- last_update_ondisk = info.last_update;
+ pg_committed_to = info.last_update;
}
last_update_applied = info.last_update;
last_rollback_info_trimmed_to_applied = pg_log.get_can_rollback_to();
void PeeringState::complete_write(eversion_t v, eversion_t lc)
{
- last_update_ondisk = v;
+ pg_committed_to = v;
last_complete_ondisk = lc;
calc_min_last_complete_ondisk();
}
eversion_t limit = std::min({
pg_log.get_head(),
pg_log.get_can_rollback_to(),
- last_update_ondisk});
+ pg_committed_to});
psdout(10) << "limit = " << limit << dendl;
if (limit != eversion_t() &&
}
if (ps.is_peered()) {
- if (ps.last_update_ondisk != ps.info.last_update)
- out << " luod=" << ps.last_update_ondisk;
+ if (ps.pg_committed_to != ps.info.last_update)
+ out << " pct=" << ps.pg_committed_to;
if (ps.last_update_applied != ps.info.last_update)
out << " lua=" << ps.last_update_applied;
}
epoch_t last_peering_reset = 0; ///< epoch of last peering reset
- /// last_update that has committed; ONLY DEFINED WHEN is_active()
- eversion_t last_update_ondisk;
+ /**
+ * pg_committed_to
+ *
+ * Maintained on the primary while pg is at least peered.
+ *
+ * Forall e <= pg_committed_to, e has been committed on all replicas.
+ *
+ * As a consequence, if the pg is active (and not merely peered):
+ * - No version e <= pg_committed_to can become divergent
+ * - It is safe for replicas to read any object whose most recent update is
+ * <= pg_committed_to
+ *
+ * Note that if the PG is only peered, it is in fact possible for
+ * pg_committed_to to become divergent.
+ */
+ eversion_t pg_committed_to;
+
eversion_t last_complete_ondisk; ///< last_complete that has committed.
eversion_t last_update_applied; ///< last_update readable
/// last version to which rollback_info trimming has been applied
return last_update_applied;
}
- eversion_t get_last_update_ondisk() const {
- return last_update_ondisk;
+ eversion_t get_pg_committed_to() const {
+ return pg_committed_to;
}
bool debug_has_dirty_state() const {
ObjectStore::Transaction &t,
bool async = false) override {
if (is_primary()) {
- ceph_assert(trim_to <= recovery_state.get_last_update_ondisk());
+ ceph_assert(trim_to <= recovery_state.get_pg_committed_to());
}
if (hset_history) {
recovery_state.update_hset(*hset_history);