}
build_might_have_unfound();
+
+ state_set(PG_STATE_DEGRADED);
}
// degraded?
- if (get_osdmap()->get_pg_size(info.pgid.pgid) > acting.size())
+ if (get_osdmap()->get_pg_size(info.pgid.pgid) > acting.size()) {
state_set(PG_STATE_DEGRADED);
-
+ state_set(PG_STATE_UNDERSIZED);
+ }
}
}
{
// a higher value -> a higher priority
- // degraded: 200 + num missing replicas
- if (is_degraded()) {
+ // undersized: 200 + num missing replicas
+ if (is_undersized()) {
assert(pool.info.size > acting.size());
return 200 + (pool.info.size - acting.size());
}
+ // degraded: baseline degraded
+ if (is_degraded()) {
+ return 200;
+ }
+
// baseline
return 1;
}
info.stats.stats.calc_copies(MAX(target, actingbackfill.size()));
info.stats.stats.sum.num_objects_degraded = 0;
info.stats.stats.sum.num_objects_misplaced = 0;
- if ((is_degraded() || !is_clean()) && is_active()) {
+ if ((is_degraded() || is_undersized() || !is_clean()) && is_active()) {
// NOTE: we only generate copies, degraded, unfound values for
// the summation, not individual stat categories.
uint64_t num_objects = info.stats.stats.sum.num_objects;
PG *pg = context< RecoveryMachine >().pg;
pg->osd->local_reserver.cancel_reservation(pg->info.pgid);
+ assert(!pg->needs_recovery());
+
// if we finished backfill, all acting are active; recheck if
- // DEGRADED is appropriate.
+ // DEGRADED | UNDERSIZED is appropriate.
assert(!pg->actingbackfill.empty());
if (pg->get_osdmap()->get_pg_size(pg->info.pgid.pgid) <=
pg->actingbackfill.size())
if (pg->acting != pg->up && !pg->choose_acting(auth_log_shard))
assert(pg->want_acting.size());
- assert(!pg->needs_recovery());
-
if (context< Active >().all_replicas_activated)
post_event(GoClean());
}
* this does not matter) */
if (advmap.lastmap->get_pg_size(pg->info.pgid.pgid) !=
pg->get_osdmap()->get_pg_size(pg->info.pgid.pgid)) {
- if (pg->get_osdmap()->get_pg_size(pg->info.pgid.pgid) <= pg->acting.size())
- pg->state_clear(PG_STATE_DEGRADED);
- else
+ if (pg->get_osdmap()->get_pg_size(pg->info.pgid.pgid) <= pg->acting.size()) {
+ pg->state_clear(PG_STATE_UNDERSIZED);
+ if (pg->needs_recovery()) {
+ pg->state_set(PG_STATE_DEGRADED);
+ } else {
+ pg->state_clear(PG_STATE_DEGRADED);
+ }
+ } else {
+ pg->state_set(PG_STATE_UNDERSIZED);
pg->state_set(PG_STATE_DEGRADED);
+ }
pg->publish_stats_to_osd(); // degraded may have changed
}
pg->backfill_reserved = false;
pg->backfill_reserving = false;
pg->state_clear(PG_STATE_DEGRADED);
+ pg->state_clear(PG_STATE_UNDERSIZED);
pg->state_clear(PG_STATE_BACKFILL_TOOFULL);
pg->state_clear(PG_STATE_BACKFILL_WAIT);
pg->state_clear(PG_STATE_RECOVERY_WAIT);