]> git.apps.os.sepia.ceph.com Git - ceph.git/commitdiff
CrushWrapper: validate default replicated ruleset config opt
authorIlya Dryomov <idryomov@gmail.com>
Fri, 15 May 2015 18:44:27 +0000 (21:44 +0300)
committerIlya Dryomov <idryomov@gmail.com>
Wed, 27 May 2015 12:05:10 +0000 (15:05 +0300)
Validate osd_pool_default_crush_{replicated_ruleset,rule} config
options, in particular when creating pools.  Otherwise "ceph osd pool
create foo <pg_num>" may end up creating pools with non-existent
rulesets.

Signed-off-by: Ilya Dryomov <idryomov@gmail.com>
src/crush/CrushWrapper.cc
src/osd/OSDMap.cc
src/test/mon/osd-pool-create.sh

index fcf8b59c7d630582f5d4c1605f8790ba0797c689..db7f6dd08a472ef4363aa62a62c75f3c64c70303 100644 (file)
@@ -1645,6 +1645,8 @@ int CrushWrapper::get_osd_pool_default_crush_replicated_ruleset(CephContext *cct
                                                                      false);
   if (crush_ruleset == CEPH_DEFAULT_CRUSH_REPLICATED_RULESET) {
     crush_ruleset = find_first_ruleset(pg_pool_t::TYPE_REPLICATED);
+  } else if (!ruleset_exists(crush_ruleset)) {
+    crush_ruleset = -1; // match find_first_ruleset() retval
   }
 
   return crush_ruleset;
index 963f6ea6733e433a01be6c54baa7913a0472e04c..4ce89840204c9322ba2b145803bccf2f02dfe638 100644 (file)
@@ -2671,6 +2671,7 @@ int OSDMap::build_simple(CephContext *cct, epoch_t e, uuid_d &fsid,
     r = build_simple_crush_map(cct, *crush, nosd, &ss);
   else
     r = build_simple_crush_map_from_conf(cct, *crush, &ss);
+  assert(r == 0);
 
   int poolbase = get_max_osd() ? get_max_osd() : 1;
 
@@ -2701,9 +2702,6 @@ int OSDMap::build_simple(CephContext *cct, epoch_t e, uuid_d &fsid,
     name_pool[*p] = pool;
   }
 
-  if (r < 0)
-    lderr(cct) << ss.str() << dendl;
-  
   for (int i=0; i<get_max_osd(); i++) {
     set_state(i, 0);
     set_weight(i, CEPH_OSD_OUT);
index 820d00c20d94bd5b88f516ca93fa8844e6a0ca4c..c967a962da089cb30459233c278ed70e1e2dd579 100755 (executable)
@@ -187,6 +187,42 @@ function TEST_replicated_pool_with_ruleset() {
         grep "doesn't exist" || return 1
 }
 
+function TEST_replicated_pool_with_non_existent_default_ruleset_0() {
+    local dir=$1
+    run_mon $dir a || return 1
+    # change the default crush rule
+    ./ceph tell mon.a injectargs -- \
+        --osd_pool_default_crush_replicated_ruleset 66 || return 1
+    ./ceph osd pool create mypool 12 12 replicated 2>&1 | \
+        grep "No suitable CRUSH ruleset exists" || return 1
+    CEPH_ARGS='' ./ceph --admin-daemon $dir/ceph-mon.a.asok log flush || return 1
+    ! grep "osd_pool_default_crush_rule is deprecated " $dir/mon.a.log || return 1
+}
+
+function TEST_replicated_pool_with_non_existent_default_ruleset_1() {
+    local dir=$1
+    run_mon $dir a || return 1
+    # change the default crush rule using deprecated option
+    ./ceph tell mon.a injectargs -- \
+        --osd_pool_default_crush_rule 55 || return 1
+    ./ceph osd pool create mypool 12 12 replicated 2>&1 | \
+        grep "No suitable CRUSH ruleset exists" || return 1
+    CEPH_ARGS='' ./ceph --admin-daemon $dir/ceph-mon.a.asok log flush || return 1
+    grep "osd_pool_default_crush_rule is deprecated " $dir/mon.a.log || return 1
+}
+
+function TEST_replicated_pool_with_non_existent_default_ruleset_2() {
+    local dir=$1
+    run_mon $dir a || return 1
+    ./ceph tell mon.a injectargs -- \
+        --osd_pool_default_crush_rule 77 \
+        --osd_pool_default_crush_replicated_ruleset 33 || return 1
+    ./ceph osd pool create mypool 12 12 replicated 2>&1 | \
+        grep "No suitable CRUSH ruleset exists" || return 1
+    CEPH_ARGS='' ./ceph --admin-daemon $dir/ceph-mon.a.asok log flush || return 1
+    grep "osd_pool_default_crush_rule is deprecated " $dir/mon.a.log || return 1
+}
+
 function TEST_erasure_code_pool_lrc() {
     local dir=$1
     run_mon $dir a || return 1