might_have_unfound(recovery_state.might_have_unfound),
deleting(recovery_state.deleting),
deleted(recovery_state.deleted),
+ missing_loc(recovery_state.missing_loc),
pg_id(p),
coll(p),
osd(o),
trace_endpoint("0.0.0.0", 0, "PG"),
info_struct_v(0),
pgmeta_oid(p.make_pgmeta_oid()),
- missing_loc(info.pgid, &recovery_state, this, cct),
stat_queue_item(this),
scrub_queued(false),
recovery_queued(false),
set<pg_shard_t> &might_have_unfound;
bool &deleting;
atomic<bool> &deleted;
+ MissingLoc &missing_loc;
public:
// -- members --
ghobject_t pgmeta_oid;
// ------------------
- // MissingLoc
-
- MissingLoc missing_loc;
-
interval_set<snapid_t> snap_trimq;
/* You should not use these items without taking their respective queue locks
void cancel_recovery();
void clear_recovery_state();
virtual void _clear_recovery_state() = 0;
- virtual void check_recovery_sources(const OSDMapRef& newmap) = 0;
void start_recovery_op(const hobject_t& soid);
void finish_recovery_op(const hobject_t& soid, bool dequeue=false);
osdmap_ref(curmap),
pool(_pool),
info(spgid),
- pg_log(cct) {
+ pg_log(cct),
+ missing_loc(spgid, this, dpp, cct)
+{
machine.initiate();
}
+void PeeringState::check_recovery_sources(const OSDMapRef& osdmap)
+{
+ /*
+ * check that any peers we are planning to (or currently) pulling
+ * objects from are dealt with.
+ */
+ missing_loc.check_recovery_sources(osdmap);
+ pl->check_recovery_sources(osdmap);
+
+ for (set<pg_shard_t>::iterator i = peer_log_requested.begin();
+ i != peer_log_requested.end();
+ ) {
+ if (!osdmap->is_up(i->osd)) {
+ dout(10) << "peer_log_requested removing " << *i << dendl;
+ peer_log_requested.erase(i++);
+ } else {
+ ++i;
+ }
+ }
+
+ for (set<pg_shard_t>::iterator i = peer_missing_requested.begin();
+ i != peer_missing_requested.end();
+ ) {
+ if (!osdmap->is_up(i->osd)) {
+ dout(10) << "peer_missing_requested removing " << *i << dendl;
+ peer_missing_requested.erase(i++);
+ } else {
+ ++i;
+ }
+ }
+}
+
void PeeringState::update_history(const pg_history_t& new_history)
{
pl->unreg_next_scrub();
// if we removed anyone, update peers (which include peer_info)
if (removed)
update_heartbeat_peers();
- pg->check_recovery_sources(osdmap);
+
+ check_recovery_sources(osdmap);
}
void PeeringState::update_heartbeat_peers()
virtual void send_cluster_message(int osd, Message *m, epoch_t epoch) = 0;
+ virtual void check_recovery_sources(const OSDMapRef& newmap) = 0;
virtual void on_pool_change() = 0;
virtual void on_role_change() = 0;
virtual void on_change(ObjectStore::Transaction *t) = 0;
bool deleting = false; /// true while in removing or OSD is shutting down
atomic<bool> deleted = {false}; /// true once deletion complete
+ MissingLoc missing_loc; ///< information about missing objects
+
void update_osdmap_ref(OSDMapRef newmap) {
osdmap_ref = std::move(newmap);
}
void remove_down_peer_info(const OSDMapRef &osdmap);
void purge_strays();
void update_history(const pg_history_t& new_history);
+ void check_recovery_sources(const OSDMapRef& map);
public:
PeeringState(
void PrimaryLogPG::check_recovery_sources(const OSDMapRef& osdmap)
{
- /*
- * check that any peers we are planning to (or currently) pulling
- * objects from are dealt with.
- */
- missing_loc.check_recovery_sources(osdmap);
pgbackend->check_recovery_sources(osdmap);
-
- for (set<pg_shard_t>::iterator i = peer_log_requested.begin();
- i != peer_log_requested.end();
- ) {
- if (!osdmap->is_up(i->osd)) {
- dout(10) << "peer_log_requested removing " << *i << dendl;
- peer_log_requested.erase(i++);
- } else {
- ++i;
- }
- }
-
- for (set<pg_shard_t>::iterator i = peer_missing_requested.begin();
- i != peer_missing_requested.end();
- ) {
- if (!osdmap->is_up(i->osd)) {
- dout(10) << "peer_missing_requested removing " << *i << dendl;
- peer_missing_requested.erase(i++);
- } else {
- ++i;
- }
- }
}
bool PrimaryLogPG::start_recovery_ops(