]> git.apps.os.sepia.ceph.com Git - ceph.git/commitdiff
osd: Added config param to control fast pg_upmap mode
authorJosh Salomon <josh.salomon@gmail.com>
Sun, 13 Feb 2022 13:24:36 +0000 (15:24 +0200)
committerJosh Salomon <josh.salomon@gmail.com>
Sun, 13 Feb 2022 17:31:55 +0000 (19:31 +0200)
The parameter is "osd_calc_pg_upmaps_aggressively_fast"

Signed-off-by: Josh Salomon <josh.salomon@gmail.com>
src/common/options/global.yaml.in
src/osd/OSDMap.cc

index 9d4ab120ea63daff7967ca4ba2cb71efa68baa5a..06fa9d7511a0d0273f7aaf01cec92e9b64b996e7 100644 (file)
@@ -2382,6 +2382,14 @@ options:
   default: true
   flags:
   - runtime
+- name: osd_calc_pg_upmaps_aggressively_fast
+  type: bool
+  level: advanced
+  desc: Prevent very long (>10 minutes) calculations in some extreme cases (applicable
+    only to aggressive mode)
+  default: true
+  flags:
+  - runtime
 - name: osd_calc_pg_upmaps_local_fallback_retries
   type: uint
   level: advanced
index 513e012e9194d9ded9c0adbcd258b59c20256635..40facd3f83ff94d967700a1f77ea000102025ce8 100644 (file)
@@ -4683,6 +4683,8 @@ int OSDMap::calc_pg_upmaps(
   bool skip_overfull = false;
   auto aggressive =
     cct->_conf.get_val<bool>("osd_calc_pg_upmaps_aggressively");
+  auto fast_aggressive = aggressive &&
+    cct->_conf.get_val<bool>("osd_calc_pg_upmaps_aggressively_fast");
   auto local_fallback_retries =
     cct->_conf.get_val<uint64_t>("osd_calc_pg_upmaps_local_fallback_retries");
     
@@ -4732,7 +4734,7 @@ int OSDMap::calc_pg_upmaps(
       }
       int osd = p->second;
       float deviation = p->first;
-      if (osd_to_skip.count(osd)) {
+      if (fast_aggressive && osd_to_skip.count(osd)) {
        ldout(cct, 20) << " Skipping osd " << osd 
                       << " osd_to_skip size = " << osd_to_skip.size() << dendl;
        continue;
@@ -4835,11 +4837,13 @@ int OSDMap::calc_pg_upmaps(
           goto test_change;
        }
       }
-      if (prev_n_changes == n_changes) {  // no changes for prev OSD
-       osd_to_skip.insert(osd);
-      }
-      else {
-       prev_n_changes = n_changes;
+      if (fast_aggressive) {
+       if (prev_n_changes == n_changes) {  // no changes for prev OSD
+               osd_to_skip.insert(osd);
+       }
+       else {
+               prev_n_changes = n_changes;
+       }
       }
 
     }