pg_shard_t peer,
const hobject_t oid) = 0;
- virtual void failed_push(const list<pg_shard_t> &from, const hobject_t &soid) = 0;
+ virtual void failed_push(const list<pg_shard_t> &from,
+ const hobject_t &soid,
+ const eversion_t &need = eversion_t()) = 0;
virtual void finish_degraded_object(const hobject_t& oid) = 0;
virtual void primary_failed(const hobject_t &soid) = 0;
virtual bool primary_error(const hobject_t& soid, eversion_t v) = 0;
failed_push(fl, soid);
}
-void PrimaryLogPG::failed_push(const list<pg_shard_t> &from, const hobject_t &soid)
+void PrimaryLogPG::failed_push(const list<pg_shard_t> &from,
+ const hobject_t &soid, const eversion_t &need)
{
dout(20) << __func__ << ": " << soid << dendl;
ceph_assert(recovering.count(soid));
requeue_ops(blocked_ops);
}
recovering.erase(soid);
- for (auto&& i : from)
+ for (auto&& i : from) {
missing_loc.remove_location(soid, i);
+ if (need != eversion_t()) {
+ dout(0) << __func__ << " adding " << soid << " to shard " << i
+ << "'s missing set too" << dendl;
+ auto pm = peer_missing.find(i);
+ if (pm != peer_missing.end())
+ pm->second.add(soid, need, eversion_t(), false);
+ }
+ }
dout(0) << __func__ << " " << soid << " from shard " << from
<< ", reps on " << missing_loc.get_locations(soid)
<< " unfound? " << missing_loc.is_unfound(soid) << dendl;
const hobject_t &oid,
const object_stat_sum_t &stat_diff,
bool is_delete) override;
- void failed_push(const list<pg_shard_t> &from, const hobject_t &soid) override;
+ void failed_push(const list<pg_shard_t> &from,
+ const hobject_t &soid,
+ const eversion_t &need = eversion_t()) override;
void primary_failed(const hobject_t &soid) override;
bool primary_error(const hobject_t& soid, eversion_t v) override;
void cancel_pull(const hobject_t &soid) override;
{
dout(20) << __func__ << ": " << soid << " from " << from << dendl;
list<pg_shard_t> fl = { from };
- get_parent()->failed_push(fl, soid);
+ auto it = pulling.find(soid);
+ assert(it != pulling.end());
+ get_parent()->failed_push(fl, soid, it->second.recovery_info.version);
- clear_pull(pulling.find(soid));
+ clear_pull(it);
}
void ReplicatedBackend::clear_pull_from(