]> git-server-git.apps.pok.os.sepia.ceph.com Git - ceph.git/commitdiff
osd/PeeringState: notice 'dead' prior_readable OSDs
authorSage Weil <sage@redhat.com>
Mon, 15 Jul 2019 21:14:14 +0000 (16:14 -0500)
committerSage Weil <sage@redhat.com>
Sat, 28 Sep 2019 16:51:18 +0000 (11:51 -0500)
If we see that a prior_readable_down_osd is known to be dead, we can
remove it from the set.  And if the set is empty, we can skip the rest of
our waiting period and leave the WAIT state.

Signed-off-by: Sage Weil <sage@redhat.com>
src/osd/PeeringState.cc
src/osd/PeeringState.h

index a01c7bedd2942408621a28685836a244560f3878..44fac7b54c5ebde2ceba04da528f74cf087509a4 100644 (file)
@@ -1206,6 +1206,29 @@ void PeeringState::recalc_readable_until()
   dout(20) << __func__ << " readable_until[_ub] " << readable_until << dendl;
 }
 
+bool PeeringState::check_prior_readable_down_osds(const OSDMapRef& map)
+{
+  bool changed = false;
+  auto p = prior_readable_down_osds.begin();
+  while (p != prior_readable_down_osds.end()) {
+    if (map->is_dead(*p)) {
+      dout(10) << __func__ << " prior_readable_down_osds osd." << *p
+              << " is dead as of epoch " << map->get_epoch()
+              << dendl;
+      p = prior_readable_down_osds.erase(p);
+      changed = true;
+    } else {
+      ++p;
+    }
+  }
+  if (changed && prior_readable_down_osds.empty()) {
+    psdout(10) << " empty prior_readable_down_osds, clearing ub" << dendl;
+    clear_prior_readable_until_ub();
+    return true;
+  }
+  return false;
+}
+
 bool PeeringState::adjust_need_up_thru(const OSDMapRef osdmap)
 {
   epoch_t up_thru = osdmap->get_up_thru(pg_whoami.osd);
@@ -4490,6 +4513,7 @@ boost::statechart::result PeeringState::Peering::react(const AdvMap& advmap)
   }
 
   ps->adjust_need_up_thru(advmap.osdmap);
+  ps->check_prior_readable_down_osds(advmap.osdmap);
 
   return forward_event();
 }
@@ -5525,6 +5549,10 @@ boost::statechart::result PeeringState::Active::react(const AdvMap& advmap)
   if (need_publish)
     pl->publish_stats_to_osd();
 
+  if (ps->check_prior_readable_down_osds(advmap.osdmap)) {
+    pl->recheck_readable();
+  }
+
   return forward_event();
 }
 
@@ -6244,6 +6272,8 @@ void PeeringState::GetInfo::get_infos()
     }
   }
 
+  ps->check_prior_readable_down_osds(ps->get_osdmap());
+
   pl->publish_stats_to_osd();
 }
 
index 45d49fcae31599e981f167c40c95223d4e89e547..f5752c02b4fd8a3c9e5c46e3225bfc8a33271b85 100644 (file)
@@ -1496,6 +1496,8 @@ public:
   /// get priority for pg deletion
   unsigned get_delete_priority();
 
+  bool check_prior_readable_down_osds(const OSDMapRef& map);
+
   bool adjust_need_up_thru(const OSDMapRef osdmap);
   PastIntervals::PriorSet build_prior();