From 9aecf17137a0ba5a88434087a4ceee2a657980dd Mon Sep 17 00:00:00 2001 From: Sage Weil Date: Thu, 7 May 2009 20:49:51 -0700 Subject: [PATCH] osd: factor out clear_recovery_state from {cancel,finish}_recovery Also kill OSD::num_pulling counter, which is wrong anyway, lacking locking, and probably not needed anyway with the more general recovery_op accounting. --- src/osd/OSD.cc | 1 - src/osd/OSD.h | 2 -- src/osd/PG.cc | 16 ++++++++++++---- src/osd/PG.h | 6 +++--- src/osd/ReplicatedPG.cc | 25 ++++--------------------- src/osd/ReplicatedPG.h | 2 +- 6 files changed, 20 insertions(+), 32 deletions(-) diff --git a/src/osd/OSD.cc b/src/osd/OSD.cc index bd1ef34446270..45bbd4b7091c0 100644 --- a/src/osd/OSD.cc +++ b/src/osd/OSD.cc @@ -246,7 +246,6 @@ OSD::OSD(int id, Messenger *m, Messenger *hbm, MonMap *mm, const char *dev, cons pg_stat_queue_lock("OSD::pg_stat_queue_lock"), last_tid(0), tid_lock("OSD::tid_lock"), - num_pulling(0), backlog_wq(this, &disk_tp), recovery_ops_active(0), recovery_wq(this, &recovery_tp), diff --git a/src/osd/OSD.h b/src/osd/OSD.h index 67353e5c8fe57..9bd44c41f327a 100644 --- a/src/osd/OSD.h +++ b/src/osd/OSD.h @@ -522,8 +522,6 @@ private: // -- generic pg peering -- - int num_pulling; - void do_notifies(map< int, vector >& notify_list); void do_queries(map< int, map >& query_map); void do_infos(map& info_map); diff --git a/src/osd/PG.cc b/src/osd/PG.cc index 50fb5b4bbe9ac..6e997a3873911 100644 --- a/src/osd/PG.cc +++ b/src/osd/PG.cc @@ -1467,9 +1467,7 @@ void PG::finish_recovery() state_set(PG_STATE_CLEAN); assert(info.last_complete == info.last_update); - log.reset_recovery_pointers(); - - osd->finish_recovery_op(this, recovery_ops_active, true); + clear_recovery_state(); /* * sync all this before purging strays. but don't block! @@ -1509,12 +1507,22 @@ void PG::defer_recovery() osd->defer_recovery(this); } -void PG::_cancel_recovery() +void PG::clear_recovery_state() { + dout(10) << "clear_recovery_state" << dendl; + log.reset_recovery_pointers(); finish_sync_event = 0; osd->finish_recovery_op(this, recovery_ops_active, true); + + _clear_recovery_state(); // pg impl specific hook +} + +void PG::cancel_recovery() +{ + dout(10) << "cancel_recovery" << dendl; + clear_recovery_state(); } diff --git a/src/osd/PG.h b/src/osd/PG.h index 16ab76b7f436d..0b3b1ea4afe22 100644 --- a/src/osd/PG.h +++ b/src/osd/PG.h @@ -724,17 +724,17 @@ public: virtual void clean_up_local(ObjectStore::Transaction& t) = 0; - void _cancel_recovery(); - virtual void cancel_recovery() = 0; virtual int start_recovery_ops(int max) = 0; void purge_strays(); - Context *finish_sync_event; void finish_recovery(); void _finish_recovery(Context *c); + void cancel_recovery(); + void clear_recovery_state(); + virtual void _clear_recovery_state() = 0; void defer_recovery(); loff_t get_log_write_pos() { diff --git a/src/osd/ReplicatedPG.cc b/src/osd/ReplicatedPG.cc index a42a7bb567edf..33bac485c34a5 100644 --- a/src/osd/ReplicatedPG.cc +++ b/src/osd/ReplicatedPG.cc @@ -2634,24 +2634,15 @@ void ReplicatedPG::on_role_change() } - - - - - -void ReplicatedPG::cancel_recovery() +// clear state. called on recovery completion AND cancellation. +void ReplicatedPG::_clear_recovery_state() { - dout(10) << "cancel_recovery" << dendl; - - // forget about where missing items are, or anything we're pulling missing_loc.clear(); - osd->num_pulling -= pulling.size(); pulling.clear(); pushing.clear(); - - _cancel_recovery(); } + int ReplicatedPG::start_recovery_ops(int max) { int started = 0; @@ -2687,18 +2678,10 @@ int ReplicatedPG::recover_primary(int max) { assert(is_primary()); - dout(-10) << "recover_primary pulling " << pulling.size() << " in pg, " - << osd->num_pulling << "/" << g_conf.osd_max_pull << " total" - << dendl; + dout(10) << "recover_primary pulling " << pulling.size() << " in pg" << dendl; dout(10) << "recover_primary " << missing << dendl; dout(15) << "recover_primary " << missing.missing << dendl; - // can we slow down on this PG? - if (osd->num_pulling >= g_conf.osd_max_pull && !pulling.empty()) { - dout(-10) << "recover_primary already pulling max, waiting" << dendl; - return 0; - } - // look at log! Log::Entry *latest = 0; int started = 0; diff --git a/src/osd/ReplicatedPG.h b/src/osd/ReplicatedPG.h index cbde3e4929d6b..58ebb3391ec9e 100644 --- a/src/osd/ReplicatedPG.h +++ b/src/osd/ReplicatedPG.h @@ -202,7 +202,7 @@ protected: // pg on-disk content void clean_up_local(ObjectStore::Transaction& t); - void cancel_recovery(); + void _clear_recovery_state(); void queue_for_recovery(); int start_recovery_ops(int max); -- 2.39.5