COMMAND("osd pool set " \
"name=pool,type=CephPoolname " \
"name=var,type=CephChoices,strings=size|min_size|crash_replay_interval|pg_num|pgp_num|crush_ruleset|hashpspool " \
- "name=val,type=CephString", \
+ "name=val,type=CephInt", \
"set pool parameter <var> to <val>", "osd", "rw", "cli,rest")
// 'val' is a CephString because it can include a unit. Perhaps
// there should be a Python type for validation/conversion of strings
// accept val as a json string or int, and parse out int or float
// values from the string as needed
+ string raw_val = cmd_vartype_stringify(cmdmap["val"]);
string val;
cmd_getval(g_ceph_context, cmdmap, "val", val);
string interr;
if (var == "size") {
if (interr.length()) {
- ss << "error parsing integer value '" << val << "': " << interr;
+ ss << "error parsing integer value '" << raw_val << "': " << interr;
return -EINVAL;
}
if (n == 0 || n > 10) {
ss << "set pool " << pool << " size to " << n;
} else if (var == "min_size") {
if (interr.length()) {
- ss << "error parsing integer value '" << val << "': " << interr;
+ ss << "error parsing integer value '" << raw_val << "': " << interr;
return -EINVAL;
}
p.min_size = n;
ss << "set pool " << pool << " min_size to " << n;
} else if (var == "crash_replay_interval") {
if (interr.length()) {
- ss << "error parsing integer value '" << val << "': " << interr;
+ ss << "error parsing integer value '" << raw_val << "': " << interr;
return -EINVAL;
}
p.crash_replay_interval = n;
ss << "set pool " << pool << " to crash_replay_interval to " << n;
} else if (var == "pg_num") {
if (interr.length()) {
- ss << "error parsing integer value '" << val << "': " << interr;
+ ss << "error parsing integer value '" << raw_val << "': " << interr;
return -EINVAL;
}
if (n <= (int)p.get_pg_num()) {
}
} else if (var == "pgp_num") {
if (interr.length()) {
- ss << "error parsing integer value '" << val << "': " << interr;
+ ss << "error parsing integer value '" << raw_val << "': " << interr;
return -EINVAL;
}
if (n <= 0) {
}
} else if (var == "crush_ruleset") {
if (interr.length()) {
- ss << "error parsing integer value '" << val << "': " << interr;
+ ss << "error parsing integer value '" << raw_val << "': " << interr;
return -EINVAL;
}
if (osdmap.crush->rule_exists(n)) {
return -ENOENT;
}
} else if (var == "hashpspool") {
- if (val == "true") {
+ // make sure we only compare against 'n' if we didn't receive a string
+ int flag_val = (!val.empty() ? -1 : n);
+ if (val == "true" || flag_val == 1) {
p.flags |= pg_pool_t::FLAG_HASHPSPOOL;
ss << "set";
- } else if (val == "false") {
+ } else if (val == "false" || flag_val == 0) {
p.flags ^= pg_pool_t::FLAG_HASHPSPOOL;
ss << "unset";
} else {
- ss << "expecting value true or false";
+ ss << "expecting value 0 or 1";
return -EINVAL;
}
ss << " pool " << pool << " flag hashpspool";