{
MOSDForceRecovery *msg = static_cast<MOSDForceRecovery*>(m);
assert(msg->get_type() == MSG_OSD_FORCE_RECOVERY);
- RWLock::RLocker l(pg_map_lock);
- vector<PG*> local_pgs;
+ vector<PGRef> local_pgs;
local_pgs.reserve(msg->forced_pgs.size());
- for (auto& i : msg->forced_pgs) {
- spg_t locpg;
- if (osdmap->get_primary_shard(i, &locpg)) {
- auto pg_map_entry = pg_map.find(locpg);
- if (pg_map_entry != pg_map.end()) {
- local_pgs.push_back(pg_map_entry->second);
+ {
+ RWLock::RLocker l(pg_map_lock);
+ for (auto& i : msg->forced_pgs) {
+ spg_t locpg;
+ if (osdmap->get_primary_shard(i, &locpg)) {
+ auto pg_map_entry = pg_map.find(locpg);
+ if (pg_map_entry != pg_map.end()) {
+ local_pgs.push_back(pg_map_entry->second);
+ }
}
}
}
}
-void OSDService::adjust_pg_priorities(vector<PG*> pgs, int newflags)
+void OSDService::adjust_pg_priorities(const vector<PGRef>& pgs, int newflags)
{
if (!pgs.size() || !(newflags & (OFR_BACKFILL | OFR_RECOVERY)))
return;
int newstate = 0;
- Mutex::Locker l(recovery_lock);
-
if (newflags & OFR_BACKFILL) {
newstate = PG_STATE_FORCED_BACKFILL;
} else if (newflags & OFR_RECOVERY) {
if (newflags & OFR_CANCEL) {
for (auto& i : pgs) {
- i->change_recovery_force_mode(newstate, true);
+ i->lock();
+ i->_change_recovery_force_mode(newstate, true);
+ i->unlock();
}
} 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_BACKFILL))) )
- i->change_recovery_force_mode(newstate, false);
+ i->_change_recovery_force_mode(newstate, false);
+ i->unlock();
}
}
}
kick_snap_trim();
}
-void PG::change_recovery_force_mode(int new_mode, bool clear)
+void PG::_change_recovery_force_mode(int new_mode, bool clear)
{
- lock(true);
- if (clear) {
- state_clear(new_mode);
- } else {
- state_set(new_mode);
+ 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);
+ }
+ publish_stats_to_osd();
}
- publish_stats_to_osd();
-
- unlock();
}
inline int PG::clamp_recovery_priority(int priority)
unsigned get_backfill_priority();
void mark_clean(); ///< mark an active pg clean
- void change_recovery_force_mode(int new_mode, bool clear);
+ void _change_recovery_force_mode(int new_mode, bool clear);
/// return [start,end) bounds for required past_intervals
static pair<epoch_t, epoch_t> get_required_past_interval_bounds(