while (log.complete_to->version <= info.last_complete)
log.complete_to++;
assert(log.complete_to != log.log.end());
- log.last_requested = eversion_t();
+ log.last_requested = 0;
dout(10) << "activate - complete_to = " << log.complete_to->version << dendl;
if (is_primary()) {
dout(10) << "activate - starting recovery" << dendl;
missing.add(soid, oi.version, eversion_t());
missing_loc[soid].insert(ok_peer);
- log.last_requested = eversion_t();
+ log.last_requested = 0;
}
osd->queue_for_recovery(this);
}
// new object.
//assert(missing.count(e.soid) == 0); // might already be missing divergent item.
if (missing.count(e.soid)) // already missing divergent item
- rmissing.erase(missing[e.soid].need);
+ rmissing.erase(missing[e.soid].need.version);
missing[e.soid] = item(e.version, eversion_t()); // .have = nil
} else if (missing.count(e.soid)) {
// already missing (prior).
//assert(missing[e.soid].need == e.prior_version);
- rmissing.erase(missing[e.soid].need);
+ rmissing.erase(missing[e.soid].need.version);
missing[e.soid].need = e.version; // leave .have unchanged.
} else {
// not missing, we must have prior_version (if any)
missing[e.soid] = item(e.version, e.prior_version);
}
- rmissing[e.version] = e.soid;
+ rmissing[e.version.version] = e.soid;
} else
rm(e.soid, e.version);
}
if (missing[e.soid].need >= e.version)
return; // already missing same or newer.
// missing older, revise need
- rmissing.erase(missing[e.soid].need);
+ rmissing.erase(missing[e.soid].need.version);
missing[e.soid].need = e.version;
} else
// not missing => have prior_version (if any)
missing[e.soid] = item(e.version, e.prior_version);
- rmissing[e.version] = e.soid;
+ rmissing[e.version.version] = e.soid;
} else
rm(e.soid, e.version);
}
void PG::Missing::revise_need(sobject_t oid, eversion_t need)
{
if (missing.count(oid)) {
- rmissing.erase(missing[oid].need);
+ rmissing.erase(missing[oid].need.version);
missing[oid].need = need; // no not adjust .have
} else {
missing[oid] = item(need, eversion_t());
}
- rmissing[need] = oid;
+ rmissing[need.version] = oid;
}
void PG::Missing::add(const sobject_t& oid, eversion_t need, eversion_t have)
{
missing[oid] = item(need, have);
- rmissing[need] = oid;
+ rmissing[need.version] = oid;
}
void PG::Missing::rm(const sobject_t& oid, eversion_t v)
{
if (missing.count(oid) && missing[oid].need <= v) {
- rmissing.erase(missing[oid].need);
+ rmissing.erase(missing[oid].need.version);
missing.erase(oid);
}
}
{
assert(missing.count(oid));
assert(missing[oid].need <= v);
- rmissing.erase(missing[oid].need);
+ rmissing.erase(missing[oid].need.version);
missing.erase(oid);
}
void PG::Missing::got(const std::map<sobject_t, Missing::item>::iterator &m)
{
- rmissing.erase(m->second.need);
+ rmissing.erase(m->second.need.version);
missing.erase(m);
}
// recovery pointers
list<Entry>::iterator complete_to; // not inclusive of referenced item
- eversion_t last_requested; // last object requested by primary
+ version_t last_requested; // last object requested by primary
/****/
IndexedLog() {}
}
void reset_recovery_pointers() {
complete_to = log.end();
- last_requested = eversion_t();
+ last_requested = 0;
}
bool logged_object(const sobject_t& oid) const {
WRITE_CLASS_ENCODER(item)
map<sobject_t, item> missing; // oid -> (need v, have v)
- map<eversion_t, sobject_t> rmissing; // v -> oid
+ map<version_t, sobject_t> rmissing; // v -> oid
unsigned int num_missing() const;
bool have_missing() const;
for (map<sobject_t,item>::iterator it = missing.begin();
it != missing.end();
++it)
- rmissing[it->second.need] = it->first;
+ rmissing[it->second.need.version] = it->first;
}
};
WRITE_CLASS_ENCODER(Missing)
pulling.erase(*i);
finish_recovery_op(*i);
}
- log.last_requested = eversion_t();
+ log.last_requested = 0;
pull_from_peer.erase(j++);
}
}
int started = 0;
int skipped = 0;
- map<eversion_t, sobject_t>::iterator p = missing.rmissing.lower_bound(log.last_requested);
+ map<version_t, sobject_t>::iterator p = missing.rmissing.lower_bound(log.last_requested);
while (p != missing.rmissing.end()) {
sobject_t soid;
- eversion_t v = p->first;
+ version_t v = p->first;
if (log.objects.count(p->second)) {
latest = log.objects[p->second];
// oldest first!
const Missing &m(pm->second);
- for (map<eversion_t, sobject_t>::const_iterator p = m.rmissing.begin();
+ for (map<version_t, sobject_t>::const_iterator p = m.rmissing.begin();
p != m.rmissing.end() && started < max;
++p) {
const sobject_t soid(p->second);
- eversion_t v = p->first;
+
if (pushing.count(soid)) {
dout(10) << __func__ << ": already pushing " << soid << dendl;
continue;
}
+
if (missing.is_missing(soid)) {
if (missing_loc.find(soid) == missing_loc.end())
dout(10) << __func__ << ": " << soid << " still unfound" << dendl;
}
dout(10) << __func__ << ": recover_object_replicas(" << soid << ")" << dendl;
- started += recover_object_replicas(soid, v);
+ map<sobject_t,Missing::item>::const_iterator p = m.missing.find(soid);
+ started += recover_object_replicas(soid, p->second.need);
}
}