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<string>(max_id);
"--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();
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);
map<int, int> device_weight;
int min_rule, max_rule;
+ int ruleset;
int min_x, max_x;
int min_rep, max_rep;
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),
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,
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
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";
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;