diff options
author | Samuel Just <sam.just@inktank.com> | 2013-03-07 12:53:51 -0800 |
---|---|---|
committer | Samuel Just <sam.just@inktank.com> | 2013-03-15 12:09:09 -0700 |
commit | a30903c6adaa023587d3147179d6038ad37ca520 (patch) | |
tree | 414dcdaf5e46f18c8dab70dabdb8b106555ddc83 | |
parent | 19f6df28337307ce6d8617524f88f222c0ffcab3 (diff) | |
download | ceph-a30903c6adaa023587d3147179d6038ad37ca520.tar.gz |
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 <sam.just@inktank.com>
Reviewed-by: Greg Farnum <greg@inktank.com>
(cherry picked from commit de22b186c497ce151217aecf17a8d35cdbf549bb)
-rw-r--r-- | src/osd/PG.cc | 11 | ||||
-rw-r--r-- | src/osd/PG.h | 4 |
2 files changed, 11 insertions, 4 deletions
diff --git a/src/osd/PG.cc b/src/osd/PG.cc index ae79cb03a28..1d90399b28c 100644 --- a/src/osd/PG.cc +++ b/src/osd/PG.cc @@ -5393,6 +5393,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; @@ -5982,7 +5990,6 @@ boost::statechart::result PG::RecoveryState::Active::react(const AdvMap& advmap) dout(10) << *pg << " snap_trimq now " << pg->snap_trimq << dendl; pg->dirty_info = true; } - pg->check_recovery_sources(pg->get_osdmap()); for (vector<int>::iterator p = pg->want_acting.begin(); p != pg->want_acting.end(); ++p) { @@ -6647,8 +6654,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<int>::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 0265972b752..8b76c2d7b47 100644 --- a/src/osd/PG.h +++ b/src/osd/PG.h @@ -1342,8 +1342,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&); }; |