]> git.apps.os.sepia.ceph.com Git - ceph-ci.git/commitdiff
osd: Base pg degraded state on num_degraded_objects
authorDavid Zafman <dzafman@redhat.com>
Thu, 26 Oct 2017 04:44:14 +0000 (21:44 -0700)
committerDavid Zafman <dzafman@redhat.com>
Sun, 14 Jan 2018 18:38:17 +0000 (10:38 -0800)
Signed-off-by: David Zafman <dzafman@redhat.com>
src/osd/PG.cc

index e4aa8e1882392b3ea204c05f5948d3a6de4fb092..0d9b3c8e144dcd6c9bd1dabc06d8f67621b8addb 100644 (file)
@@ -1885,17 +1885,13 @@ void PG::activate(ObjectStore::Transaction& t,
 
       build_might_have_unfound();
 
-      // XXX: Has _update_calc_stats() run?  If so, base on num_objects_degraded?
-      state_set(PG_STATE_DEGRADED);
       if (have_unfound())
        discover_all_missing(query_map);
     }
 
-    // degraded?
     // num_objects_degraded if calculated should reflect this too, unless no
     // missing and we are about to go clean.
     if (get_osdmap()->get_pg_size(info.pgid.pgid) > actingset.size()) {
-      state_set(PG_STATE_DEGRADED);
       state_set(PG_STATE_UNDERSIZED);
     }
 
@@ -2018,6 +2014,11 @@ void PG::all_activated_and_committed()
   assert(!actingbackfill.empty());
   assert(blocked_by.empty());
 
+  // Degraded?
+  _update_calc_stats();
+  if (info.stats.stats.sum.num_objects_degraded)
+    state_set(PG_STATE_DEGRADED);
+
   queue_peering_event(
     PGPeeringEventRef(
       std::make_shared<PGPeeringEvent>(
@@ -2692,7 +2693,7 @@ void PG::_update_calc_stats()
   info.stats.stats.sum.num_objects_degraded = 0;
   info.stats.stats.sum.num_objects_unfound = 0;
   info.stats.stats.sum.num_objects_misplaced = 0;
-  if (!is_clean() && is_peered()) {
+  if (!is_clean() && (is_peered() || is_activating())) {
     dout(20) << __func__ << " not clean" << dendl;
 
     assert(!actingbackfill.empty());
@@ -7081,6 +7082,8 @@ PG::RecoveryState::Recovering::react(const RequestBackfill &evt)
   pg->state_clear(PG_STATE_FORCED_RECOVERY);
   release_reservations();
   pg->osd->local_reserver.cancel_reservation(pg->info.pgid);
+  // XXX: Is this needed?
+  pg->publish_stats_to_osd();
   return transit<WaitLocalBackfillReserved>();
 }
 
@@ -7363,23 +7366,26 @@ boost::statechart::result PG::RecoveryState::Active::react(const AdvMap& advmap)
   }
 
   bool need_publish = false;
+  pg->_update_calc_stats(); // Too bad this is called again from publish_stats_to_osd()
+  int64_t degraded = pg->info.stats.stats.sum.num_objects_degraded;
+  if (!pg->state_test(PG_STATE_DEGRADED) && degraded) {
+    need_publish = true;
+    pg->state_set(PG_STATE_DEGRADED);
+  } else if (pg->state_test(PG_STATE_DEGRADED) && !degraded) {
+    need_publish = true;
+    pg->state_clear(PG_STATE_DEGRADED);
+  }
+
   /* 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.pgid) !=
       pg->get_osdmap()->get_pg_size(pg->info.pgid.pgid)) {
     if (pg->get_osdmap()->get_pg_size(pg->info.pgid.pgid) <= pg->actingset.size()) {
       pg->state_clear(PG_STATE_UNDERSIZED);
-      // XXX: Base this on num_objects_degraded instead?
-      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);
     }
-    need_publish = true; // degraded may have changed
+    need_publish = true; // undersized may have changed
   }
 
   // if we haven't reported our PG stats in a long time, do so now.