From: Sage Weil Date: Thu, 20 Jul 2017 21:59:11 +0000 (-0400) Subject: crush/CrushCompiler: enforce buckets before rules rule X-Git-Tag: v12.1.2~183^2~1 X-Git-Url: http://git.apps.os.sepia.ceph.com/?a=commitdiff_plain;h=c39ebd62abffebe8e53a4acffccf873cc3239d38;p=ceph-ci.git crush/CrushCompiler: enforce buckets before rules rule Signed-off-by: Sage Weil --- diff --git a/src/crush/CrushCompiler.cc b/src/crush/CrushCompiler.cc index af0dd875848..d59fdaaff5c 100644 --- a/src/crush/CrushCompiler.cc +++ b/src/crush/CrushCompiler.cc @@ -757,8 +757,6 @@ int CrushCompiler::parse_bucket(iter_t const& i) int CrushCompiler::parse_rule(iter_t const& i) { - crush.populate_classes(); - int start; // rule name is optional! string rname = string_node(i->children[1]); @@ -1063,7 +1061,7 @@ void CrushCompiler::find_used_bucket_ids(iter_t const& i) int CrushCompiler::parse_crush(iter_t const& i) { find_used_bucket_ids(i); - + bool saw_rule = false; for (iter_t p = i->children.begin(); p != i->children.end(); p++) { int r = 0; switch (p->value.id().to_long()) { @@ -1076,10 +1074,18 @@ int CrushCompiler::parse_crush(iter_t const& i) case crush_grammar::_bucket_type: r = parse_bucket_type(p); break; - case crush_grammar::_bucket: + case crush_grammar::_bucket: + if (saw_rule) { + err << "buckets must be defined before rules" << std::endl; + return -1; + } r = parse_bucket(p); break; - case crush_grammar::_crushrule: + case crush_grammar::_crushrule: + if (!saw_rule) { + saw_rule = true; + crush.populate_classes(); + } r = parse_rule(p); break; case crush_grammar::_choose_args: