From f89643d06a6fde5044e15c1507874811ab9e50e5 Mon Sep 17 00:00:00 2001 From: Sage Weil Date: Wed, 13 Sep 2017 18:09:35 -0400 Subject: [PATCH] osd/PG: clean up set_force_{recovery,backfill} interface - update state under pg lock - clean up PG interface - log only when we adjust the state Signed-off-by: Sage Weil (cherry picked from commit 2482b4cc91579b4ef5748097f1adacaad91510b1) Conflicts: src/osd/PG.h (trivial) --- src/osd/OSD.cc | 43 +++++++------------------------------------ src/osd/PG.cc | 45 ++++++++++++++++++++++++++++++++++++++------- src/osd/PG.h | 5 ++++- 3 files changed, 49 insertions(+), 44 deletions(-) diff --git a/src/osd/OSD.cc b/src/osd/OSD.cc index 0f968d3336454..e8b1f70b128e0 100644 --- a/src/osd/OSD.cc +++ b/src/osd/OSD.cc @@ -9596,45 +9596,16 @@ bool OSDService::_recover_now(uint64_t *available_pushes) void OSDService::adjust_pg_priorities(const vector& pgs, int newflags) { - if (!pgs.size() || !(newflags & (OFR_BACKFILL | OFR_RECOVERY))) + if (!pgs.size() || !(newflags & (OFR_BACKFILL | OFR_RECOVERY))) { return; - int newstate = 0; - - if (newflags & OFR_BACKFILL) { - newstate = PG_STATE_FORCED_BACKFILL; - } else if (newflags & OFR_RECOVERY) { - newstate = PG_STATE_FORCED_RECOVERY; } - - // debug output here may get large, don't generate it if debug level is below - // 10 and use abbreviated pg ids otherwise - if ((cct)->_conf->subsys.should_gather(ceph_subsys_osd, 10)) { - stringstream ss; - - for (auto& i : pgs) { - ss << i->get_pgid() << " "; - } - - dout(10) << __func__ << " working on " << ss.str() << dendl; - } - - if (newflags & OFR_CANCEL) { - for (auto& i : pgs) { - i->lock(); - i->_change_recovery_force_mode(newstate, true); - i->unlock(); + if (newflags & OFR_BACKFILL) { + for (auto& pg : pgs) { + pg->set_force_backfill(!(newflags & OFR_CANCEL)); } - } else { - for (auto& i : pgs) { - // make sure the PG is in correct state before forcing backfill or recovery, or - // else we'll make PG keeping FORCE_* flag forever, requiring osds restart - // or forcing somehow recovery/backfill. - i->lock(); - int pgstate = i->get_state(); - if ( ((newstate == PG_STATE_FORCED_RECOVERY) && (pgstate & (PG_STATE_DEGRADED | PG_STATE_RECOVERY_WAIT | PG_STATE_RECOVERING))) || - ((newstate == PG_STATE_FORCED_BACKFILL) && (pgstate & (PG_STATE_DEGRADED | PG_STATE_BACKFILL_WAIT | PG_STATE_BACKFILLING))) ) - i->_change_recovery_force_mode(newstate, false); - i->unlock(); + } else if (newflags & OFR_RECOVERY) { + for (auto& pg : pgs) { + pg->set_force_recovery(!(newflags & OFR_CANCEL)); } } } diff --git a/src/osd/PG.cc b/src/osd/PG.cc index f48d3ec036948..8cd905dfd2af3 100644 --- a/src/osd/PG.cc +++ b/src/osd/PG.cc @@ -2132,17 +2132,48 @@ void PG::mark_clean() kick_snap_trim(); } -void PG::_change_recovery_force_mode(int new_mode, bool clear) +void PG::set_force_recovery(bool b) { + lock(); if (!deleting) { - // we can't and shouldn't do anything if the PG is being deleted locally - if (clear) { - state_clear(new_mode); - } else { - state_set(new_mode); + if (b) { + if (!(state & PG_STATE_FORCED_RECOVERY) && + (state & (PG_STATE_DEGRADED | + PG_STATE_RECOVERY_WAIT | + PG_STATE_RECOVERING))) { + dout(20) << __func__ << " set" << dendl; + state_set(PG_STATE_FORCED_RECOVERY); + publish_stats_to_osd(); + } + } else if (state & PG_STATE_FORCED_RECOVERY) { + dout(20) << __func__ << " clear" << dendl; + state_clear(PG_STATE_FORCED_RECOVERY); + publish_stats_to_osd(); + } + } + unlock(); +} + +void PG::set_force_backfill(bool b) +{ + lock(); + if (!deleting) { + if (b) { + if (!(state & PG_STATE_FORCED_RECOVERY) && + (state & (PG_STATE_DEGRADED | + PG_STATE_BACKFILL_WAIT | + PG_STATE_BACKFILLING))) { + dout(10) << __func__ << " set" << dendl; + state_set(PG_STATE_FORCED_RECOVERY); + publish_stats_to_osd(); + } + } else if (state & PG_STATE_FORCED_RECOVERY) { + dout(10) << __func__ << " clear" << dendl; + state_clear(PG_STATE_FORCED_RECOVERY); + publish_stats_to_osd(); } - publish_stats_to_osd(); } + unlock(); } inline int PG::clamp_recovery_priority(int priority) diff --git a/src/osd/PG.h b/src/osd/PG.h index d782d897fedff..0afd4f49046dc 100644 --- a/src/osd/PG.h +++ b/src/osd/PG.h @@ -252,6 +252,10 @@ struct PGPool { */ class PG : public DoutPrefixProvider { +public: + void set_force_recovery(bool b); + void set_force_backfill(bool b); + protected: OSDService *osd; CephContext *cct; @@ -1093,7 +1097,6 @@ public: unsigned get_backfill_priority(); void mark_clean(); ///< mark an active pg clean - void _change_recovery_force_mode(int new_mode, bool clear); /// return [start,end) bounds for required past_intervals static pair get_required_past_interval_bounds( -- 2.39.5