]> git-server-git.apps.pok.os.sepia.ceph.com Git - ceph.git/commitdiff
mon: check min_size range.
authorJianpeng Ma <jianpeng.ma@intel.com>
Thu, 8 Jan 2015 05:50:01 +0000 (13:50 +0800)
committerJianpeng Ma <jianpeng.ma@intel.com>
Tue, 13 Jan 2015 06:27:36 +0000 (14:27 +0800)
When set min_size value:
A:for replicated pool, the value must be between in 1 and size
B:for erasure pool, the value must be between in data_chunk_count)
 and size(data_chunk_count + code_chunk_count).

Signed-off-by: Jianpeng Ma <jianpeng.ma@intel.com>
src/mon/OSDMonitor.cc

index 97ed96e9d2b970b232b22c8fbe34da0a1066b4d3..6f4ce931ebdea941ef47f3c2ca819f3e08f3c2fd 100644 (file)
@@ -3872,6 +3872,29 @@ int OSDMonitor::prepare_command_pool_set(map<string,cmd_vartype> &cmdmap,
       ss << "error parsing integer value '" << val << "': " << interr;
       return -EINVAL;
     }
+
+    if (p.type != pg_pool_t::TYPE_ERASURE) {
+      if (n < 1 || n > p.size) {
+       ss << "pool min_size must be between 1 and " << (int)p.size;
+       return -EINVAL;
+      }
+    } else {
+       ErasureCodeInterfaceRef erasure_code;
+       int k;
+       stringstream tmp;
+       int err = get_erasure_code(p.erasure_code_profile, &erasure_code, tmp);
+       if (err == 0) {
+        k = erasure_code->get_data_chunk_count();
+       } else {
+        ss << __func__ << " get_erasure_code failed: " << tmp;
+        return err;;
+       }
+
+       if (n < k || n > p.size) {
+        ss << "pool min_size must be between " << k << " and " << (int)p.size;
+        return -EINVAL;
+       }
+    }
     p.min_size = n;
   } else if (var == "auid") {
     if (interr.length()) {