]> git.apps.os.sepia.ceph.com Git - ceph.git/commitdiff
crush/CrushCompiler: error out as long as parse fails
authorKefu Chai <kchai@redhat.com>
Tue, 20 Sep 2016 06:10:16 +0000 (14:10 +0800)
committerLoic Dachary <ldachary@redhat.com>
Mon, 13 Feb 2017 05:49:27 +0000 (06:49 +0100)
do not output compiled crush map if anything goes wrong when parsing
crush map.

Fixes: http://tracker.ceph.com/issues/17306
Signed-off-by: Kefu Chai <kchai@redhat.com>
(cherry picked from commit b2c0a079dc074c907e1bc429861230096534f597)

src/crush/CrushCompiler.cc
src/test/cli/crushtool/compile-decompile-recompile.t
src/test/cli/crushtool/missing-bucket.crushmap.txt [new file with mode: 0644]

index 22e591348992c12c55ae7207240cba0cff0ace11..b1e4a276349c0bd7f2f4cf09e12ea542cd1b39cd 100644 (file)
@@ -746,8 +746,8 @@ int CrushCompiler::parse_crush(iter_t const& i)
 { 
   find_used_bucket_ids(i);
 
-  int r = 0;
   for (iter_t p = i->children.begin(); p != i->children.end(); p++) {
+    int r = 0;
     switch (p->value.id().to_long()) {
     case crush_grammar::_tunable:
       r = parse_tunable(p);
@@ -767,11 +767,11 @@ int CrushCompiler::parse_crush(iter_t const& i)
     default:
       assert(0);
     }
+    if (r < 0) {
+      return r;
+    }
   }
 
-  if (r < 0)
-    return r;
-
   //err << "max_devices " << crush.get_max_devices() << std::endl;
   crush.finalize();
   
index 67247563b42e89d07f78e6f845316d3c0565fcde..bd1100ccda71c567ff604aec22970fc53c022c5d 100644 (file)
@@ -9,3 +9,7 @@
 # worked
   $ cmp need_tree_order.crush nto.conf
   $ cmp nto.compiled nto.recompiled
+
+  $ crushtool -c missing-bucket.crushmap.txt
+  in rule 'rule-bad' item 'root-404' not defined
+  [1]
diff --git a/src/test/cli/crushtool/missing-bucket.crushmap.txt b/src/test/cli/crushtool/missing-bucket.crushmap.txt
new file mode 100644 (file)
index 0000000..4ef7f44
--- /dev/null
@@ -0,0 +1,39 @@
+device 0 device0
+device 1 device1
+device 2 device2
+device 3 device3
+device 4 device4
+
+type 0 osd
+type 1 domain
+
+domain root {
+       id -1
+       alg straw
+       hash 0
+       item device0 weight 1.000
+       item device1 weight 1.000
+       item device2 weight 1.000
+       item device3 weight 1.000
+       item device4 weight 1.000
+}
+
+rule rule-bad {
+       ruleset 0
+       type replicated
+       min_size 1
+       max_size 10
+       step take root-404
+       step choose firstn 0 type osd
+       step emit
+}
+
+rule rule-good {
+       ruleset 1
+       type erasure
+       min_size 1
+       max_size 10
+       step take root
+       step choose indep 0 type osd
+       step emit
+}