const hobject_t oid) = 0;
virtual void failed_push(const list<pg_shard_t> &from, const hobject_t &soid) = 0;
+ virtual void primary_failed(const hobject_t &soid) = 0;
+ virtual bool primary_error(const hobject_t& soid, eversion_t v) = 0;
virtual void cancel_pull(const hobject_t &soid) = 0;
eversion_t v)
{
dout(0) << __func__ << ": oid " << oid << " version " << v << dendl;
- list<pg_shard_t> fl = { pg_whoami };
- failed_push(fl, oid);
+ primary_failed(oid);
primary_error(oid, v);
backfills_in_flight.erase(oid);
missing_loc.add_missing(oid, v, eversion_t());
}
}
+void PrimaryLogPG::primary_failed(const hobject_t &soid)
+{
+ list<pg_shard_t> fl = { pg_whoami };
+ failed_push(fl, soid);
+}
+
void PrimaryLogPG::failed_push(const list<pg_shard_t> &from, const hobject_t &soid)
{
dout(20) << __func__ << ": " << soid << dendl;
obc->ondisk_read_unlock();
if (r < 0) {
dout(0) << __func__ << " Error " << r << " on oid " << soid << dendl;
- list<pg_shard_t> fl = { pg_whoami };
- failed_push(fl, soid);
+ primary_failed(soid);
primary_error(soid, v);
return 0;
}
obc->ondisk_read_unlock();
if (r < 0) {
dout(0) << __func__ << " Error " << r << " on oid " << oid << dendl;
- list<pg_shard_t> fl = { pg_whoami };
- failed_push(fl, oid);
+ primary_failed(oid);
primary_error(oid, v);
backfills_in_flight.erase(oid);
missing_loc.add_missing(oid, v, eversion_t());
const hobject_t &oid,
const object_stat_sum_t &stat_diff) override;
void failed_push(const list<pg_shard_t> &from, const hobject_t &soid) 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;
void apply_stats(
hobject_t last_backfill_started;
bool new_backfill;
- void primary_error(const hobject_t& soid, eversion_t v);
int prep_object_replica_pushes(const hobject_t& soid, eversion_t v,
PGBackend::RecoveryHandle *h);
ObjectContextRef obc = j->second.obc;
bc->clear_pull(j, false /* already did it */);
int started = bc->start_pushes(i.hoid, obc, h);
- // XXX: Handle errors here?
- assert(started >= 0);
- if (!started) {
+ if (started < 0) {
+ bc->pushing[i.hoid].clear();
+ bc->get_parent()->primary_failed(i.hoid);
+ bc->get_parent()->primary_error(i.hoid, obc->obs.oi.version);
+ } else if (!started) {
bc->get_parent()->on_global_recover(
i.hoid, i.stat);
}