pg->set_role(0);
pg->acting.swap(acting);
+ pg->up = pg->acting;
pg->info.history.epoch_created =
pg->info.history.last_epoch_started =
pg->info.history.same_since =
PG *pg = it->second;
// get new acting set
- vector<int> tacting;
- int nrep = osdmap->pg_to_acting_osds(pgid, tacting);
- int role = osdmap->calc_pg_role(whoami, tacting, nrep);
+ vector<int> tup, tacting;
+ osdmap->pg_to_up_acting_osds(pgid, tup, tacting);
+ int role = osdmap->calc_pg_role(whoami, tacting, tacting.size());
pg->lock();
}
// no change?
- if (tacting == pg->acting && (pg->is_active() || !pg->prior_set_affected(osdmap))) {
- dout(15) << *pg << " unchanged|active with " << tacting << dendl;
+ if (tacting == pg->acting && tup == pg->up &&
+ (pg->is_active() || !pg->prior_set_affected(osdmap))) {
+ dout(15) << *pg << " unchanged|active with " << tup << "/" << tacting << " up/acting" << dendl;
pg->unlock();
continue;
}
int oldrole = pg->get_role();
int oldprimary = pg->get_primary();
vector<int> oldacting = pg->acting;
+ vector<int> oldup = pg->up;
pg->kick();
pg->clear_prior();
// update PG
pg->acting.swap(tacting);
+ pg->up.swap(tup);
pg->set_role(role);
// did acting, primary|acker change?
// remember past interval
PG::Interval& i = pg->past_intervals[pg->info.history.same_since];
i.acting = oldacting;
+ i.up = oldup;
i.first = pg->info.history.same_since;
i.last = osdmap->get_epoch() - 1;
if (i.acting.size())
}
// is it still ours?
- vector<int> acting;
- int nrep = osdmap->pg_to_acting_osds(on, acting);
- int role = osdmap->calc_pg_role(whoami, acting, nrep);
+ vector<int> up, acting;
+ osdmap->pg_to_up_acting_osds(on, up, acting);
+ int role = osdmap->calc_pg_role(whoami, acting, acting.size());
if (role != 0) {
dout(10) << "mkpg " << pgid << " not primary (role=" << role << "), skipping" << dendl;
continue;
}
+ if (up != acting) {
+ dout(10) << "mkpg " << pgid << " up " << up << " != acting " << acting << dendl;
+ stringstream ss;
+ ss << "mkpg " << pgid << " up " << up << " != acting " << acting;
+ logclient.log(LOG_ERROR, ss);
+ continue;
+ }
// does it already exist?
if (_have_pg(pgid)) {
if (!_have_pg(pgid)) {
// same primary?
- vector<int> acting;
- int nrep = osdmap->pg_to_acting_osds(pgid, acting);
- int role = osdmap->calc_pg_role(whoami, acting, nrep);
+ vector<int> up, acting;
+ osdmap->pg_to_up_acting_osds(pgid, up, acting);
+ int role = osdmap->calc_pg_role(whoami, acting, acting.size());
PG::Info::History history = it->history;
project_pg_history(pgid, history, m->get_epoch(), acting);
if (!pg) {
pg = _create_lock_pg(pgid, t);
pg->acting.swap(acting);
+ pg->up.swap(up);
pg->set_role(role);
pg->info.history = history;
pg->clear_primary_state(); // yep, notably, set hml=false
PG *pg = 0;
if (!_have_pg(info.pgid)) {
- vector<int> acting;
- int nrep = osdmap->pg_to_acting_osds(info.pgid, acting);
- int role = osdmap->calc_pg_role(whoami, acting, nrep);
+ vector<int> up, acting;
+ osdmap->pg_to_up_acting_osds(info.pgid, up, acting);
+ int role = osdmap->calc_pg_role(whoami, acting, acting.size());
project_pg_history(info.pgid, info.history, epoch, acting);
if (epoch < info.history.same_since) {
pg = _create_lock_pg(info.pgid, t);
dout(10) << " got info on new pg, creating" << dendl;
pg->acting.swap(acting);
+ pg->up.swap(up);
pg->set_role(role);
pg->info.history = info.history;
pg->write_info(t);
if (pg_map.count(pgid) == 0) {
// get active crush mapping
- vector<int> acting;
- int nrep = osdmap->pg_to_acting_osds(pgid, acting);
- int role = osdmap->calc_pg_role(whoami, acting, nrep);
+ vector<int> up, acting;
+ osdmap->pg_to_up_acting_osds(pgid, up, acting);
+ int role = osdmap->calc_pg_role(whoami, acting, acting.size());
// same primary?
PG::Info::History history = it->second.history;
ObjectStore::Transaction t;
pg = _create_lock_pg(pgid, t);
pg->acting.swap( acting );
+ pg->up.swap( up );
pg->set_role(role);
pg->info.history = history;
pg->write_info(t);
public:
struct Interval {
- vector<int> acting;
+ vector<int> up, acting;
epoch_t first, last;
bool maybe_went_rw;
void encode(bufferlist& bl) const {
::encode(first, bl);
::encode(last, bl);
+ ::encode(up, bl);
::encode(acting, bl);
::encode(maybe_went_rw, bl);
}
void decode(bufferlist::iterator& bl) {
::decode(first, bl);
::decode(last, bl);
+ ::decode(up, bl);
::decode(acting, bl);
::decode(maybe_went_rw, bl);
}
// primary state
public:
- vector<int> acting;
+ vector<int> up, acting;
map<int,eversion_t> peer_last_complete_ondisk;
eversion_t min_last_complete_ondisk; // min over last_complete_ondisk, peer_last_complete_ondisk
eversion_t pg_trim_to;
inline ostream& operator<<(ostream& out, const PG& pg)
{
out << "pg[" << pg.info
- << " r=" << pg.get_role();
+ << " " << pg.acting;
+ out << " r=" << pg.get_role();
+ if (pg.acting != pg.up)
+ out << " up=" << pg.up;
if (pg.recovery_ops_active)
out << " rops=" << pg.recovery_ops_active;