From: Sage Weil Date: Mon, 15 Jul 2019 21:14:14 +0000 (-0500) Subject: osd/PeeringState: notice 'dead' prior_readable OSDs X-Git-Tag: v15.1.0~1379^2~9 X-Git-Url: http://git-server-git.apps.pok.os.sepia.ceph.com/?a=commitdiff_plain;h=e2d95c4ece9e3617e5610dee4a95ea9437fa6110;p=ceph.git osd/PeeringState: notice 'dead' prior_readable OSDs 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 --- diff --git a/src/osd/PeeringState.cc b/src/osd/PeeringState.cc index a01c7bedd294..44fac7b54c5e 100644 --- a/src/osd/PeeringState.cc +++ b/src/osd/PeeringState.cc @@ -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(); } diff --git a/src/osd/PeeringState.h b/src/osd/PeeringState.h index 45d49fcae315..f5752c02b4fd 100644 --- a/src/osd/PeeringState.h +++ b/src/osd/PeeringState.h @@ -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();