]> git.apps.os.sepia.ceph.com Git - ceph.git/commitdiff
osd/scrub: fix the handling of deep-scrub when noscrub is set 43521/head
authorRonen Friedman <rfriedma@redhat.com>
Wed, 13 Oct 2021 07:12:09 +0000 (07:12 +0000)
committerRonen Friedman <rfriedma@redhat.com>
Wed, 10 Nov 2021 13:56:46 +0000 (13:56 +0000)
Recent scrub scheduling code errs in (at one location) incorrectly considering noscrub as not
precluding deep-scrub.

Fixes: https://tracker.ceph.com/issues/52901
Signed-off-by: Ronen Friedman <rfriedma@redhat.com>
src/osd/PG.cc

index a68d75ed160d08ae149888b5469f84d5d28cd98b..455eb80a7178c80027a1c82d455dbd51aee989de 100644 (file)
@@ -1485,15 +1485,20 @@ bool PG::verify_periodic_scrub_mode(bool allow_deep_scrub,
 
 std::optional<requested_scrub_t> PG::verify_scrub_mode() const
 {
-  dout(10) << __func__ << " processing pg " << info.pgid << dendl;
-
-  bool allow_deep_scrub = !(get_osdmap()->test_flag(CEPH_OSDMAP_NODEEP_SCRUB) ||
-                           pool.info.has_flag(pg_pool_t::FLAG_NODEEP_SCRUB));
   bool allow_regular_scrub = !(get_osdmap()->test_flag(CEPH_OSDMAP_NOSCRUB) ||
-                              pool.info.has_flag(pg_pool_t::FLAG_NOSCRUB));
+                               pool.info.has_flag(pg_pool_t::FLAG_NOSCRUB));
+  bool allow_deep_scrub = allow_regular_scrub &&
+                          !(get_osdmap()->test_flag(CEPH_OSDMAP_NODEEP_SCRUB) ||
+                            pool.info.has_flag(pg_pool_t::FLAG_NODEEP_SCRUB));
   bool has_deep_errors = (info.stats.stats.sum.num_deep_scrub_errors > 0);
-  bool try_to_auto_repair =
-    (cct->_conf->osd_scrub_auto_repair && get_pgbackend()->auto_repair_supported());
+  bool try_to_auto_repair = (cct->_conf->osd_scrub_auto_repair &&
+                             get_pgbackend()->auto_repair_supported());
+
+  dout(10) << __func__ << " pg: " << info.pgid
+           << " allow: " << allow_regular_scrub << "/" << allow_deep_scrub
+           << " deep errs: " << has_deep_errors
+           << " auto-repair: " << try_to_auto_repair << " ("
+           << cct->_conf->osd_scrub_auto_repair << ")" << dendl;
 
   auto upd_flags = m_planned_scrub;