scrubber.is_chunky = true;
assert(backfill_targets.empty());
for (unsigned i=1; i<acting.size(); i++) {
+ if (acting[i] == CRUSH_ITEM_NONE)
+ continue;
ConnectionRef con = osd->get_con_osd_cluster(acting[i], get_osdmap()->get_epoch());
if (!con)
continue;
// consider ACTING osds
for (unsigned i=0; i<interval.acting.size(); i++) {
int o = interval.acting[i];
+ if (o == CRUSH_ITEM_NONE)
+ continue;
const osd_info_t *pinfo = 0;
if (osdmap->exists(o))
bool any_down_now = false;
for (unsigned i=0; i<interval.acting.size(); i++) {
int o = interval.acting[i];
+ if (o == CRUSH_ITEM_NONE)
+ continue;
pg_shard_t so(o, pg->pool.info.ec_pool() ? i : ghobject_t::NO_SHARD);
if (!osdmap->exists(o) || osdmap->get_info(o).lost_at > interval.first)
continue; // dne or lost
// but because we want their pg_info to inform choose_acting(), and
// so that we know what they do/do not have explicitly before
// sending them any new info/logs/whatever.
- for (unsigned i=0; i<acting.size(); i++)
- probe.insert(pg_shard_t(acting[i], ec_pool ? i : ghobject_t::NO_SHARD));
+ for (unsigned i=0; i<acting.size(); i++) {
+ if (acting[i] != CRUSH_ITEM_NONE)
+ probe.insert(pg_shard_t(acting[i], ec_pool ? i : ghobject_t::NO_SHARD));
+ }
// It may be possible to exlude the up nodes, but let's keep them in
// there for now.
- for (unsigned i=0; i<up.size(); i++)
- probe.insert(pg_shard_t(up[i], ec_pool ? i : ghobject_t::NO_SHARD));
+ for (unsigned i=0; i<up.size(); i++) {
+ if (up[i] != CRUSH_ITEM_NONE)
+ probe.insert(pg_shard_t(up[i], ec_pool ? i : ghobject_t::NO_SHARD));
+ }
for (map<epoch_t,pg_interval_t>::const_reverse_iterator p = past_intervals.rbegin();
p != past_intervals.rend();
// consider ACTING osds
for (unsigned i=0; i<interval.acting.size(); i++) {
int o = interval.acting[i];
+ if (o == CRUSH_ITEM_NONE)
+ continue;
pg_shard_t so(o, ec_pool ? i : ghobject_t::NO_SHARD);
const osd_info_t *pinfo = 0;