info.last_epoch_started = oinfo.last_epoch_started;
dirty_info = true;
}
+ if (oinfo.last_interval_started > info.last_interval_started) {
+ info.last_interval_started = oinfo.last_interval_started;
+ dirty_info = true;
+ }
if (info.history.merge(oinfo.history))
dirty_info = true;
assert(cct->_conf->osd_find_best_info_ignore_history_les ||
assert(cct->_conf->osd_find_best_info_ignore_history_les ||
info.last_epoch_started <= activation_epoch);
info.last_epoch_started = activation_epoch;
+ info.last_interval_started = info.history.same_interval_since;
}
} else if (is_acting(pg_whoami)) {
/* update last_epoch_started on acting replica to whatever the primary sent
* unless it's smaller (could happen if we are going peered rather than
* active, see doc/dev/osd_internals/last_epoch_started.rst) */
- if (info.last_epoch_started < activation_epoch)
+ if (info.last_epoch_started < activation_epoch) {
info.last_epoch_started = activation_epoch;
+ info.last_interval_started = info.history.same_interval_since;
+ }
}
auto &missing = pg_log.get_missing();
pi.last_complete = info.last_update;
pi.set_last_backfill(hobject_t());
pi.last_epoch_started = info.last_epoch_started;
+ pi.last_interval_started = info.last_interval_started;
pi.history = info.history;
pi.hit_set = info.hit_set;
pi.stats.stats.clear();
info.stats.stats_invalid = true;
child->info.stats.stats_invalid = true;
child->info.last_epoch_started = info.last_epoch_started;
+ child->info.last_interval_started = info.last_interval_started;
child->snap_trimq = snap_trimq;
if (info.last_epoch_started != info.history.last_epoch_started) {
info.history.last_epoch_started = info.last_epoch_started;
}
+ if (info.last_interval_started != info.history.last_interval_started) {
+ info.history.last_interval_started = info.last_interval_started;
+ }
dout(10) << "append_log " << pg_log.get_log() << " " << logv << dendl;
PGLogEntryHandler handler{this, &t};
pg_shard_t peer = *i;
if (peer_info.count(peer)) {
peer_info[peer].last_epoch_started = info.last_epoch_started;
+ peer_info[peer].last_interval_started = info.last_interval_started;
peer_info[peer].history.merge(info.history);
}
MOSDPGInfo *m = new MOSDPGInfo(get_osdmap()->get_epoch());
// info.last_epoch_started is set during activate()
pg->info.history.last_epoch_started = pg->info.last_epoch_started;
+ pg->info.history.last_interval_started = pg->info.last_interval_started;
pg->dirty_info = true;
pg->share_pg_info();
void pg_info_t::encode(bufferlist &bl) const
{
- ENCODE_START(31, 26, bl);
+ ENCODE_START(32, 26, bl);
::encode(pgid.pgid, bl);
::encode(last_update, bl);
::encode(last_complete, bl);
::encode(pgid.shard, bl);
::encode(last_backfill, bl);
::encode(last_backfill_bitwise, bl);
+ ::encode(last_interval_started, bl);
ENCODE_FINISH(bl);
}
void pg_info_t::decode(bufferlist::iterator &bl)
{
- DECODE_START(31, bl);
+ DECODE_START(32, bl);
::decode(pgid.pgid, bl);
::decode(last_update, bl);
::decode(last_complete, bl);
::decode(pgid.shard, bl);
::decode(last_backfill, bl);
::decode(last_backfill_bitwise, bl);
+ if (struct_v >= 32) {
+ ::decode(last_interval_started, bl);
+ } else {
+ last_interval_started = last_epoch_started;
+ }
DECODE_FINISH(bl);
}
return unique_ptr<PastIntervals::interval_rep>(new pi_compact_rep(*this));
}
ostream &print(ostream &out) const override {
- return out << "([" << first << "," << last << "] " << intervals << ")";
+ return out << "([" << first << "," << last
+ << "] intervals=" << intervals << ")";
}
void encode(bufferlist &bl) const override {
ENCODE_START(1, 1, bl);
eversion_t last_update; ///< last object version applied to store.
eversion_t last_complete; ///< last version pg was complete through.
epoch_t last_epoch_started; ///< last epoch at which this pg started on this osd
+ epoch_t last_interval_started; ///< first epoch of last_epoch_started interval
version_t last_user_version; ///< last user object version applied to store
l.last_update == r.last_update &&
l.last_complete == r.last_complete &&
l.last_epoch_started == r.last_epoch_started &&
+ l.last_interval_started == r.last_interval_started &&
l.last_user_version == r.last_user_version &&
l.log_tail == r.log_tail &&
l.last_backfill == r.last_backfill &&
}
pg_info_t()
- : last_epoch_started(0), last_user_version(0),
+ : last_epoch_started(0),
+ last_interval_started(0),
+ last_user_version(0),
last_backfill(hobject_t::get_max()),
last_backfill_bitwise(false)
{ }
// cppcheck-suppress noExplicitConstructor
pg_info_t(spg_t p)
: pgid(p),
- last_epoch_started(0), last_user_version(0),
+ last_epoch_started(0),
+ last_interval_started(0),
+ last_user_version(0),
last_backfill(hobject_t::get_max()),
last_backfill_bitwise(false)
{ }
out << " lb " << pgi.last_backfill
<< (pgi.last_backfill_bitwise ? " (bitwise)" : " (NIBBLEWISE)");
//out << " c " << pgi.epoch_created;
- out << " local-les=" << pgi.last_epoch_started;
+ out << " local-lis/les=" << pgi.last_interval_started
+ << "/" << pgi.last_epoch_started;
out << " n=" << pgi.stats.stats.sum.num_objects;
out << " " << pgi.history
<< ")";