]> git.apps.os.sepia.ceph.com Git - ceph-ci.git/commitdiff
osd/scrub: Change scrub cost to use average object size
authorAishwarya Mathuria <amathuri@redhat.com>
Mon, 18 Mar 2024 07:48:34 +0000 (07:48 +0000)
committerAishwarya Mathuria <amathuri@redhat.com>
Wed, 3 Apr 2024 03:56:19 +0000 (03:56 +0000)
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>
src/osd/OSD.cc
src/osd/OSD.h
src/osd/scrubber/pg_scrubber.cc

index 881d0e1d639a75ef70e35e7e1e693d868e2c960d..c451e99dd80493284defb0b8567535a2082cd523 100644 (file)
@@ -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<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,
@@ -1849,10 +1850,10 @@ void OSDService::queue_scrub_pushes_update(PG* pg, Scrub::scrub_prio_t with_prio
   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)
index d810b77abad1ef23369633797c7a33608a9f7498..cfdfeda12398ddcca85a848d647b9bca53c3f1fd 100644 (file)
@@ -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);
index 43a8d6ee1a9d9fac11f84a464e9832f76e69b6dd..7b43eca902731ef2ae22d65de3ef44d5def077ad 100644 (file)
@@ -948,11 +948,12 @@ std::optional<uint64_t> 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)