From: Aishwarya Mathuria Date: Mon, 18 Mar 2024 07:48:34 +0000 (+0000) Subject: osd/scrub: Change scrub cost to use average object size X-Git-Tag: v20.0.0~1775^2~1 X-Git-Url: http://git-server-git.apps.pok.os.sepia.ceph.com/?a=commitdiff_plain;h=5532f6a9d750f8437df16c4624f35adf84b24e07;p=ceph.git osd/scrub: Change scrub cost to use average object size 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 --- diff --git a/src/osd/OSD.cc b/src/osd/OSD.cc index 881d0e1d639..c451e99dd80 100644 --- a/src/osd/OSD.cc +++ b/src/osd/OSD.cc @@ -1822,9 +1822,10 @@ void OSDService::queue_scrub_after_repair(PG* pg, Scrub::scrub_prio_t with_prior 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(pg, with_priority, qu_priority, act_token, get_scrub_cost()); + queue_scrub_event_msg(pg, with_priority, qu_priority, act_token, cost); } void OSDService::queue_for_rep_scrub_resched(PG* pg, @@ -1849,10 +1850,10 @@ void OSDService::queue_scrub_pushes_update(PG* pg, Scrub::scrub_prio_t with_prio queue_scrub_event_msg_default_cost(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(pg, with_priority, get_scrub_cost()); + queue_scrub_event_msg(pg, with_priority, cost); } void OSDService::queue_scrub_chunk_busy(PG* pg, Scrub::scrub_prio_t with_priority) diff --git a/src/osd/OSD.h b/src/osd/OSD.h index d810b77abad..cfdfeda1239 100644 --- a/src/osd/OSD.h +++ b/src/osd/OSD.h @@ -526,7 +526,7 @@ public: 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); @@ -552,7 +552,8 @@ public: 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); diff --git a/src/osd/scrubber/pg_scrubber.cc b/src/osd/scrubber/pg_scrubber.cc index 43a8d6ee1a9..7b43eca9027 100644 --- a/src/osd/scrubber/pg_scrubber.cc +++ b/src/osd/scrubber/pg_scrubber.cc @@ -948,11 +948,12 @@ std::optional PgScrubber::select_range() 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; @@ -1566,10 +1567,15 @@ void PgScrubber::replica_scrub_op(OpRequestRef op) 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)