- osd_recovery_sleep
flags:
- runtime
+- name: osd_recovery_sleep_degraded
+ type: float
+ level: advanced
+ desc: Time in seconds to sleep before next recovery or backfill op when PGs are degraded.
+ This setting overrides _ssd, _hdd, and _hybrid if non-zero.
+ fmt_desc: Time in seconds to sleep before the next recovery or backfill op when PGs
+ are degraded. Increasing this value will slow down recovery ops while client
+ ops will be less impacted.
+ default: 0
+ flags:
+ - runtime
+- name: osd_recovery_sleep_degraded_hdd
+ type: float
+ level: advanced
+ desc: Time in seconds to sleep before next recovery or backfill op for HDDs
+ when PGs is degraded.
+ fmt_desc: Time in seconds to sleep before next recovery or backfill op
+ for HDDs when PGs are degraded.
+ default: 0.1
+ flags:
+ - runtime
+- name: osd_recovery_sleep_degraded_ssd
+ type: float
+ level: advanced
+ desc: Time in seconds to sleep before next recovery or backfill op for SSDs
+ when PGs are degraded.
+ fmt_desc: Time in seconds to sleep before the next recovery or backfill op
+ for SSDs when PGs are degraded.
+ default: 0
+ see_also:
+ - osd_recovery_sleep_degraded
+ flags:
+ - runtime
+- name: osd_recovery_sleep_degraded_hybrid
+ type: float
+ level: advanced
+ desc: Time in seconds to sleep before next recovery or backfill op when PGs
+ are degraded and data is on HDD and journal is on SSD
+ fmt_desc: Time in seconds to sleep before the next recovery or backfill op when
+ PGs are degraded and OSD data is on HDD and OSD journal / WAL+DB is on SSD.
+ default: 0.025
+ see_also:
+ - osd_recovery_sleep_degraded
+ flags:
+ - runtime
- name: osd_snap_trim_sleep
type: float
level: advanced
return cct->_conf->osd_recovery_sleep_hdd;
}
+float OSD::get_osd_recovery_sleep_degraded() {
+ float osd_recovery_sleep_degraded =
+ cct->_conf.get_val<double>("osd_recovery_sleep_degraded");
+ if (osd_recovery_sleep_degraded > 0) {
+ return osd_recovery_sleep_degraded;
+ }
+ if (!store_is_rotational && !journal_is_rotational) {
+ return cct->_conf.get_val<double>("osd_recovery_sleep_degraded_ssd");
+ } else if (store_is_rotational && !journal_is_rotational) {
+ return cct->_conf.get_val<double>("osd_recovery_sleep_degraded_hybrid");
+ } else {
+ return cct->_conf.get_val<double>("osd_recovery_sleep_degraded_hdd");
+ }
+}
+
float OSD::get_osd_delete_sleep()
{
float osd_delete_sleep = cct->_conf.get_val<double>("osd_delete_sleep");
* ops are scheduled after osd_recovery_sleep amount of time from the previous
* recovery event's schedule time. This is done by adding a
* recovery_requeue_callback event, which re-queues the recovery op using
- * queue_recovery_after_sleep.
+ * queue_recovery_after_sleep. (osd_recovery_sleep_degraded will be
+ * used instead of osd_recovery_sleep when pg is degraded)
*/
- float recovery_sleep = get_osd_recovery_sleep();
+ float recovery_sleep = pg->is_degraded()
+ ? get_osd_recovery_sleep_degraded()
+ : get_osd_recovery_sleep();
{
std::lock_guard l(service.sleep_lock);
if (recovery_sleep > 0 && service.recovery_needs_sleep) {
"osd_recovery_sleep_hdd"s,
"osd_recovery_sleep_ssd"s,
"osd_recovery_sleep_hybrid"s,
+ "osd_recovery_sleep_degraded"s,
+ "osd_recovery_sleep_degraded_hdd"s,
+ "osd_recovery_sleep_degraded_ssd"s,
+ "osd_recovery_sleep_degraded_hybrid"s,
"osd_delete_sleep"s,
"osd_delete_sleep_hdd"s,
"osd_delete_sleep_ssd"s,
changed.count("osd_recovery_sleep") ||
changed.count("osd_recovery_sleep_hdd") ||
changed.count("osd_recovery_sleep_ssd") ||
- changed.count("osd_recovery_sleep_hybrid")) {
+ changed.count("osd_recovery_sleep_hybrid") ||
+ changed.count("osd_recovery_sleep_degraded") ||
+ changed.count("osd_recovery_sleep_degraded_hdd") ||
+ changed.count("osd_recovery_sleep_degraded_ssd") ||
+ changed.count("osd_recovery_sleep_degraded_hybrid")) {
maybe_override_sleep_options_for_qos();
}
if (changed.count("osd_min_recovery_priority")) {
cct->_conf.set_val("osd_recovery_sleep_ssd", std::to_string(0));
cct->_conf.set_val("osd_recovery_sleep_hybrid", std::to_string(0));
+ // Disable recovery sleep for pg degraded
+ cct->_conf.set_val("osd_recovery_sleep_degraded", std::to_string(0));
+ cct->_conf.set_val("osd_recovery_sleep_degraded_hdd", std::to_string(0));
+ cct->_conf.set_val("osd_recovery_sleep_degraded_ssd", std::to_string(0));
+ cct->_conf.set_val("osd_recovery_sleep_degraded_hybrid", std::to_string(0));
+
// Disable delete sleep
cct->_conf.set_val("osd_delete_sleep", std::to_string(0));
cct->_conf.set_val("osd_delete_sleep_hdd", std::to_string(0));
public:
int pg_stat_adjust(osd_stat_t *new_stat);
+ bool is_degraded() const { return recovery_state.is_degraded(); }
protected:
bool delete_needs_sleep = false;
bool is_backfill_unfound() const { return recovery_state.is_backfill_unfound(); }
bool is_incomplete() const { return recovery_state.is_incomplete(); }
bool is_clean() const { return recovery_state.is_clean(); }
- bool is_degraded() const { return recovery_state.is_degraded(); }
bool is_undersized() const { return recovery_state.is_undersized(); }
bool is_scrubbing() const { return state_test(PG_STATE_SCRUBBING); } // Primary only
bool is_remapped() const { return recovery_state.is_remapped(); }