peer_missing[from].swap(omissing);
}
-bool PG::proc_replica_info(pg_shard_t from, const pg_info_t &oinfo)
+bool PG::proc_replica_info(
+ pg_shard_t from, const pg_info_t &oinfo, epoch_t send_epoch)
{
map<pg_shard_t, pg_info_t>::iterator p = peer_info.find(from);
if (p != peer_info.end() && p->second.last_update == oinfo.last_update) {
return false;
}
+ if (!get_osdmap()->has_been_up_since(from.osd, send_epoch)) {
+ dout(10) << " got info " << oinfo << " from down osd." << from
+ << " discarding" << dendl;
+ return false;
+ }
+
dout(10) << " got osd." << from << " " << oinfo << dendl;
assert(is_primary());
peer_info[from] = oinfo;
boost::statechart::result PG::RecoveryState::Initial::react(const MNotifyRec& notify)
{
PG *pg = context< RecoveryMachine >().pg;
- pg->proc_replica_info(notify.from, notify.notify.info);
+ pg->proc_replica_info(
+ notify.from, notify.notify.info, notify.notify.epoch_sent);
pg->update_heartbeat_peers();
pg->set_last_peering_reset();
return transit< Primary >();
dout(10) << *pg << " got dup osd." << notevt.from << " info " << notevt.notify.info
<< ", identical to ours" << dendl;
} else {
- pg->proc_replica_info(notevt.from, notevt.notify.info);
+ pg->proc_replica_info(
+ notevt.from, notevt.notify.info, notevt.notify.epoch_sent);
}
return discard_event();
}
dout(10) << "Active: got notify from " << notevt.from
<< ", calling proc_replica_info and discover_all_missing"
<< dendl;
- pg->proc_replica_info(notevt.from, notevt.notify.info);
+ pg->proc_replica_info(
+ notevt.from, notevt.notify.info, notevt.notify.epoch_sent);
if (pg->have_unfound()) {
pg->discover_all_missing(*context< RecoveryMachine >().get_query_map());
}
}
epoch_t old_start = pg->info.history.last_epoch_started;
- if (pg->proc_replica_info(infoevt.from, infoevt.notify.info)) {
+ if (pg->proc_replica_info(
+ infoevt.from, infoevt.notify.info, infoevt.notify.epoch_sent)) {
// we got something new ...
unique_ptr<PriorSet> &prior_set = context< Peering >().prior_set;
if (old_start < pg->info.history.last_epoch_started) {
<< ", identical to ours" << dendl;
return discard_event();
} else {
- pg->proc_replica_info(notevt.from, notevt.notify.info);
+ pg->proc_replica_info(
+ notevt.from, notevt.notify.info, notevt.notify.epoch_sent);
// try again!
return transit< GetLog >();
}
pg_missing_t& omissing, pg_shard_t from);
void proc_master_log(ObjectStore::Transaction& t, pg_info_t &oinfo, pg_log_t &olog,
pg_missing_t& omissing, pg_shard_t from);
- bool proc_replica_info(pg_shard_t from, const pg_info_t &info);
+ bool proc_replica_info(
+ pg_shard_t from, const pg_info_t &info, epoch_t send_epoch);
struct LogEntryTrimmer : public ObjectModDesc::Visitor {