coll(p), pg_log(cct), log_oid(loid), biginfo_oid(ioid),
recovery_item(this), scrub_item(this), scrub_finalize_item(this), snap_trim_item(this), stat_queue_item(this),
recovery_ops_active(0),
- waiting_on_backfill(0),
role(0),
state(0),
send_notify(false),
bool ret = false;
// We can assume that only possible osds that need backfill
- // are on the backfill_targets vector.
+ // are on the backfill_targets vector nodes.
vector<int>::const_iterator end = backfill_targets.end();
vector<int>::const_iterator a = backfill_targets.begin();
for (; a != end; ++a) {
backfill_targets.clear();
backfill_info.clear();
peer_backfill_info.clear();
- waiting_on_backfill = false;
+ waiting_on_backfill.clear();
_clear_recovery_state(); // pg impl specific hook
}
* (if they have one) */
xlist<PG*>::item recovery_item, scrub_item, scrub_finalize_item, snap_trim_item, stat_queue_item;
int recovery_ops_active;
- bool waiting_on_backfill;
+ set<int> waiting_on_backfill;
#ifdef DEBUG_RECOVERY_OIDS
set<hobject_t> recovering_oids;
#endif
int from = m->get_source().num();
//XXX: Check that from is in backfill_targets vector
//assert(from == get_backfill_target());
+ //XXX: Store per "from" peer
BackfillInterval& bi = peer_backfill_info;
bi.begin = m->begin;
bi.end = m->end;
}
}
- assert(waiting_on_backfill);
- waiting_on_backfill = false;
+ assert(waiting_on_backfill.find(from) != waiting_on_backfill.end());
+ waiting_on_backfill.erase(from);
+ //XXX: Should we wait for waiting_on_backfill == 0?
finish_recovery_op(bi.begin);
}
break;
state_test(PG_STATE_BACKFILL) &&
!backfill_targets.empty() && started < max &&
missing.num_missing() == 0 &&
- !waiting_on_backfill) {
+ waiting_on_backfill.find(backfill_targets[0]) == waiting_on_backfill.end()) {
if (get_osdmap()->test_flag(CEPH_OSDMAP_NOBACKFILL)) {
dout(10) << "deferring backfill due to NOBACKFILL" << dendl;
deferred_backfill = true;
MOSDPGScan *m = new MOSDPGScan(MOSDPGScan::OP_SCAN_GET_DIGEST, e, e, info.pgid,
pbi.end, hobject_t());
osd->send_message_osd_cluster(backfill_targets[0], m, get_osdmap()->get_epoch());
- waiting_on_backfill = true;
+ assert(waiting_on_backfill.find(backfill_targets[0]) == waiting_on_backfill.end());
+ waiting_on_backfill.insert(backfill_targets[0]);
start_recovery_op(pbi.end);
ops++;
break;
p != backfill_targets.end(); ++p)
f->dump_int("osd", *p);
f->close_section();
- f->dump_int("waiting_on_backfill", waiting_on_backfill);
+ f->open_array_section("waiting_on_backfill");
+ for (set<int>::const_iterator p = waiting_on_backfill.begin();
+ p != waiting_on_backfill.end(); ++p)
+ f->dump_int("osd", *p);
+ f->close_section();
f->dump_stream("last_backfill_started") << last_backfill_started;
{
f->open_object_section("backfill_info");