void ReplicatedPG::calc_head_subsets(SnapSet& snapset, const hobject_t& head,
Missing& missing,
+ const hobject_t &last_backfill,
interval_set<uint64_t>& data_subset,
map<hobject_t, interval_set<uint64_t> >& clone_subsets)
{
hobject_t c = head;
c.snap = snapset.clones[j];
prev.intersection_of(snapset.clone_overlap[snapset.clones[j]]);
- if (!missing.is_missing(c)) {
+ if (!missing.is_missing(c) && c < last_backfill) {
dout(10) << "calc_head_subsets " << head << " has prev " << c
<< " overlap " << prev << dendl;
clone_subsets[c] = prev;
void ReplicatedPG::calc_clone_subsets(SnapSet& snapset, const hobject_t& soid,
Missing& missing,
+ const hobject_t &last_backfill,
interval_set<uint64_t>& data_subset,
map<hobject_t, interval_set<uint64_t> >& clone_subsets)
{
hobject_t c = soid;
c.snap = snapset.clones[j];
prev.intersection_of(snapset.clone_overlap[snapset.clones[j]]);
- if (!missing.is_missing(c)) {
+ if (!missing.is_missing(c) && c < last_backfill) {
dout(10) << "calc_clone_subsets " << soid << " has prev " << c
<< " overlap " << prev << dendl;
clone_subsets[c] = prev;
// check snapset
SnapSetContext *ssc = get_snapset_context(soid.oid, soid.get_key(), soid.hash, false);
dout(10) << " snapset " << ssc->snapset << dendl;
- calc_clone_subsets(ssc->snapset, soid, missing,
+ calc_clone_subsets(ssc->snapset, soid, missing, info.last_backfill,
data_subset, clone_subsets);
put_snapset_context(ssc);
// FIXME: this may overestimate if we are pulling multiple clones in parallel...
SnapSetContext *ssc = get_snapset_context(soid.oid, soid.get_key(), soid.hash, false);
dout(15) << "push_to_replica snapset is " << ssc->snapset << dendl;
calc_clone_subsets(ssc->snapset, soid, peer_missing[peer],
+ peer_info[peer].last_backfill,
data_subset, clone_subsets);
put_snapset_context(ssc);
} else if (soid.snap == CEPH_NOSNAP) {
// base this on partially on replica's clones?
SnapSetContext *ssc = get_snapset_context(soid.oid, soid.get_key(), soid.hash, false);
dout(15) << "push_to_replica snapset is " << ssc->snapset << dendl;
- calc_head_subsets(ssc->snapset, soid, peer_missing[peer], data_subset, clone_subsets);
+ calc_head_subsets(ssc->snapset, soid, peer_missing[peer],
+ peer_info[peer].last_backfill,
+ data_subset, clone_subsets);
put_snapset_context(ssc);
}
clone_subsets.clear(); // forget what pusher said; recalculate cloning.
interval_set<uint64_t> data_needed;
- calc_clone_subsets(ssc->snapset, soid, missing, data_needed, clone_subsets);
+ calc_clone_subsets(ssc->snapset, soid, missing, info.last_backfill,
+ data_needed, clone_subsets);
pi->data_subset = data_needed;
put_snapset_context(ssc);
int recover_object_replicas(const hobject_t& soid, eversion_t v);
void calc_head_subsets(SnapSet& snapset, const hobject_t& head,
Missing& missing,
+ const hobject_t &last_backfill,
interval_set<uint64_t>& data_subset,
map<hobject_t, interval_set<uint64_t> >& clone_subsets);
void calc_clone_subsets(SnapSet& snapset, const hobject_t& poid, Missing& missing,
+ const hobject_t &last_backfill,
interval_set<uint64_t>& data_subset,
map<hobject_t, interval_set<uint64_t> >& clone_subsets);
void push_to_replica(ObjectContext *obc, const hobject_t& oid, int dest);