desc: Cost for scrub operations in work queue
default: 50_M
with_legacy: true
+- name: osd_scrub_event_cost
+ type: size
+ level: advanced
+ desc: Cost for each scrub operation, used when osd_op_queue=mclock_scheduler
+ default: 4_K
+ with_legacy: true
# set requested scrub priority higher than scrub priority to make the
# requested scrubs jump the queue of scheduled scrubs
- name: osd_requested_scrub_priority
auto msg = new MSG_TYPE(pg->get_pgid(), epoch, act_token);
dout(15) << "queue a scrub event (" << *msg << ") for " << *pg
<< ". Epoch: " << epoch << " token: " << act_token << dendl;
-
enqueue_back(OpSchedulerItem(
- unique_ptr<OpSchedulerItem::OpQueueable>(msg), cct->_conf->osd_scrub_cost,
+ unique_ptr<OpSchedulerItem::OpQueueable>(msg), get_scrub_cost(),
pg->scrub_requeue_priority(with_priority, qu_priority), ceph_clock_now(), 0, epoch));
}
const auto epoch = pg->get_osdmap_epoch();
auto msg = new MSG_TYPE(pg->get_pgid(), epoch);
dout(15) << "queue a scrub event (" << *msg << ") for " << *pg << ". Epoch: " << epoch << dendl;
-
enqueue_back(OpSchedulerItem(
- unique_ptr<OpSchedulerItem::OpQueueable>(msg), cct->_conf->osd_scrub_cost,
+ unique_ptr<OpSchedulerItem::OpQueueable>(msg), get_scrub_cost(),
pg->scrub_requeue_priority(with_priority), ceph_clock_now(), 0, epoch));
}
+int64_t OSDService::get_scrub_cost()
+{
+
+ int64_t cost_for_queue = cct->_conf->osd_scrub_cost;
+ if (cct->_conf->osd_op_queue == "mclock_scheduler") {
+ cost_for_queue = cct->_conf->osd_scrub_event_cost *
+ cct->_conf->osd_shallow_scrub_chunk_max;
+ }
+ return cost_for_queue;
+}
+
void OSDService::queue_for_scrub(PG* pg, Scrub::scrub_prio_t with_priority)
{
queue_scrub_event_msg<PGScrub>(pg, with_priority);
/// provided by the executing scrub (i.e. taken from PgScrubber::m_flags)
template <class MSG_TYPE>
void queue_scrub_event_msg(PG* pg, Scrub::scrub_prio_t with_priority);
+ int64_t get_scrub_cost();
utime_t defer_recovery_until;
uint64_t recovery_ops_active;