summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSamuel Just <sam.just@inktank.com>2013-03-07 12:53:51 -0800
committerSamuel Just <sam.just@inktank.com>2013-03-15 12:09:09 -0700
commita30903c6adaa023587d3147179d6038ad37ca520 (patch)
tree414dcdaf5e46f18c8dab70dabdb8b106555ddc83
parent19f6df28337307ce6d8617524f88f222c0ffcab3 (diff)
downloadceph-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.cc11
-rw-r--r--src/osd/PG.h4
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&);
};