]> git-server-git.apps.pok.os.sepia.ceph.com Git - ceph.git/commitdiff
OSDMonitor: use a different approach to prevent extreme multipliers on PG splits
authorGreg Farnum <greg@inktank.com>
Tue, 3 Dec 2013 18:57:09 +0000 (10:57 -0800)
committerGreg Farnum <greg@inktank.com>
Tue, 3 Dec 2013 18:57:09 +0000 (10:57 -0800)
Signed-off-by: Greg Farnum <greg@inktank.com>
src/common/config_opts.h
src/mon/OSDMonitor.cc

index 4d8c2bb02b036b1daa79142bece6a64ab9043ab3..18b2f65d0e9fa023b92f9248bb51d061c883269c 100644 (file)
@@ -148,7 +148,7 @@ OPTION(mon_osd_down_out_subtree_limit, OPT_STR, "rack")   // smallest crush unit
 OPTION(mon_osd_min_up_ratio, OPT_DOUBLE, .3)    // min osds required to be up to mark things down
 OPTION(mon_osd_min_in_ratio, OPT_DOUBLE, .3)   // min osds required to be in to mark things out
 OPTION(mon_osd_max_op_age, OPT_DOUBLE, 32)     // max op age before we get concerned (make it a power of 2)
-OPTION(mon_osd_max_split_ratio, OPT_INT, 8) // largest multiple allowed when doing PG split
+OPTION(mon_osd_max_split_count, OPT_INT, 32) // largest number of PGs per "involved" OSD to let split create
 OPTION(mon_stat_smooth_intervals, OPT_INT, 2)  // smooth stats over last N PGMap maps
 OPTION(mon_lease, OPT_FLOAT, 5)       // lease interval
 OPTION(mon_lease_renew_interval, OPT_FLOAT, 3) // on leader, to renew the lease
index fd7ed80adc1d2397bc0a4cba9a2f389b5365cc3b..9bd516ec995961af6ed135977a2f9c7d00b344f6 100644 (file)
@@ -2806,11 +2806,17 @@ int OSDMonitor::prepare_command_pool_set(map<string,cmd_vartype> &cmdmap,
        return -EEXIST;
       else
        return 0;
-    } else if (n > (int)p.get_pg_num() * g_conf->mon_osd_max_split_ratio) {
-      ss << "specified pg_num " << n << " is too large (> current "
-        << p.get_pg_num() << '*' << g_conf->mon_osd_max_split_ratio << ')';
-      return -E2BIG;
     } else {
+      int expected_osds = MIN(p.get_pg_num(), osdmap.get_num_osds());
+      int64_t new_pgs = n - p.get_pg_num();
+      int64_t pgs_per_osd = new_pgs / expected_osds;
+      if (pgs_per_osd > g_conf->mon_osd_max_split_count) {
+            ss << "specified pg_num " << n << " is too large (creating "
+               << new_pgs << " new PGs on ~" << expected_osds
+               << " OSDs exceeds per-OSD max of" << g_conf->mon_osd_max_split_count
+               << ')';
+            return -E2BIG;
+      }
       for(set<pg_t>::iterator i = mon->pgmon()->pg_map.creating_pgs.begin();
          i != mon->pgmon()->pg_map.creating_pgs.end();
          ++i) {