dout(20) << " after missing " << i->first << " need " << i->second.need
<< " have " << i->second.have << dendl;
}
+ dout(10) << __func__ << " peer_missing " << peer_missing[from].get_items() << dendl;
peer_missing[from].claim(omissing);
+ dout(10) << __func__ << " peer_missing after claim" << peer_missing[from].get_items() << dendl;
}
bool PG::proc_replica_info(
const = 0;
virtual const pg_missing_tracker_t &get_local_missing() const = 0;
+ virtual void add_local_next_event(const pg_log_entry_t& e) = 0;
virtual const map<pg_shard_t, pg_missing_t> &get_shard_missing()
const = 0;
virtual boost::optional<const pg_missing_const_i &> maybe_get_shard_missing(
const pg_missing_tracker_t& get_missing() const { return missing; }
- void missing_add(const hobject_t& oid, eversion_t need, eversion_t have) {
- missing.add(oid, need, have, false);
+ void missing_add(const hobject_t& oid, eversion_t need, eversion_t have, bool is_delete=false) {
+ missing.add(oid, need, have, is_delete);
+ }
+
+ void missing_add_next_entry(const pg_log_entry_t& e) {
+ missing.add_next_event(e);
}
//////////////////// get or set log ////////////////////
projected_log.add(entry);
}
+ for (map<pg_shard_t, pg_missing_t>::iterator i = peer_missing.begin();
+ i != peer_missing.end();
+ ++i) {
+ dout(10) << __func__ << " shard " << i->first << " before missing " << (i->second).get_items() << dendl;
+ }
for (set<pg_shard_t>::iterator i = async_recovery_targets.begin();
i != async_recovery_targets.end();
++i) {
}
}
+ for (map<pg_shard_t, pg_missing_t>::iterator i = peer_missing.begin();
+ i != peer_missing.end();
+ ++i) {
+ dout(10) << __func__ << " shard " << i->first << " after add next missing " << (i->second).get_items() << dendl;
+ }
+
for (set<pg_shard_t>::const_iterator i = acting_recovery_backfill.begin();
i != acting_recovery_backfill.end();
++i) {
const PGLog &get_log() const override {
return pg_log;
}
+ void add_local_next_event(const pg_log_entry_t& e) {
+ pg_log.missing_add_next_entry(e);
+ }
bool pgb_is_primary() const override {
return is_primary();
}
// sanity checks
assert(m->map_epoch >= get_info().history.same_interval_since);
+ dout(10) << __func__ << " missing before " << get_parent()->get_log().get_missing().get_items() << dendl;
parent->maybe_preempt_replica_scrub(soid);
int ackerosd = m->get_source().num();
// collections now. Otherwise, we do it later on push.
update_snaps = true;
}
+
+ pg_missing_tracker_t pmissing = get_parent()->get_local_missing();
+ if (pmissing.is_missing(soid)) {
+ dout(10) << __func__ << " j->second.is_missing(soid) " << pmissing.is_missing(soid) << dendl;
+ for (auto &&e: log) {
+ dout(10) << " add_next_event entry " << e << dendl;
+ get_parent()->add_local_next_event(e);
+ dout(10) << " entry version " << e.version << dendl;
+ dout(10) << " entry prior version " << e.prior_version << dendl;
+ dout(10) << " entry is_delete " << e.is_delete() << dendl;
+ }
+ }
+
parent->update_stats(m->pg_stats);
parent->log_operation(
log,
tls.push_back(std::move(rm->opt));
parent->queue_transactions(tls, op);
// op is cleaned up by oncommit/onapply when both are executed
+ dout(10) << __func__ << " missing after" << get_parent()->get_log().get_missing().get_items() << dendl;
}
void ReplicatedBackend::repop_commit(RepModifyRef rm)