return true;
}
- // did primary's up_thru change?
- if (acting.size() && prior_set_down.size() &&
- prior_set_primary_up_thru != osdmap->get_up_thru(acting[0])) {
- dout(10) << "prior_set_affected: primary osd" << acting[0]
- << " up_thru " << prior_set_primary_up_thru
- << " -> " << osdmap->get_up_thru(acting[0])
- << dendl;
- return true;
- }
+ // did a significant osd's up_thru change?
+ for (map<int,epoch_t>::iterator p = prior_set_up_thru.begin();
+ p != prior_set_up_thru.end();
+ p++)
+ if (p->second != osdmap->get_up_thru(p->first)) {
+ dout(10) << "prior_set_affected: primary osd" << p->first
+ << " up_thru " << p->second
+ << " -> " << osdmap->get_up_thru(p->first)
+ << dendl;
+ return true;
+ }
return false;
}
// build prior set.
prior_set.clear();
prior_set_down.clear();
+ prior_set_up_thru.clear();
// current nodes, of course.
for (unsigned i=1; i<acting.size(); i++)
continue;
}
- prior_set_primary_up_thru = lastmap->get_up_thru(acting[0]);
bool maybe_went_rw =
- prior_set_primary_up_thru >= first_epoch &&
- prior_set_primary_up_thru < first_epoch;
+ lastmap->get_up_thru(acting[0]) >= first_epoch &&
+ lastmap->get_up_from(acting[0]) < first_epoch;
dout(10) << "build_prior epochs " << first_epoch << "-" << last_epoch << " " << acting
<< " - primary osd" << acting[0]
dout(10) << "build_prior prior osd" << acting[i] << " is down, must notify mon" << dendl;
must_notify_mon = true;
+ // include osd in set anyway
prior_set_down.insert(acting[i]);
// fixme: how do we identify a "clean" shutdown anyway?
<< (lastmap->get_up_thru(acting[i]) + 1) << dendl;
some_down = true;
prior_set.insert(acting[i]);
+
+ // take note that we care about this osd's up_thru. if it
+ // changes later, it will affect our prior_set, and we'll want
+ // to rebuild the prior set!
+ prior_set_up_thru[acting[0]] = lastmap->get_up_thru(acting[0]);
}
}
}
have_master_log = false;
prior_set.clear();
prior_set_down.clear();
- prior_set_primary_up_thru = 0;
+ prior_set_up_thru.clear();
stray_set.clear();
uptodate_set.clear();
peer_info_requested.clear();
bool have_master_log;
protected:
set<int> prior_set; // current+prior OSDs, as defined by info.history.last_epoch_started.
- set<int> prior_set_down;
- epoch_t prior_set_primary_up_thru;
+ set<int> prior_set_down; // down osds exluded from prior_set
+ map<int,epoch_t> prior_set_up_thru; // osds whose up_thru we care about
bool must_notify_mon;
set<int> stray_set; // non-acting osds that have PG data.
set<int> uptodate_set; // current OSDs that are uptodate