]> git-server-git.apps.pok.os.sepia.ceph.com Git - ceph.git/commitdiff
crush: When consider rule size use the correct method. 10861/head
authorsongbaisen <song.baisen@zte.com.cn>
Mon, 25 Apr 2016 02:34:42 +0000 (10:34 +0800)
committerLoic Dachary <ldachary@redhat.com>
Thu, 25 Aug 2016 11:50:53 +0000 (13:50 +0200)
Signed-off-by: song baisen <song.baisen@zte.com.cn>
(cherry picked from commit 4cf4791ea1200528ccc0d65b3d4a0fbc234c5df0)

src/crush/CrushWrapper.h
src/mon/OSDMonitor.cc

index 1f9c8789d90990f3dd2b47184655d5b1ac494823..9615d9e8d30f6451847752436dc9f81b5bb5fe00 100644 (file)
@@ -1094,6 +1094,32 @@ public:
     for (int i=0; i<numrep; i++)
       out[i] = rawout[i];
   }
+  
+  bool check_crush_rule(int ruleset, int type, int size,  ostream& ss) {
+   
+    assert(crush);    
+
+    __u32 i;
+    for (i = 0; i < crush->max_rules; i++) {
+      if (crush->rules[i] &&
+          crush->rules[i]->mask.ruleset == ruleset &&
+          crush->rules[i]->mask.type == type) {
+
+        if (crush->rules[i]->mask.min_size <= size &&
+            crush->rules[i]->mask.max_size >= size) {
+          return true;
+        } else if (size < crush->rules[i]->mask.min_size) {
+          ss << "pool size is smaller than the crush rule min size";
+          return false;
+        } else {
+          ss << "pool size is bigger than the crush rule max size";
+          return false;
+        }
+      }
+    }
+
+    return false;
+  }
 
   int read_from_file(const char *fn) {
     bufferlist bl;
index da9cd6735a020abfc1f5e074bc7b3e16ac54fd9f..796a4b560d6c93fa8e140defb3b6e7c14a310a26 100644 (file)
@@ -4793,18 +4793,11 @@ int OSDMonitor::prepare_new_pool(string& name, uint64_t auid,
     dout(10) << " prepare_pool_size returns " << r << dendl;
     return r;
   }
-  const int64_t minsize = osdmap.crush->get_rule_mask_min_size(crush_ruleset);
-  if ((int64_t)size < minsize) {
-    *ss << "pool size " << size << " is smaller than crush ruleset name "
-        << crush_ruleset_name << " min size " << minsize;
-    return -EINVAL;
-  }
-  const int64_t maxsize = osdmap.crush->get_rule_mask_max_size(crush_ruleset);
-  if ((int64_t)size > maxsize) {
-    *ss << "pool size " << size << " is bigger than crush ruleset name "
-        << crush_ruleset_name << " max size " << maxsize;
+
+  if (!osdmap.crush->check_crush_rule(crush_ruleset, pool_type, size, *ss)) {
     return -EINVAL;
   }
+
   uint32_t stripe_width = 0;
   r = prepare_pool_stripe_width(pool_type, erasure_code_profile, &stripe_width, ss);
   if (r) {
@@ -5148,17 +5141,8 @@ int OSDMonitor::prepare_command_pool_set(map<string,cmd_vartype> &cmdmap,
       ss << "crush ruleset " << n << " does not exist";
       return -ENOENT;
     }
-    const int64_t poolsize = p.get_size();
-    const int64_t minsize = osdmap.crush->get_rule_mask_min_size(n);
-    if (poolsize < minsize) {
-      ss << "pool size " << poolsize << " is smaller than crush ruleset " 
-         << n << " min size " << minsize;
-      return -EINVAL;
-    }
-    const int64_t maxsize = osdmap.crush->get_rule_mask_max_size(n);
-    if (poolsize > maxsize) {
-      ss << "pool size " << poolsize << " is bigger than crush ruleset " 
-         << n << " max size " << maxsize;
+
+    if (!osdmap.crush->check_crush_rule(n, p.get_type(), p.get_size(), ss)) {
       return -EINVAL;
     }
     p.crush_ruleset = n;