In order to get an accurate cost of the scrub operation for mClock scheduler, we use the cost calculated by the get_scrub_cost() method which takes into account the average of the object sizes in a PG that is queued for a scrub.
Signed-off-by: Aishwarya Mathuria <amathuri@redhat.com>
void OSDService::queue_for_rep_scrub(PG* pg,
Scrub::scrub_prio_t with_priority,
unsigned int qu_priority,
- Scrub::act_token_t act_token)
+ Scrub::act_token_t act_token,
+ uint64_t cost)
{
- queue_scrub_event_msg<PGRepScrub>(pg, with_priority, qu_priority, act_token, get_scrub_cost());
+ queue_scrub_event_msg<PGRepScrub>(pg, with_priority, qu_priority, act_token, cost);
}
void OSDService::queue_for_rep_scrub_resched(PG* pg,
queue_scrub_event_msg_default_cost<PGScrubPushesUpdate>(pg, with_priority);
}
-void OSDService::queue_scrub_chunk_free(PG* pg, Scrub::scrub_prio_t with_priority)
+void OSDService::queue_scrub_chunk_free(PG* pg, Scrub::scrub_prio_t with_priority, uint64_t cost)
{
// Resulting scrub event: 'SelectedChunkFree'
- queue_scrub_event_msg<PGScrubChunkIsFree>(pg, with_priority, get_scrub_cost());
+ queue_scrub_event_msg<PGScrubChunkIsFree>(pg, with_priority, cost);
}
void OSDService::queue_scrub_chunk_busy(PG* pg, Scrub::scrub_prio_t with_priority)
void queue_scrub_applied_update(PG* pg, Scrub::scrub_prio_t with_priority);
/// Signals that the selected chunk (objects range) is available for scrubbing
- void queue_scrub_chunk_free(PG* pg, Scrub::scrub_prio_t with_priority);
+ void queue_scrub_chunk_free(PG* pg, Scrub::scrub_prio_t with_priority, uint64_t cost);
/// The chunk selected is blocked by user operations, and cannot be scrubbed now
void queue_scrub_chunk_busy(PG* pg, Scrub::scrub_prio_t with_priority);
void queue_for_rep_scrub(PG* pg,
Scrub::scrub_prio_t with_high_priority,
unsigned int qu_priority,
- Scrub::act_token_t act_token);
+ Scrub::act_token_t act_token,
+ uint64_t cost);
/// Signals a change in the number of in-flight recovery writes
void queue_scrub_replica_pushes(PG *pg, Scrub::scrub_prio_t with_priority);
void PgScrubber::select_range_n_notify()
{
get_counters_set().inc(scrbcnt_chunks_selected);
-
- if (select_range()) {
+ auto num_chunk_objects = select_range();
+ if (num_chunk_objects.has_value()) {
// the next chunk to handle is not blocked
dout(20) << __func__ << ": selection OK" << dendl;
- m_osds->queue_scrub_chunk_free(m_pg, Scrub::scrub_prio_t::low_priority);
+ auto cost = get_scrub_cost(num_chunk_objects.value());
+ m_osds->queue_scrub_chunk_free(m_pg, Scrub::scrub_prio_t::low_priority, cost);
} else {
// we will wait for the objects range to become available for scrubbing
dout(10) << __func__ << ": selected chunk is busy" << dendl;
set_queued_or_active();
advance_token();
+ const auto& conf = m_pg->get_cct()->_conf;
+ const int max_from_conf = size_from_conf(
+ m_is_deep, conf, "osd_scrub_chunk_max", "osd_shallow_scrub_chunk_max");
+ auto cost = get_scrub_cost(max_from_conf);
m_osds->queue_for_rep_scrub(m_pg,
m_replica_request_priority,
m_flags.priority,
- m_current_token);
+ m_current_token,
+ cost);
}
void PgScrubber::set_op_parameters(const requested_scrub_t& request)