.BI --range " NID_RANGE"
.YS
.SH DESCRIPTION
-.B nodemap_add_range adds a range of NIDs to an existing nodemap.
-The NID range cannot overlap with an existing NID range.
+.B nodemap_add_range
+adds a range of NIDs to an existing nodemap.
+The NID range cannot overlap with an existing NID range except with a dynamic
+overlay range.
Clients with NIDs that fall into the new range
will be moved into the given nodemap and any future RPCs will be subject
to the properties configured for that nodemap.
up_write(&config->nmc_range_tree_lock);
/* if range_id is non-zero, we are loading from disk */
- if (range_id == 0)
+ if (range_id == 0 && !nodemap->nm_dyn)
rc = nodemap_idx_range_add(range);
if (config == active_config) {
up_write(&active_config->nmc_range_tree_lock);
GOTO(out_putref, rc = -EINVAL);
}
- rc = nodemap_idx_range_del(range);
+ if (!nodemap->nm_dyn)
+ rc = nodemap_idx_range_del(range);
range_delete(active_config, range);
nm_member_reclassify_nodemap(nodemap);
up_write(&active_config->nmc_range_tree_lock);
down_write(&active_config->nmc_range_tree_lock);
list_for_each_entry_safe(range, range_temp, &nodemap->nm_ranges,
rn_list) {
- rc2 = nodemap_idx_range_del(range);
+ if (!nodemap->nm_dyn)
+ rc2 = nodemap_idx_range_del(range);
if (rc2 < 0)
rc = rc2;
test_72() {
local mgsnm=mgsnm
local mgsnids=1.1.0.[1-100]@tcp
+ local mgsnids2=1.0.0.[1-100]@tcp
local mgsclid=600
local mgsfsid=2000
local nm=nm_test71
+ local nids=1.1.1.[1-100]@tcp
+ local startnid=1.1.1.1@tcp
+ local endnid=1.1.1.100@tcp
local val
(( OST1_VERSION >= $(version_code 2.15.64) )) ||
error "dynamic nodemap wrong id $val"
fi
+ do_facet ost1 $LCTL nodemap_add_range --name $nm --range $nids ||
+ error "dynamic add_range on server failed"
+ val=$(do_facet ost1 $LCTL get_param nodemap.$nm.ranges |
+ awk 'BEGIN{RS=", "} $1=="start_nid:"{print $2 ; exit}')
+ if [[ "x$val" != "x$startnid" ]]; then
+ error "dynamic nodemap wrong start nid range $val"
+ fi
+ val=$(do_facet ost1 $LCTL get_param nodemap.$nm.ranges |
+ awk 'BEGIN{RS=", "} $1=="end_nid:"{print $2 ; exit}')
+ if [[ "x$val" != "x$endnid" ]]; then
+ error "dynamic nodemap wrong end nid range $val"
+ fi
+
+ do_facet ost1 $LCTL nodemap_del_range --name $nm --range $nids ||
+ error "dynamic del_range on server failed"
+ val=$(do_facet ost1 $LCTL get_param nodemap.$nm.ranges |
+ awk 'BEGIN{RS=", "} $1=="start_nid:"{print $2 ; exit}')
+ if [[ "x$val" != "x" ]]; then
+ error "nid range should be empty, got $val"
+ fi
+
do_facet ost1 $LCTL nodemap_del $nm ||
error "dynamic nodemap del on server failed"
val=$(do_facet ost1 $LCTL get_param nodemap.$nm.id)
error "nodemap should be gone, got $val"
fi
+ do_facet ost1 $LCTL nodemap_add_range --name $mgsnm --range $mgsnids2 &&
+ error "add_range $mgsnm on server should fail"
+ do_facet ost1 $LCTL nodemap_del_range --name $mgsnm --range $mgsnids &&
+ error "del_range $mgsnm on server should fail"
do_facet ost1 $LCTL nodemap_del $mgsnm &&
error "nodemap del $mgsnm on server should fail"
do_facet ost1 $LCTL get_param -R 'nodemap.*'
"usage: nodemap_del NODEMAP_NAME"},
{"nodemap_add_range", jt_nodemap_add_range, 0,
"add a range to a nodemap\n"
- "usage: nodemap_add_range <nid_range>"},
+ "usage: nodemap_add_range --name NODEMAP_NAME --range NID_RANGE"},
{"nodemap_del_range", jt_nodemap_del_range, 0,
- "add a range to a nodemap\n"
- "usage: nodemap_del_range <nid_range>"},
+ "delete a range from a nodemap\n"
+ "usage: nodemap_del_range --name NODEMAP_NAME --range NID_RANGE"},
{"nodemap_modify", jt_nodemap_modify, 0,
"modify a nodemap parameters\n"
"usage: nodemap_modify nodemap_name param value"},
*/
int jt_nodemap_add_range(int argc, char **argv)
{
- char *nodemap_name = NULL;
- char *nodemap_range = NULL;
- char nid_range[2 * LNET_NIDSTR_SIZE + 2];
- int rc = 0;
- int c;
+ char nid_range[2 * LNET_NIDSTR_SIZE + 2];
+ char *nodemap_range = NULL;
+ char *nodemap_name = NULL;
+ int c, rc = 0;
static struct option long_opts[] = {
+ { .val = 'h', .name = "help", .has_arg = no_argument },
{ .val = 'n', .name = "name", .has_arg = required_argument },
{ .val = 'r', .name = "range", .has_arg = required_argument },
{ .name = NULL } };
- while ((c = getopt_long(argc, argv, "n:r:",
+ while ((c = getopt_long(argc, argv, "hn:r:",
long_opts, NULL)) != -1) {
switch (c) {
case 'n':
case 'r':
nodemap_range = optarg;
break;
+ case 'h':
+ default:
+ goto add_range_usage;
}
}
- if (!nodemap_name || !nodemap_range) {
+ if (!nodemap_name) {
+ fprintf(stderr, "nodemap_add_range: missing nodemap name\n");
+add_range_usage:
fprintf(stderr,
- "usage: nodemap_add_range --name <name> --range <range>\n");
+ "usage: nodemap_add_range --name NODEMAP_NAME --range NID_RANGE\n");
return -EINVAL;
}
+ if (!nodemap_range) {
+ fprintf(stderr, "nodemap_add_range: missing NID range\n");
+ goto add_range_usage;
+ }
rc = parse_nid_range(nodemap_range, nid_range, sizeof(nid_range));
if (rc) {
*/
int jt_nodemap_del_range(int argc, char **argv)
{
- char *nodemap_name = NULL;
- char *nodemap_range = NULL;
- char nid_range[2 * LNET_NIDSTR_SIZE + 2];
- int rc = 0;
- int c;
+ char nid_range[2 * LNET_NIDSTR_SIZE + 2];
+ char *nodemap_range = NULL;
+ char *nodemap_name = NULL;
+ int c, rc = 0;
static struct option long_opts[] = {
- { .val = 'n', .name = "name", .has_arg = required_argument },
- { .val = 'r', .name = "range", .has_arg = required_argument },
- { .name = NULL } };
+ { .val = 'h', .name = "help", .has_arg = no_argument },
+ { .val = 'n', .name = "name", .has_arg = required_argument },
+ { .val = 'r', .name = "range", .has_arg = required_argument },
+ { .name = NULL } };
- while ((c = getopt_long(argc, argv, "n:r:",
+ while ((c = getopt_long(argc, argv, "hn:r:",
long_opts, NULL)) != -1) {
switch (c) {
case 'n':
case 'r':
nodemap_range = optarg;
break;
+ case 'h':
+ default:
+ goto del_range_usage;
}
}
- if (!nodemap_name || !nodemap_range) {
+ if (!nodemap_name) {
+ fprintf(stderr, "nodemap_del_range: missing nodemap name\n");
+del_range_usage:
fprintf(stderr,
- "usage: nodemap_del_range --name <name> --range <range>\n");
- return -1;
+ "usage: nodemap_del_range --name NODEMAP_NAME --range NID_RANGE\n");
+ return -EINVAL;
+ }
+ if (!nodemap_range) {
+ fprintf(stderr, "nodemap_del_range: missing NID range\n");
+ goto del_range_usage;
}
rc = parse_nid_range(nodemap_range, nid_range, sizeof(nid_range));