From: Samuel Just Date: Tue, 26 Mar 2019 23:03:20 +0000 (-0700) Subject: osd/: move update_history and purge_strays into PeeringState X-Git-Tag: v15.1.0~2774^2~75 X-Git-Url: http://git.apps.os.sepia.ceph.com/?a=commitdiff_plain;h=e42ca4204bddf1df1ad2e0d75630ea4f1c6160d8;p=ceph-ci.git osd/: move update_history and purge_strays into PeeringState Signed-off-by: Samuel Just --- diff --git a/src/osd/PG.cc b/src/osd/PG.cc index cfab9a0d179..95fd9b9f719 100644 --- a/src/osd/PG.cc +++ b/src/osd/PG.cc @@ -31,7 +31,6 @@ #include "messages/MOSDOp.h" #include "messages/MOSDPGNotify.h" // #include "messages/MOSDPGLog.h" -#include "messages/MOSDPGRemove.h" #include "messages/MOSDPGInfo.h" #include "messages/MOSDPGTrim.h" #include "messages/MOSDPGScan.h" @@ -2434,7 +2433,7 @@ void PG::_finish_recovery(Context *c) if (c == finish_sync_event) { dout(10) << "_finish_recovery" << dendl; finish_sync_event = 0; - purge_strays(); + recovery_state.purge_strays(); publish_stats_to_osd(); @@ -2921,53 +2920,6 @@ void PG::cancel_recovery() clear_recovery_state(); } - -void PG::purge_strays() -{ - if (is_premerge()) { - dout(10) << "purge_strays " << stray_set << " but premerge, doing nothing" - << dendl; - return; - } - if (cct->_conf.get_val("osd_debug_no_purge_strays")) { - return; - } - dout(10) << "purge_strays " << stray_set << dendl; - - bool removed = false; - for (set::iterator p = stray_set.begin(); - p != stray_set.end(); - ++p) { - ceph_assert(!is_acting_recovery_backfill(*p)); - if (get_osdmap()->is_up(p->osd)) { - dout(10) << "sending PGRemove to osd." << *p << dendl; - vector to_remove; - to_remove.push_back(spg_t(info.pgid.pgid, p->shard)); - MOSDPGRemove *m = new MOSDPGRemove( - get_osdmap_epoch(), - to_remove); - osd->send_message_osd_cluster(p->osd, m, get_osdmap_epoch()); - } else { - dout(10) << "not sending PGRemove to down osd." << *p << dendl; - } - peer_missing.erase(*p); - peer_info.erase(*p); - peer_purged.insert(*p); - removed = true; - } - - // if we removed anyone, update peers (which include peer_info) - if (removed) - recovery_state.update_heartbeat_peers(); - - stray_set.clear(); - - // clear _requested maps; we may have to peer() again if we discover - // (more) stray content - peer_log_requested.clear(); - peer_missing_requested.clear(); -} - void PG::set_probe_targets(const set &probe_set) { std::lock_guard l(heartbeat_peer_lock); @@ -2979,6 +2931,11 @@ void PG::set_probe_targets(const set &probe_set) } } +void PG::send_cluster_message(int target, Message *m, epoch_t epoch) +{ + osd->send_message_osd_cluster(target, m, epoch); +} + void PG::clear_probe_targets() { std::lock_guard l(heartbeat_peer_lock); @@ -5892,21 +5849,6 @@ void PG::merge_new_log_entries( } } -void PG::update_history(const pg_history_t& new_history) -{ - unreg_next_scrub(); - if (info.history.merge(new_history)) { - dout(20) << __func__ << " advanced history from " << new_history << dendl; - dirty_info = true; - if (info.history.last_epoch_clean >= info.history.same_interval_since) { - dout(20) << __func__ << " clearing past_intervals" << dendl; - past_intervals.clear(); - dirty_big_info = true; - } - } - reg_next_scrub(); -} - void PG::fulfill_info( pg_shard_t from, const pg_query_t &query, pair ¬ify_info) diff --git a/src/osd/PG.h b/src/osd/PG.h index 592e0da9d43..9060a8db638 100644 --- a/src/osd/PG.h +++ b/src/osd/PG.h @@ -398,8 +398,9 @@ public: void finish_split_stats(const object_stat_sum_t& stats, ObjectStore::Transaction *t); void scrub(epoch_t queued, ThreadPool::TPHandle &handle); - void reg_next_scrub(); - void unreg_next_scrub(); + + void reg_next_scrub() override; + void unreg_next_scrub() override; bool is_forced_recovery_or_backfill() const { return get_state() & (PG_STATE_FORCED_RECOVERY | PG_STATE_FORCED_BACKFILL); @@ -925,6 +926,8 @@ protected: public: bool dne() { return info.dne(); } + virtual void send_cluster_message(int osd, Message *m, epoch_t epoch); + protected: bool need_up_thru; ///< Flag indicating that this pg needs up through published @@ -1981,7 +1984,9 @@ protected: void start_flush(ObjectStore::Transaction *t); void set_last_peering_reset(); - void update_history(const pg_history_t& history); + void update_history(const pg_history_t& history) { + recovery_state.update_history(history); + } void fulfill_info(pg_shard_t from, const pg_query_t &query, pair ¬ify_info); void fulfill_log(pg_shard_t from, const pg_query_t &query, epoch_t query_epoch); diff --git a/src/osd/PeeringState.cc b/src/osd/PeeringState.cc index d4483f0d0b3..68aadddec47 100644 --- a/src/osd/PeeringState.cc +++ b/src/osd/PeeringState.cc @@ -7,6 +7,7 @@ #include "PG.h" #include "OSD.h" +#include "messages/MOSDPGRemove.h" #include "messages/MBackfillReserve.h" #include "messages/MRecoveryReserve.h" #include "messages/MOSDScrubReserve.h" @@ -131,6 +132,68 @@ PeeringState::PeeringState( machine.initiate(); } +void PeeringState::update_history(const pg_history_t& new_history) +{ + pl->unreg_next_scrub(); + if (info.history.merge(new_history)) { + psdout(20) << __func__ << " advanced history from " << new_history << dendl; + dirty_info = true; + if (info.history.last_epoch_clean >= info.history.same_interval_since) { + psdout(20) << __func__ << " clearing past_intervals" << dendl; + past_intervals.clear(); + dirty_big_info = true; + } + } + pl->reg_next_scrub(); +} + +void PeeringState::purge_strays() +{ + if (is_premerge()) { + psdout(10) << "purge_strays " << stray_set << " but premerge, doing nothing" + << dendl; + return; + } + if (cct->_conf.get_val("osd_debug_no_purge_strays")) { + return; + } + psdout(10) << "purge_strays " << stray_set << dendl; + + bool removed = false; + for (set::iterator p = stray_set.begin(); + p != stray_set.end(); + ++p) { + ceph_assert(!is_acting_recovery_backfill(*p)); + if (get_osdmap()->is_up(p->osd)) { + dout(10) << "sending PGRemove to osd." << *p << dendl; + vector to_remove; + to_remove.push_back(spg_t(info.pgid.pgid, p->shard)); + MOSDPGRemove *m = new MOSDPGRemove( + get_osdmap_epoch(), + to_remove); + pl->send_cluster_message(p->osd, m, get_osdmap_epoch()); + } else { + dout(10) << "not sending PGRemove to down osd." << *p << dendl; + } + peer_missing.erase(*p); + peer_info.erase(*p); + peer_purged.insert(*p); + removed = true; + } + + // if we removed anyone, update peers (which include peer_info) + if (removed) + update_heartbeat_peers(); + + stray_set.clear(); + + // clear _requested maps; we may have to peer() again if we discover + // (more) stray content + peer_log_requested.clear(); + peer_missing_requested.clear(); +} + + bool PeeringState::proc_replica_info( pg_shard_t from, const pg_info_t &oinfo, epoch_t send_epoch) { @@ -151,14 +214,14 @@ bool PeeringState::proc_replica_info( peer_info[from] = oinfo; might_have_unfound.insert(from); - pg->update_history(oinfo.history); + update_history(oinfo.history); // stray? if (!is_up(from) && !is_acting(from)) { dout(10) << " osd." << from << " has stray content: " << oinfo << dendl; stray_set.insert(from); if (is_clean()) { - pg->purge_strays(); + purge_strays(); } } diff --git a/src/osd/PeeringState.h b/src/osd/PeeringState.h index 0eb46d49b5b..27d6ebb8560 100644 --- a/src/osd/PeeringState.h +++ b/src/osd/PeeringState.h @@ -65,6 +65,11 @@ public: virtual void update_store_with_options(const pool_opts_t &opts) = 0; virtual void update_heartbeat_peers(set peers) = 0; + virtual void reg_next_scrub() = 0; + virtual void unreg_next_scrub() = 0; + + virtual void send_cluster_message(int osd, Message *m, epoch_t epoch) = 0; + virtual void on_pool_change() = 0; virtual void on_role_change() = 0; virtual void on_change(ObjectStore::Transaction *t) = 0; @@ -1140,6 +1145,8 @@ public: bool proc_replica_info( pg_shard_t from, const pg_info_t &oinfo, epoch_t send_epoch); void remove_down_peer_info(const OSDMapRef &osdmap); + void purge_strays(); + void update_history(const pg_history_t& new_history); public: PeeringState(