.set_default(30)
.set_description(""),
+ Option("osd_delete_sleep", Option::TYPE_FLOAT, Option::LEVEL_ADVANCED)
+ .set_default(0)
+ .set_description("Time in seconds to sleep before next removal transaction (overrides values below)"),
+
+ Option("osd_delete_sleep_hdd", Option::TYPE_FLOAT, Option::LEVEL_ADVANCED)
+ .set_default(5)
+ .set_description("Time in seconds to sleep before next removal transaction for HDDs"),
+
+ Option("osd_delete_sleep_ssd", Option::TYPE_FLOAT, Option::LEVEL_ADVANCED)
+ .set_default(0)
+ .set_description("Time in seconds to sleep before next removal transaction for SSDs"),
+
+ Option("osd_delete_sleep_hybrid", Option::TYPE_FLOAT, Option::LEVEL_ADVANCED)
+ .set_default(2)
+ .set_description("Time in seconds to sleep before next removal transaction when data is on HDD and journal is on SSD"),
+
Option("osd_failsafe_full_ratio", Option::TYPE_FLOAT, Option::LEVEL_ADVANCED)
.set_default(.97)
.set_description(""),
return cct->_conf->osd_recovery_sleep_hdd;
}
+float OSD::get_osd_delete_sleep()
+{
+ float osd_delete_sleep = cct->_conf->get_val<double>("osd_delete_sleep");
+ if (osd_delete_sleep > 0)
+ return osd_delete_sleep;
+ if (!store_is_rotational && !journal_is_rotational)
+ return cct->_conf->get_val<double>("osd_delete_sleep_ssd");
+ if (store_is_rotational && !journal_is_rotational)
+ return cct->_conf->get_val<double>("osd_delete_sleep_hybrid");
+ return cct->_conf->get_val<double>("osd_delete_sleep_hdd");
+}
+
int OSD::init()
{
CompatSet initial, diff;
int get_num_op_threads();
float get_osd_recovery_sleep();
+ float get_osd_delete_sleep();
void probe_smart(ostream& ss);
int probe_smart_device(const char *device, int timeout, std::string *result);
{
dout(10) << __func__ << dendl;
+ {
+ float osd_delete_sleep = osd->osd->get_osd_delete_sleep();
+ if (osd_delete_sleep > 0 && delete_needs_sleep) {
+ epoch_t e = get_osdmap()->get_epoch();
+ PGRef pgref(this);
+ auto delete_requeue_callback = new FunctionContext([this, pgref, e](int r) {
+ dout(20) << __func__ << " wake up at "
+ << ceph_clock_now()
+ << ", re-queuing delete" << dendl;
+ lock();
+ delete_needs_sleep = false;
+ if (!pg_has_reset_since(e)) {
+ osd->queue_for_pg_delete(get_pgid(), e);
+ }
+ unlock();
+ });
+
+ utime_t delete_schedule_time = ceph_clock_now();
+ delete_schedule_time += osd_delete_sleep;
+ Mutex::Locker l(osd->sleep_lock);
+ osd->sleep_timer.add_event_at(delete_schedule_time,
+ delete_requeue_callback);
+ dout(20) << __func__ << " Delete scheduled at " << delete_schedule_time << dendl;
+ return;
+ }
+ }
+
+ delete_needs_sleep = true;
+
vector<ghobject_t> olist;
int max = std::min(osd->store->get_ideal_list_max(),
(int)cct->_conf->osd_target_transaction_size);
/// most recently consumed osdmap's require_osd_version
unsigned last_require_osd_release = 0;
+ bool delete_needs_sleep = false;
protected:
void reset_min_peer_features() {