peer_activated.insert(pg_whoami);
dout(10) << "_activate_committed " << epoch
<< " peer_activated now " << peer_activated
+ << " last_interval_started " << info.history.last_interval_started
<< " last_epoch_started " << info.history.last_epoch_started
<< " same_interval_since " << info.history.same_interval_since << dendl;
assert(!actingbackfill.empty());
info);
i.info.history.last_epoch_started = activation_epoch;
+ i.info.history.last_interval_started = i.info.history.same_interval_since;
if (acting.size() >= pool.info.min_size) {
state_set(PG_STATE_ACTIVE);
} else {
// NOTE: this is actually a bit premature: we haven't purged the
// strays yet.
info.history.last_epoch_clean = get_osdmap()->get_epoch();
+ info.history.last_interval_clean = info.history.same_interval_since;
past_intervals.clear();
void pg_history_t::encode(bufferlist &bl) const
{
- ENCODE_START(7, 4, bl);
+ ENCODE_START(8, 4, bl);
::encode(epoch_created, bl);
::encode(last_epoch_started, bl);
::encode(last_epoch_clean, bl);
::encode(last_deep_scrub_stamp, bl);
::encode(last_clean_scrub_stamp, bl);
::encode(last_epoch_marked_full, bl);
+ ::encode(last_interval_started, bl);
+ ::encode(last_interval_clean, bl);
ENCODE_FINISH(bl);
}
void pg_history_t::decode(bufferlist::iterator &bl)
{
- DECODE_START_LEGACY_COMPAT_LEN(7, 4, 4, bl);
+ DECODE_START_LEGACY_COMPAT_LEN(8, 4, 4, bl);
::decode(epoch_created, bl);
::decode(last_epoch_started, bl);
if (struct_v >= 3)
if (struct_v >= 7) {
::decode(last_epoch_marked_full, bl);
}
+ if (struct_v >= 8) {
+ ::decode(last_interval_started, bl);
+ ::decode(last_interval_clean, bl);
+ } else {
+ if (last_epoch_started >= same_interval_since) {
+ last_interval_started = same_interval_since;
+ } else {
+ last_interval_started = last_epoch_started; // best guess
+ }
+ if (last_epoch_clean >= same_interval_since) {
+ last_interval_clean = same_interval_since;
+ } else {
+ last_interval_clean = last_epoch_clean; // best guess
+ }
+ }
DECODE_FINISH(bl);
}
{
f->dump_int("epoch_created", epoch_created);
f->dump_int("last_epoch_started", last_epoch_started);
+ f->dump_int("last_interval_started", last_interval_started);
f->dump_int("last_epoch_clean", last_epoch_clean);
+ f->dump_int("last_interval_clean", last_interval_clean);
f->dump_int("last_epoch_split", last_epoch_split);
f->dump_int("last_epoch_marked_full", last_epoch_marked_full);
f->dump_int("same_up_since", same_up_since);
o.push_back(new pg_history_t);
o.back()->epoch_created = 1;
o.back()->last_epoch_started = 2;
+ o.back()->last_interval_started = 2;
o.back()->last_epoch_clean = 3;
+ o.back()->last_interval_clean = 2;
o.back()->last_epoch_split = 4;
o.back()->same_up_since = 5;
o.back()->same_interval_since = 6;
struct pg_history_t {
epoch_t epoch_created; // epoch in which PG was created
epoch_t last_epoch_started; // lower bound on last epoch started (anywhere, not necessarily locally)
+ epoch_t last_interval_started; // first epoch of last_epoch_started interval
epoch_t last_epoch_clean; // lower bound on last epoch the PG was completely clean.
+ epoch_t last_interval_clean; // first epoch of last_epoch_clean interval
epoch_t last_epoch_split; // as parent
epoch_t last_epoch_marked_full; // pool or cluster
return
l.epoch_created == r.epoch_created &&
l.last_epoch_started == r.last_epoch_started &&
+ l.last_interval_started == r.last_interval_started &&
l.last_epoch_clean == r.last_epoch_clean &&
+ l.last_interval_clean == r.last_interval_clean &&
l.last_epoch_split == r.last_epoch_split &&
l.last_epoch_marked_full == r.last_epoch_marked_full &&
l.same_up_since == r.same_up_since &&
pg_history_t()
: epoch_created(0),
- last_epoch_started(0), last_epoch_clean(0), last_epoch_split(0),
+ last_epoch_started(0),
+ last_interval_started(0),
+ last_epoch_clean(0),
+ last_interval_clean(0),
+ last_epoch_split(0),
last_epoch_marked_full(0),
same_up_since(0), same_interval_since(0), same_primary_since(0) {}
last_epoch_started = other.last_epoch_started;
modified = true;
}
+ if (last_interval_started < other.last_interval_started) {
+ last_interval_started = other.last_interval_started;
+ modified = true;
+ }
if (last_epoch_clean < other.last_epoch_clean) {
last_epoch_clean = other.last_epoch_clean;
modified = true;
}
+ if (last_interval_clean < other.last_interval_clean) {
+ last_interval_clean = other.last_interval_clean;
+ modified = true;
+ }
if (last_epoch_split < other.last_epoch_split) {
last_epoch_split = other.last_epoch_split;
modified = true;
inline ostream& operator<<(ostream& out, const pg_history_t& h) {
return out << "ec=" << h.epoch_created
+ << " lis/c " << h.last_interval_started
+ << "/" << h.last_interval_clean
<< " les/c/f " << h.last_epoch_started << "/" << h.last_epoch_clean
<< "/" << h.last_epoch_marked_full
- << " " << h.same_up_since << "/" << h.same_interval_since << "/" << h.same_primary_since;
+ << " " << h.same_up_since
+ << "/" << h.same_interval_since
+ << "/" << h.same_primary_since;
}