]> git-server-git.apps.pok.os.sepia.ceph.com Git - ceph.git/commitdiff
osd: require osd_pg_max_concurrent_snap_trims > 0 45323/head
authorDan van der Ster <daniel.vanderster@cern.ch>
Thu, 24 Feb 2022 08:42:00 +0000 (09:42 +0100)
committerLaura Flores <lflores@redhat.com>
Wed, 9 Mar 2022 16:58:13 +0000 (16:58 +0000)
If osd_pg_max_concurrent_snap_trims is zero, we mistakenly clear
the snaptrim queue. Require it to be > 0.

Fixes: https://tracker.ceph.com/issues/54396
Signed-off-by: Dan van der Ster <daniel.vanderster@cern.ch>
(cherry picked from commit 29545b617b3b0324f9b0b20e032e3e38557115eb)

Conflicts:
src/common/options/global.yaml.in
- This file does not exist in Pacific; rather, global options are defined in src/common/options.cc.

src/common/options.cc
src/osd/PrimaryLogPG.cc
src/osd/SnapMapper.cc

index 82db7846e7f1c06e72f14a797710f0625d720162..f22b65172716e52913fcd76e2bc8053c4be7b518 100644 (file)
@@ -3284,6 +3284,7 @@ std::vector<Option> get_global_options() {
 
     Option("osd_pg_max_concurrent_snap_trims", Option::TYPE_UINT, Option::LEVEL_ADVANCED)
     .set_default(2)
+    .set_min(1)
     .set_description(""),
 
     Option("osd_max_trimming_pgs", Option::TYPE_UINT, Option::LEVEL_ADVANCED)
index ff97b21e0e4cb73702f8a9399d122bf032084dd6..5f4f9c1a2143fb997aac94be3713d8f76b9e84d1 100644 (file)
@@ -15263,6 +15263,9 @@ boost::statechart::result PrimaryLogPG::AwaitAsyncWork::react(const DoSnapWork&)
 
   vector<hobject_t> to_trim;
   unsigned max = pg->cct->_conf->osd_pg_max_concurrent_snap_trims;
+  // we need to look for at least 1 snaptrim, otherwise we'll misinterpret
+  // the ENOENT below and erase snap_to_trim.
+  ceph_assert(max > 0);
   to_trim.reserve(max);
   int r = pg->snap_mapper.get_next_objects_to_trim(
     snap_to_trim,
index 912c539b8bcf886dd4416264d2f937498918ce93..07c6f57c78ae4ac0efbdc01a4f947b520a3feb71 100644 (file)
@@ -322,6 +322,10 @@ int SnapMapper::get_next_objects_to_trim(
 {
   ceph_assert(out);
   ceph_assert(out->empty());
+
+  // if max would be 0, we return ENOENT and the caller would mistakenly
+  // trim the snaptrim queue
+  ceph_assert(max > 0);
   int r = 0;
   for (set<string>::iterator i = prefixes.begin();
        i != prefixes.end() && out->size() < max && r == 0;