val = i->second.last_unstale;
}
+ if ((types & STUCK_PEERING) && (i->second.state & PG_STATE_PEERING)) {
+ if (i->second.last_peered < val)
+ val = i->second.last_peered;
+ }
// val is now the earliest any of the requested stuck states began
if (val < cutoff) {
stuck_pgs[i->first] = i->second;
stuck_types |= PGMap::STUCK_DEGRADED;
else if (*i == "stale")
stuck_types |= PGMap::STUCK_STALE;
+ else if (*i == "peering")
+ stuck_types |= PGMap::STUCK_PEERING;
else {
ds << "Unknown type: " << *i << std::endl;
return -EINVAL;
newstat->state |= PG_STATE_STALE;
newstat->last_unstale = ceph_clock_now();
}
+
+ if ((cur.state & PG_STATE_PEERING) == 0 &&
+ cur.acting_primary != -1 &&
+ osdmap.is_down(cur.acting_primary)) {
+ pg_stat_t *newstat;
+ auto q = pending_inc->pg_stat_updates.find(pgid);
+ if (q != pending_inc->pg_stat_updates.end()) {
+ if ((q->second.acting_primary == cur.acting_primary) ||
+ ((q->second.state & PG_STATE_PEERING) == 0 &&
+ q->second.acting_primary != -1 &&
+ osdmap.is_down(q->second.acting_primary))) {
+ newstat = &q->second;
+ } else {
+ // pending update is no longer down or already stale
+ return;
+ }
+ } else {
+ newstat = &pending_inc->pg_stat_updates[pgid];
+ *newstat = cur;
+ }
+ dout(10) << __func__ << " marking pg " << pgid
+ << " stale (acting_primary " << newstat->acting_primary
+ << ")" << dendl;
+ newstat->state |= PG_STATE_PEERING;
+ newstat->last_peered = ceph_clock_now();
+ }
+
}
void PGMapUpdater::check_down_pgs(
static const int STUCK_UNDERSIZED = (1<<2);
static const int STUCK_DEGRADED = (1<<3);
static const int STUCK_STALE = (1<<4);
-
+ static const int STUCK_PEERING = (1<<5);
+
PGMap()
: version(0),
last_osdmap_epoch(0), last_pg_scan(0)