9334 |
9334 |
r = pgbackend->objects_get_attr(oid.get_head(), SS_ATTR, &bv);
|
9335 |
9335 |
if (r < 0) {
|
9336 |
9336 |
// try _snapset
|
9337 |
|
if (!(oid.is_snapdir() && !oid_existed))
|
9338 |
|
r = pgbackend->objects_get_attr(oid.get_snapdir(), SS_ATTR, &bv);
|
|
9337 |
if (!(oid.is_snapdir() && !oid_existed))
|
|
9338 |
r = pgbackend->objects_get_attr(oid.get_snapdir(), SS_ATTR, &bv);
|
9339 |
9339 |
if (r < 0 && !can_create)
|
9340 |
9340 |
return NULL;
|
9341 |
9341 |
}
|
... | ... | |
9598 |
9598 |
obc->drop_recovery_read(&blocked_ops);
|
9599 |
9599 |
requeue_ops(blocked_ops);
|
9600 |
9600 |
}
|
9601 |
|
recovering.erase(soid);
|
9602 |
|
for (list<pg_shard_t>::const_iterator i = from.begin(); i != from.end(); i++)
|
|
9601 |
if (missing_loc.get_locations(soid).empty()) {
|
|
9602 |
dout(20) << __func__ << ": " << soid
|
|
9603 |
<< " had an empty location list, reconstructing" << dendl;
|
|
9604 |
assert(!actingbackfill.empty());
|
|
9605 |
for (set<pg_shard_t>::iterator i = actingbackfill.begin();
|
|
9606 |
i != actingbackfill.end(); ++i) {
|
|
9607 |
pg_shard_t peer = *i;
|
|
9608 |
if (!peer_missing[peer].is_missing(soid)) {
|
|
9609 |
missing_loc.add_location(soid, peer);
|
|
9610 |
dout(20) << __func__ << ": " << soid
|
|
9611 |
<< " assumed to be available in " << peer << dendl;
|
|
9612 |
}
|
|
9613 |
}
|
|
9614 |
}
|
|
9615 |
for (list<pg_shard_t>::const_iterator i = from.begin();
|
|
9616 |
i != from.end(); i++) {
|
|
9617 |
dout(20) << __func__ << ": " << soid
|
|
9618 |
<< " marked as not available in " << *i
|
|
9619 |
<< dendl;
|
9603 |
9620 |
missing_loc.remove_location(soid, *i);
|
|
9621 |
}
|
|
9622 |
recovering.erase(soid);
|
9604 |
9623 |
dout(0) << "_failed_push " << soid << " from shard " << from
|
9605 |
9624 |
<< ", reps on " << missing_loc.get_locations(soid)
|
9606 |
9625 |
<< " unfound? " << missing_loc.is_unfound(soid) << dendl;
|
... | ... | |
10739 |
10758 |
handle.reset_tp_timeout();
|
10740 |
10759 |
const hobject_t soid(p->second);
|
10741 |
10760 |
|
10742 |
|
if (cmp(soid, pi->second.last_backfill, get_sort_bitwise()) > 0) {
|
10743 |
|
if (!recovering.count(soid)) {
|
10744 |
|
derr << __func__ << ": object added to missing set for backfill, but "
|
10745 |
|
<< "is not in recovering, error!" << dendl;
|
10746 |
|
assert(0);
|
10747 |
|
}
|
10748 |
|
continue;
|
10749 |
|
}
|
10750 |
|
|
10751 |
10761 |
if (recovering.count(soid)) {
|
10752 |
10762 |
dout(10) << __func__ << ": already recovering " << soid << dendl;
|
10753 |
10763 |
continue;
|
... | ... | |
10775 |
10785 |
continue;
|
10776 |
10786 |
}
|
10777 |
10787 |
|
10778 |
|
dout(10) << __func__ << ": recover_object_replicas(" << soid << ")" << dendl;
|
|
10788 |
if (cmp(soid, pi->second.last_backfill, get_sort_bitwise()) > 0)
|
|
10789 |
dout(0) << __func__ << ": recover_object_replicas(" << soid
|
|
10790 |
<< ") retry with locations " << missing_loc.get_locations(soid)
|
|
10791 |
<< dendl;
|
|
10792 |
else
|
|
10793 |
dout(10) << __func__ << ": recover_object_replicas(" << soid << ")"
|
|
10794 |
<< dendl;
|
10779 |
10795 |
map<hobject_t,pg_missing_t::item, hobject_t::ComparatorWithDefault>::const_iterator r = m.missing.find(soid);
|
10780 |
10796 |
started += prep_object_replica_pushes(soid, r->second.need,
|
10781 |
10797 |
h);
|