Option("osd_max_backfills", Option::TYPE_UINT, Option::LEVEL_ADVANCED)
.set_default(1)
+ .set_flag(Option::FLAG_RUNTIME)
.set_description("Maximum number of concurrent local and remote backfills or recoveries per OSD ")
.set_long_description("There can be osd_max_backfills local reservations AND the same remote reservations per OSD. So a value of 1 lets this OSD participate as 1 PG primary in recovery and 1 shard of another recovering PG."),
Option("osd_recovery_sleep", Option::TYPE_FLOAT, Option::LEVEL_ADVANCED)
.set_default(0)
+ .set_flag(Option::FLAG_RUNTIME)
.set_description("Time in seconds to sleep before next recovery or backfill op"),
Option("osd_recovery_sleep_hdd", Option::TYPE_FLOAT, Option::LEVEL_ADVANCED)
.set_default(0.1)
+ .set_flag(Option::FLAG_RUNTIME)
.set_description("Time in seconds to sleep before next recovery or backfill op for HDDs"),
Option("osd_recovery_sleep_ssd", Option::TYPE_FLOAT, Option::LEVEL_ADVANCED)
.set_default(0)
+ .set_flag(Option::FLAG_RUNTIME)
.set_description("Time in seconds to sleep before next recovery or backfill op for SSDs")
.add_see_also("osd_recovery_sleep"),
Option("osd_recovery_sleep_hybrid", Option::TYPE_FLOAT, Option::LEVEL_ADVANCED)
.set_default(0.025)
+ .set_flag(Option::FLAG_RUNTIME)
.set_description("Time in seconds to sleep before next recovery or backfill op when data is on HDD and journal is on SSD")
.add_see_also("osd_recovery_sleep"),
Option("osd_recovery_max_active", Option::TYPE_UINT, Option::LEVEL_ADVANCED)
.set_default(0)
+ .set_flag(Option::FLAG_RUNTIME)
.set_description("Number of simultaneous active recovery operations per OSD (overrides _ssd and _hdd if non-zero)")
.add_see_also("osd_recovery_max_active_hdd")
.add_see_also("osd_recovery_max_active_ssd"),
Option("osd_recovery_max_active_hdd", Option::TYPE_UINT, Option::LEVEL_ADVANCED)
.set_default(3)
+ .set_flag(Option::FLAG_RUNTIME)
.set_description("Number of simultaneous active recovery operations per OSD (for rotational devices)")
.add_see_also("osd_recovery_max_active")
.add_see_also("osd_recovery_max_active_ssd"),
Option("osd_recovery_max_active_ssd", Option::TYPE_UINT, Option::LEVEL_ADVANCED)
.set_default(10)
+ .set_flag(Option::FLAG_RUNTIME)
.set_description("Number of simultaneous active recovery operations per OSD (for non-rotational solid state devices)")
.add_see_also("osd_recovery_max_active")
.add_see_also("osd_recovery_max_active_hdd"),
Option("osd_async_recovery_min_cost", Option::TYPE_UINT, Option::LEVEL_ADVANCED)
.set_default(100)
+ .set_flag(Option::FLAG_RUNTIME)
.set_description("A mixture measure of number of current log entries difference "
"and historical missing objects, above which we switch to use "
"asynchronous recovery when appropriate"),
"osd_map_cache_size",
"osd_pg_epoch_max_lag_factor",
"osd_pg_epoch_persisted_max_stale",
+ "osd_recovery_sleep",
+ "osd_recovery_sleep_hdd",
+ "osd_recovery_sleep_ssd",
+ "osd_recovery_sleep_hybrid",
+ "osd_recovery_max_active",
+ "osd_recovery_max_active_hdd",
+ "osd_recovery_max_active_ssd",
+ "osd_async_recovery_min_cost",
// clog & admin clog
"clog_to_monitors",
"clog_to_syslog",
const std::set <std::string> &changed)
{
std::lock_guard l{osd_lock};
- if (changed.count("osd_max_backfills")) {
- service.local_reserver.set_max(cct->_conf->osd_max_backfills);
- service.remote_reserver.set_max(cct->_conf->osd_max_backfills);
+
+ if (changed.count("osd_max_backfills") ||
+ 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_max_active") ||
+ changed.count("osd_recovery_max_active_hdd") ||
+ changed.count("osd_recovery_max_active_ssd") ||
+ changed.count("osd_async_recovery_min_cost")) {
+ if (cct->_conf.get_val<std::string>("osd_op_queue") == "mclock_scheduler" &&
+ cct->_conf.get_val<std::string>("osd_mclock_profile") != "custom") {
+ // Set ceph config option to meet QoS goals
+ // Set async_recovery_min_cost
+ cct->_conf.set_val("osd_async_recovery_min_cost", std::to_string(100));
+ // Set high value for recovery max active
+ uint32_t recovery_max_active = 1000;
+ if (cct->_conf->osd_recovery_max_active) {
+ cct->_conf.set_val(
+ "osd_recovery_max_active", std::to_string(recovery_max_active));
+ }
+ if (store_is_rotational) {
+ cct->_conf.set_val(
+ "osd_recovery_max_active_hdd", std::to_string(recovery_max_active));
+ } else {
+ cct->_conf.set_val(
+ "osd_recovery_max_active_ssd", std::to_string(recovery_max_active));
+ }
+ // Set high value for osd_max_backfill
+ cct->_conf.set_val("osd_max_backfills", std::to_string(1000));
+
+ // Disable recovery sleep
+ cct->_conf.set_val("osd_recovery_sleep", std::to_string(0));
+ cct->_conf.set_val("osd_recovery_sleep_hdd", std::to_string(0));
+ cct->_conf.set_val("osd_recovery_sleep_ssd", std::to_string(0));
+ cct->_conf.set_val("osd_recovery_sleep_hybrid", std::to_string(0));
+ } else {
+ service.local_reserver.set_max(cct->_conf->osd_max_backfills);
+ service.remote_reserver.set_max(cct->_conf->osd_max_backfills);
+ }
}
if (changed.count("osd_min_recovery_priority")) {
service.local_reserver.set_min_priority(cct->_conf->osd_min_recovery_priority);