From: Samuel Just Date: Mon, 7 Jan 2013 23:02:34 +0000 (-0800) Subject: PG: set DEGRADED in Active AdvMap handler based on pool size X-Git-Tag: v0.57~231^2~3 X-Git-Url: http://git-server-git.apps.pok.os.sepia.ceph.com/?a=commitdiff_plain;h=f83fcf63a928fdb8ab4d604bdce596c0c4afd854;p=ceph.git PG: set DEGRADED in Active AdvMap handler based on pool size Otherwise, if the acting set does not change, the pg might not show up as degraded if the pool size now exceeds the acting set size. Signed-off-by: Samuel Just Reviewed-by: Sage Weil --- diff --git a/src/osd/PG.cc b/src/osd/PG.cc index fc331b5482b8..6dcd23cb9390 100644 --- a/src/osd/PG.cc +++ b/src/osd/PG.cc @@ -2204,7 +2204,7 @@ void PG::update_stats() unsigned target = MAX(get_osdmap()->get_pg_size(info.pgid), acting.size()); pg_stats_stable.stats.calc_copies(target); pg_stats_stable.stats.sum.num_objects_degraded = 0; - if (!is_clean() && is_active()) { + if ((is_degraded() || !is_clean()) && is_active()) { // NOTE: we only generate copies, degraded, unfound values for // the summation, not individual stat categories. uint64_t num_objects = pg_stats_stable.stats.sum.num_objects; @@ -5904,6 +5904,20 @@ boost::statechart::result PG::RecoveryState::Active::react(const AdvMap& advmap) pg->up.end())); } } + + /* Check for changes in pool size (if the acting set changed as a result, + * this does not matter) */ + if (advmap.lastmap->get_pg_size(pg->info.pgid) != + pg->get_osdmap()->get_pg_size(pg->info.pgid)) { + unsigned active = pg->acting.size(); + if (pg->backfill_target != -1) + --active; + if (pg->get_osdmap()->get_pg_size(pg->info.pgid) <= active) + pg->state_clear(PG_STATE_DEGRADED); + else + pg->state_set(PG_STATE_DEGRADED); + pg->update_stats(); // degraded may have changed + } return forward_event(); }