_remove_nonexistent_osds(pool, *osds);
- *primary = (osds->empty() ? -1 : osds->front());
+ *primary = -1;
+ for (unsigned i = 0; i < osds->size(); ++i) {
+ if ((*osds)[i] != CRUSH_ITEM_NONE) {
+ *primary = (*osds)[i];
+ break;
+ }
+ }
if (ppps)
*ppps = pps;
temp_pg->clear();
if (p != pg_temp->end()) {
for (unsigned i=0; i<p->second.size(); i++) {
- if (!exists(p->second[i]) || is_down(p->second[i]))
- continue;
- temp_pg->push_back(p->second[i]);
+ if (!exists(p->second[i]) || is_down(p->second[i])) {
+ if (pool.can_shift_osds()) {
+ continue;
+ } else {
+ temp_pg->push_back(CRUSH_ITEM_NONE);
+ }
+ } else {
+ temp_pg->push_back(p->second[i]);
+ }
}
}
map<pg_t,int>::const_iterator pp = primary_temp->find(pg);
*temp_primary = -1;
- if (pp != primary_temp->end())
+ if (pp != primary_temp->end()) {
*temp_primary = pp->second;
- else if (!temp_pg->empty()) // apply pg_temp's primary
- *temp_primary = temp_pg->front();
+ } else if (!temp_pg->empty()) { // apply pg_temp's primary
+ for (unsigned i = 0; i < temp_pg->size(); ++i) {
+ if ((*temp_pg)[i] != CRUSH_ITEM_NONE) {
+ *temp_primary = (*temp_pg)[i];
+ break;
+ }
+ }
+ }
}
int OSDMap::pg_to_osds(pg_t pg, vector<int> *raw, int *primary) const
void pg_to_up_acting_osds(pg_t pg, vector<int>& up, vector<int>& acting) const {
int up_primary, acting_primary;
pg_to_up_acting_osds(pg, &up, &up_primary, &acting, &acting_primary);
- assert(up.empty() || up_primary == up.front());
- assert(acting.empty() || acting_primary == acting.front());
}
bool pg_is_ec(pg_t pg) const {
map<int64_t, pg_pool_t>::const_iterator i = pools.find(pg.pool());