return peering_state.is_backfilling();
}
+ void prepare_backfill_for_missing(
+ const hobject_t &soid,
+ const eversion_t &v,
+ const std::vector<pg_shard_t> &peers) override {
+ return peering_state.prepare_backfill_for_missing(soid, v, peers);
+ }
PeeringFacade(PeeringState& peering_state)
: peering_state(peering_state) {
}
logger().debug("{}: check={}", __func__, check);
const auto& primary_bi = backfill_state().backfill_info;
result_t result { {}, primary_bi.begin };
+ std::map<hobject_t, std::pair<eversion_t, std::vector<pg_shard_t>>> backfills;
for (const auto& bt : peering_state().get_backfill_targets()) {
const auto& peer_bi = backfill_state().peer_backfill_info.at(bt);
// Find all check peers that have the wrong version
if (const eversion_t& obj_v = primary_bi.objects.begin()->second;
check == primary_bi.begin && check == peer_bi.begin) {
- if(peer_bi.objects.begin()->second != obj_v &&
- backfill_state().progress_tracker->enqueue_push(primary_bi.begin)) {
- backfill_listener().enqueue_push(primary_bi.begin, obj_v);
+ if (peer_bi.objects.begin()->second != obj_v) {
+ std::ignore = backfill_state().progress_tracker->enqueue_push(
+ primary_bi.begin);
+ auto &[v, peers] = backfills[primary_bi.begin];
+ assert(v == obj_v || v == eversion_t());
+ v = obj_v;
+ peers.push_back(bt);
} else {
// it's fine, keep it! OR already recovering
}
// Only include peers that we've caught up to their backfill line
// otherwise, they only appear to be missing this object
// because their peer_bi.begin > backfill_info.begin.
- if (primary_bi.begin > peering_state().get_peer_last_backfill(bt) &&
- backfill_state().progress_tracker->enqueue_push(primary_bi.begin)) {
- backfill_listener().enqueue_push(primary_bi.begin, obj_v);
+ if (primary_bi.begin > peering_state().get_peer_last_backfill(bt)) {
+ std::ignore = backfill_state().progress_tracker->enqueue_push(
+ primary_bi.begin);
+ auto &[v, peers] = backfills[primary_bi.begin];
+ assert(v == obj_v || v == eversion_t());
+ v = obj_v;
+ peers.push_back(bt);
}
}
}
+ for (auto &backfill : backfills) {
+ auto &soid = backfill.first;
+ auto &obj_v = backfill.second.first;
+ auto &peers = backfill.second.second;
+ backfill_listener().enqueue_push(soid, obj_v, peers);
+ }
return result;
}
virtual void enqueue_push(
const hobject_t& obj,
- const eversion_t& v) = 0;
+ const eversion_t& v,
+ const std::vector<pg_shard_t> &peers) = 0;
virtual void enqueue_drop(
const pg_shard_t& target,
virtual void update_complete_backfill_object_stats(const hobject_t &hoid,
const pg_stat_t &stats) = 0;
virtual bool is_backfilling() const = 0;
+ virtual void prepare_backfill_for_missing(
+ const hobject_t &soid,
+ const eversion_t &v,
+ const std::vector<pg_shard_t> &peers) = 0;
virtual ~PeeringFacade() {}
};
void PGRecovery::enqueue_push(
const hobject_t& obj,
- const eversion_t& v)
+ const eversion_t& v,
+ const std::vector<pg_shard_t> &peers)
{
- logger().info("{}: obj={} v={}",
- __func__, obj, v);
+ logger().info("{}: obj={} v={} peers={}", __func__, obj, v, peers);
+ auto &peering_state = pg->get_peering_state();
+ peering_state.prepare_backfill_for_missing(obj, v, peers);
auto [recovering, added] = pg->get_recovery_backend()->add_recovering(obj);
if (!added)
return;
const hobject_t& begin) final;
void enqueue_push(
const hobject_t& obj,
- const eversion_t& v) final;
+ const eversion_t& v,
+ const std::vector<pg_shard_t> &peers) final;
void enqueue_drop(
const pg_shard_t& target,
const hobject_t& obj,
void enqueue_push(
const hobject_t& obj,
- const eversion_t& v) override;
+ const eversion_t& v,
+ const std::vector<pg_shard_t> &peers) override;
void enqueue_drop(
const pg_shard_t& target,
void update_complete_backfill_object_stats(const hobject_t &hoid,
const pg_stat_t &stats) override {
}
+ void prepare_backfill_for_missing(
+ const hobject_t &soid,
+ const eversion_t &v,
+ const std::vector<pg_shard_t> &peers) override {}
bool is_backfilling() const override {
return true;
}
void BackfillFixture::enqueue_push(
const hobject_t& obj,
- const eversion_t& v)
+ const eversion_t& v,
+ const std::vector<pg_shard_t> &)
{
for (auto& [ _, bt ] : backfill_targets) {
bt.store.push(obj, v);