From: Samuel Just Date: Thu, 7 Mar 2013 20:53:51 +0000 (-0800) Subject: PG: check_recovery_sources must happen even if not active X-Git-Tag: v0.60~78^2~18 X-Git-Url: http://git-server-git.apps.pok.os.sepia.ceph.com/?a=commitdiff_plain;h=de22b186c497ce151217aecf17a8d35cdbf549bb;p=ceph.git PG: check_recovery_sources must happen even if not active missing_loc/missing_loc_sources also must be cleaned up if a peer goes down during peering: 1) pg is in GetInfo, acting is [3,1] 2) we find object A on osd [0] in GetInfo 3) 0 goes down, no new peering interval since it is neither up nor acting, but peer_missing[0] is removed. 4) pg goes active and try to pull A from 0 since missing_loc did not get cleaned up. Backport: bobtail Fixes: #4371 Signed-off-by: Samuel Just Reviewed-by: Greg Farnum --- diff --git a/src/osd/PG.cc b/src/osd/PG.cc index 5230c73f70e0..bee5be2cc0be 100644 --- a/src/osd/PG.cc +++ b/src/osd/PG.cc @@ -5556,6 +5556,14 @@ PG::RecoveryState::Primary::Primary(my_context ctx) context< RecoveryMachine >().log_enter(state_name); } +boost::statechart::result PG::RecoveryState::Primary::react(const AdvMap &advmap) +{ + PG *pg = context< RecoveryMachine >().pg; + pg->remove_down_peer_info(advmap.osdmap); + pg->check_recovery_sources(advmap.osdmap); + return forward_event(); +} + boost::statechart::result PG::RecoveryState::Primary::react(const MNotifyRec& notevt) { dout(7) << "handle_pg_notify from osd." << notevt.from << dendl; @@ -6146,7 +6154,6 @@ boost::statechart::result PG::RecoveryState::Active::react(const AdvMap& advmap) pg->dirty_info = true; pg->dirty_big_info = true; } - pg->check_recovery_sources(pg->get_osdmap()); for (vector::iterator p = pg->want_acting.begin(); p != pg->want_acting.end(); ++p) { @@ -6826,8 +6833,6 @@ boost::statechart::result PG::RecoveryState::WaitActingChange::react(const AdvMa PG *pg = context< RecoveryMachine >().pg; OSDMapRef osdmap = advmap.osdmap; - pg->remove_down_peer_info(osdmap); - dout(10) << "verifying no want_acting " << pg->want_acting << " targets didn't go down" << dendl; for (vector::iterator p = pg->want_acting.begin(); p != pg->want_acting.end(); ++p) { if (!osdmap->is_up(*p)) { diff --git a/src/osd/PG.h b/src/osd/PG.h index 422c5437a8b2..2deb23233147 100644 --- a/src/osd/PG.h +++ b/src/osd/PG.h @@ -1363,8 +1363,10 @@ public: typedef boost::mpl::list < boost::statechart::custom_reaction< ActMap >, boost::statechart::custom_reaction< MNotifyRec >, - boost::statechart::transition< NeedActingChange, WaitActingChange > + boost::statechart::transition< NeedActingChange, WaitActingChange >, + boost::statechart::custom_reaction< AdvMap> > reactions; + boost::statechart::result react(const AdvMap&); boost::statechart::result react(const ActMap&); boost::statechart::result react(const MNotifyRec&); };