The osd_scrub_during_recovery config option allows for configuring
if the OSD will schedule a new scrub while recovery is active.
When set to false no new scrubs will be initiated by the OSD while
there are recovery threads active on that OSD.
Signed-off-by: Wido den Hollander <wido@42on.com>
(cherry picked from commit
33f1f6077804dbcbb82a41ef7f6803b5f3365831)
Conflicts:
src/osd/OSD.h (between jewel and kraken, pg recovery methods were moved
from the OSD class to OSDService)
OPTION(osd_max_push_objects, OPT_U64, 10) // max objects in single push op
OPTION(osd_recovery_forget_lost_objects, OPT_BOOL, false) // off for now
OPTION(osd_max_scrubs, OPT_INT, 1)
+OPTION(osd_scrub_during_recovery, OPT_BOOL, true) // Allow new scrubs to start while recovery is active on the OSD
OPTION(osd_scrub_begin_hour, OPT_INT, 0)
OPTION(osd_scrub_end_hour, OPT_INT, 24)
OPTION(osd_scrub_load_threshold, OPT_FLOAT, 0.5)
break;
}
+ if (!cct->_conf->osd_scrub_during_recovery && is_recovery_active()) {
+ dout(10) << __func__ << "not scheduling scrub of " << scrub.pgid << " due to active recovery ops" << dendl;
+ break;
+ }
+
PG *pg = _lookup_lock_pg(scrub.pgid);
if (!pg)
continue;
recovery_wq.unlock();
}
+bool OSD::is_recovery_active()
+{
+ if (recovery_ops_active > 0)
+ return true;
+
+ return false;
+}
+
// =========================================================
// OPS
void start_recovery_op(PG *pg, const hobject_t& soid);
void finish_recovery_op(PG *pg, const hobject_t& soid, bool dequeue);
+ bool is_recovery_active();
void do_recovery(PG *pg, ThreadPool::TPHandle &handle);
bool _recover_now();