From: Sebastien Buisson Date: Wed, 20 Mar 2024 14:45:41 +0000 (+0100) Subject: LU-17431 nodemap: allow handling a nidrange for a dynamic nm X-Git-Tag: 2.16.51~170 X-Git-Url: https://git.whamcloud.com/?a=commitdiff_plain;h=257d6f392777fbf76e82304f5bfd61a75db1c76c;p=fs%2Flustre-release.git LU-17431 nodemap: allow handling a nidrange for a dynamic nm Adding or deleting a nid range for a dynamic nodemap, by sending the appropriate ioctl to the MDS or OSS device. On kernel side, we need to allow handling a range for a nodemap even if the nodemap config file is not accessible (i.e. we are not on the MGS). This dynamic nodemap is not stored on disk. Signed-off-by: Sebastien Buisson Change-Id: I34d6bb720cb700e23a3567a47def71c2b1ca7343 Reviewed-on: https://review.whamcloud.com/c/fs/lustre-release/+/54508 Tested-by: jenkins Tested-by: Maloo Reviewed-by: Andreas Dilger Reviewed-by: James Simmons Reviewed-by: Oleg Drokin --- diff --git a/lustre/doc/lctl-nodemap-add-range.8 b/lustre/doc/lctl-nodemap-add-range.8 index bd2fd21..ecf15c2 100644 --- a/lustre/doc/lctl-nodemap-add-range.8 +++ b/lustre/doc/lctl-nodemap-add-range.8 @@ -7,8 +7,10 @@ lctl-nodemap_add_range \- define a range of NIDs for a nodemap .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. diff --git a/lustre/ptlrpc/nodemap_handler.c b/lustre/ptlrpc/nodemap_handler.c index 18aae64..3571cbf 100644 --- a/lustre/ptlrpc/nodemap_handler.c +++ b/lustre/ptlrpc/nodemap_handler.c @@ -951,7 +951,7 @@ int nodemap_add_range_helper(struct nodemap_config *config, 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) { @@ -1032,7 +1032,8 @@ int nodemap_del_range(const char *name, const struct lnet_nid nid[2], 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); @@ -1832,7 +1833,8 @@ int nodemap_del(const char *nodemap_name) 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; diff --git a/lustre/tests/sanity-sec.sh b/lustre/tests/sanity-sec.sh index c0e9b9f..97f6ef9 100755 --- a/lustre/tests/sanity-sec.sh +++ b/lustre/tests/sanity-sec.sh @@ -6541,9 +6541,13 @@ run_test 71 "encryption does not remove project flag" 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) )) || @@ -6572,6 +6576,27 @@ test_72() { 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) @@ -6579,6 +6604,10 @@ test_72() { 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.*' diff --git a/lustre/utils/lctl.c b/lustre/utils/lctl.c index 7a2c542..ad6ca7a 100644 --- a/lustre/utils/lctl.c +++ b/lustre/utils/lctl.c @@ -373,10 +373,10 @@ command_t cmdlist[] = { "usage: nodemap_del NODEMAP_NAME"}, {"nodemap_add_range", jt_nodemap_add_range, 0, "add a range to a nodemap\n" - "usage: nodemap_add_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 "}, + "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"}, diff --git a/lustre/utils/obd.c b/lustre/utils/obd.c index 52f2d9c..d1599f3 100644 --- a/lustre/utils/obd.c +++ b/lustre/utils/obd.c @@ -4281,18 +4281,18 @@ static int parse_nid_range(char *nodemap_range, char *nid_range, int range_len) */ 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': @@ -4301,14 +4301,23 @@ int jt_nodemap_add_range(int argc, char **argv) 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 --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) { @@ -4339,18 +4348,18 @@ int jt_nodemap_add_range(int argc, char **argv) */ 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': @@ -4359,13 +4368,22 @@ int jt_nodemap_del_range(int argc, char **argv) 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 --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));