Whamcloud - gitweb
LU-17431 nodemap: allow handling a nidrange for a dynamic nm 08/54508/18
authorSebastien Buisson <sbuisson@ddn.com>
Wed, 20 Mar 2024 14:45:41 +0000 (15:45 +0100)
committerOleg Drokin <green@whamcloud.com>
Mon, 2 Dec 2024 05:44:38 +0000 (05:44 +0000)
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 <sbuisson@ddn.com>
Change-Id: I34d6bb720cb700e23a3567a47def71c2b1ca7343
Reviewed-on: https://review.whamcloud.com/c/fs/lustre-release/+/54508
Tested-by: jenkins <devops@whamcloud.com>
Tested-by: Maloo <maloo@whamcloud.com>
Reviewed-by: Andreas Dilger <adilger@whamcloud.com>
Reviewed-by: James Simmons <jsimmons@infradead.org>
Reviewed-by: Oleg Drokin <green@whamcloud.com>
lustre/doc/lctl-nodemap-add-range.8
lustre/ptlrpc/nodemap_handler.c
lustre/tests/sanity-sec.sh
lustre/utils/lctl.c
lustre/utils/obd.c

index bd2fd21..ecf15c2 100644 (file)
@@ -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.
index 18aae64..3571cbf 100644 (file)
@@ -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;
 
index c0e9b9f..97f6ef9 100755 (executable)
@@ -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.*'
index 7a2c542..ad6ca7a 100644 (file)
@@ -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 <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"},
index 52f2d9c..d1599f3 100644 (file)
@@ -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 <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) {
@@ -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 <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));