From aa238e5ed50f44a94caf84567267e4f6be8732a2 Mon Sep 17 00:00:00 2001 From: Sage Weil Date: Fri, 18 Sep 2015 09:40:13 -0400 Subject: [PATCH] crush/CrushTester: allow testing by ruleset Signed-off-by: Sage Weil --- src/crush/CrushTester.cc | 14 +++++++++++++- src/crush/CrushTester.h | 9 ++++++++- src/tools/crushtool.cc | 8 +++++++- 3 files changed, 28 insertions(+), 3 deletions(-) diff --git a/src/crush/CrushTester.cc b/src/crush/CrushTester.cc index 209d03a9f1019..086383385b120 100644 --- a/src/crush/CrushTester.cc +++ b/src/crush/CrushTester.cc @@ -355,7 +355,9 @@ void CrushTester::write_integer_indexed_scalar_data_string(vector &dst, dst.push_back( data_buffer.str() ); } -int CrushTester::test_with_crushtool(const char *crushtool_cmd, int max_id, int timeout) +int CrushTester::test_with_crushtool(const char *crushtool_cmd, + int max_id, int timeout, + int ruleset) { SubProcessTimed crushtool(crushtool_cmd, true, false, true, timeout); string opt_max_id = boost::lexical_cast(max_id); @@ -365,6 +367,12 @@ int CrushTester::test_with_crushtool(const char *crushtool_cmd, int max_id, int "--min-x", "1", "--max-x", "50", NULL); + if (ruleset >= 0) { + crushtool.add_cmd_args( + "--ruleset", + stringify(ruleset).c_str(), + NULL); + } int ret = crushtool.spawn(); if (ret != 0) { err << "failed run crushtool: " << crushtool.err(); @@ -491,6 +499,10 @@ int CrushTester::test() err << "rule " << r << " dne" << std::endl; continue; } + if (ruleset >= 0 && + crush.get_rule_mask_ruleset(r) != ruleset) { + continue; + } int minr = min_rep, maxr = max_rep; if (min_rep < 0 || max_rep < 0) { minr = crush.get_rule_mask_min_size(r); diff --git a/src/crush/CrushTester.h b/src/crush/CrushTester.h index ed14761462ac9..2f1a2c60e7537 100644 --- a/src/crush/CrushTester.h +++ b/src/crush/CrushTester.h @@ -15,6 +15,7 @@ class CrushTester { map device_weight; int min_rule, max_rule; + int ruleset; int min_x, max_x; int min_rep, max_rep; @@ -168,6 +169,7 @@ public: CrushTester(CrushWrapper& c, ostream& eo) : crush(c), err(eo), min_rule(-1), max_rule(-1), + ruleset(-1), min_x(-1), max_x(-1), min_rep(-1), max_rep(-1), num_batches(1), @@ -333,6 +335,10 @@ public: min_rule = max_rule = rule; } + void set_ruleset(int rs) { + ruleset = rs; + } + /** * check if any bucket/nodes is referencing an unknown name or type * @param max_id rejects any non-bucket items with id less than this number, @@ -344,7 +350,8 @@ public: int test(); int test_with_crushtool(const char *crushtool_cmd = "crushtool", int max_id = -1, - int timeout = 0); + int timeout = 0, + int ruleset = -1); }; #endif diff --git a/src/tools/crushtool.cc b/src/tools/crushtool.cc index c7ed691062aee..532ffe1aa24b6 100644 --- a/src/tools/crushtool.cc +++ b/src/tools/crushtool.cc @@ -170,7 +170,7 @@ void usage() cout << " show location for given device id\n"; cout << " -i mapfn --test test a range of inputs on the map\n"; cout << " [--min-x x] [--max-x x] [--x x]\n"; - cout << " [--min-rule r] [--max-rule r] [--rule r]\n"; + cout << " [--min-rule r] [--max-rule r] [--rule r] [--ruleset rs]\n"; cout << " [--num-rep n]\n"; cout << " [--batches b] split the CRUSH mapping into b > 1 rounds\n"; cout << " [--weight|-w devno weight]\n"; @@ -465,6 +465,12 @@ int main(int argc, const char **argv) exit(EXIT_FAILURE); } tester.set_rule(x); + } else if (ceph_argparse_witharg(args, i, &x, err, "--ruleset", (char*)NULL)) { + if (!err.str().empty()) { + cerr << err.str() << std::endl; + exit(EXIT_FAILURE); + } + tester.set_ruleset(x); } else if (ceph_argparse_witharg(args, i, &x, err, "--batches", (char*)NULL)) { if (!err.str().empty()) { cerr << err.str() << std::endl; -- 2.39.5