From a7d720e0c36047c48000cf4ef8401aac50d255bf Mon Sep 17 00:00:00 2001 From: Lei Feng Date: Thu, 12 Oct 2023 15:58:12 +0800 Subject: [PATCH] LU-17182 utils: pool_add send OSTs in one batch 'lctl pool_add' command sends all requests in one batch then checks results. In this way, the command won't take too long time if the OSTs are specified in command line one by one. Lustre-change: https://review.whamcloud.com/52654 Lustre-commit: TBD (from 7a9b37c84921687ab8ac0c765aab6b5a6b339468) Signed-off-by: Lei Feng Test-Parameters: trivial Change-Id: Ibd6e7ed5104e100d44c5f4288a25e7378cd9cfe8 Reviewed-on: https://review.whamcloud.com/c/ex/lustre-release/+/52719 Reviewed-by: Andreas Dilger Tested-by: jenkins Tested-by: Maloo --- lustre/utils/obd.c | 111 ++++++++++++++++++++++------------------------------- 1 file changed, 46 insertions(+), 65 deletions(-) diff --git a/lustre/utils/obd.c b/lustre/utils/obd.c index 62a4d73..dbc0b71 100644 --- a/lustre/utils/obd.c +++ b/lustre/utils/obd.c @@ -4110,7 +4110,8 @@ static int check_and_complete_ostname(char *fsname, char *ostname) /* if not check if the fsname is the right one */ ptr = strchr(ostname, '-'); if (!ptr) { - sprintf(real_ostname, "%s-%s", fsname, ostname); + snprintf(real_ostname, MAX_OBD_NAME + 1, "%s-%s", fsname, + ostname); } else if (strncmp(ostname, fsname, strlen(fsname)) != 0) { fprintf(stderr, "%s does not start with fsname %s\n", ostname, fsname); @@ -5426,32 +5427,37 @@ static bool get_pools_path(char *fsname) return (rc == 0); } -static int extract_fsname_poolname(char **argv, char *fsname, - char *poolname) +static int extract_fsname_poolname(char **argv, char *fsname, char *poolname) { char *cmd = argv[0], *param = argv[1]; char *ptr; - int rc; + int rc, fsname_len; - snprintf(fsname, PATH_MAX + 1, "%s", param); - ptr = strchr(fsname, '.'); + ptr = strchr(param, '.'); if (!ptr) { if (strcmp(cmd, "pool_list") == 0) { - poolname = NULL; + snprintf(fsname, LUSTRE_MAXFSNAME + 1, "%s", param); + poolname[0] = '\0'; goto out; } - fprintf(stderr, ". is missing in %s\n", fsname); + fprintf(stderr, ". is missing in %s\n", param); rc = -EINVAL; goto err; } - if ((ptr - fsname) == 0) { + fsname_len = ptr - param; + if (fsname_len == 0) { fprintf(stderr, "fsname is empty\n"); rc = -EINVAL; goto err; + } else if (fsname_len > LUSTRE_MAXFSNAME) { + fprintf(stderr, "fsname is too long\n"); + rc = -EINVAL; + goto err; } - *ptr = '\0'; + strncpy(fsname, param, fsname_len); + fsname[fsname_len] = '\0'; ++ptr; if (strlen(ptr) == 0) { @@ -5460,9 +5466,7 @@ static int extract_fsname_poolname(char **argv, char *fsname, goto err; } - strncpy(poolname, ptr, LOV_MAXPOOLNAME); - poolname[LOV_MAXPOOLNAME] = '\0'; - + snprintf(poolname, LOV_MAXPOOLNAME + 1, "%s", ptr); if (strncmp(poolname, "none", LOV_MAXPOOLNAME) == 0) { fprintf(stderr, "poolname cannot be 'none'\n"); return -EINVAL; @@ -5478,15 +5482,15 @@ err: int jt_pool_cmd(int argc, char **argv) { enum lcfg_command_type cmd; - char fsname[PATH_MAX + 1]; + char fsname[LUSTRE_MAXFSNAME + 1]; char poolname[LOV_MAXPOOLNAME + 1]; - char *ostnames_buf = NULL; int i, rc; int *array = NULL, array_sz; struct { int rc; - char *ostname; + char ostname[MAX_OBD_NAME + 1]; } *cmds = NULL; + int cmds_nr = 0, cmd_start = 0; switch (argc) { case 0: @@ -5533,6 +5537,7 @@ int jt_pool_cmd(int argc, char **argv) if (rc) break; + /* generate full list of OSTs */ for (i = 2; i < argc; i++) { int j; @@ -5540,18 +5545,16 @@ int jt_pool_cmd(int argc, char **argv) if (array_sz == 0) return CMD_HELP; - cmds = malloc(array_sz * sizeof(cmds[0])); - if (cmds) { - ostnames_buf = malloc(array_sz * - (MAX_OBD_NAME + 1)); - } else { - free(array); + cmd_start = cmds_nr; + cmds_nr += array_sz; + cmds = realloc(cmds, cmds_nr * sizeof(cmds[0])); + if (cmds == NULL) { rc = -ENOMEM; goto out; } for (j = 0; j < array_sz; j++) { - char ostname[MAX_OBD_NAME + 1]; + char *ostname = cmds[cmd_start + j].ostname; int rc2; snprintf(ostname, MAX_OBD_NAME, format, @@ -5561,58 +5564,36 @@ int jt_pool_cmd(int argc, char **argv) rc2 = check_and_complete_ostname(fsname, ostname); if (rc2) { - free(array); - free(cmds); - if (ostnames_buf) - free(ostnames_buf); rc = rc ? rc : rc2; goto out; } - if (ostnames_buf) { - cmds[j].ostname = - &ostnames_buf[(MAX_OBD_NAME + 1) * j]; - strcpy(cmds[j].ostname, ostname); - } else { - cmds[j].ostname = NULL; - } - cmds[j].rc = pool_cmd(cmd, argv[0], argv[1], - fsname, poolname, - ostname); - /* Return an err if any of the add/dels fail */ - if (!rc) - rc = cmds[j].rc; - } - for (j = 0; j < array_sz; j++) { - if (!cmds[j].rc) { - char ostname[MAX_OBD_NAME + 1]; - - if (!cmds[j].ostname) { - snprintf(ostname, MAX_OBD_NAME, - format, array[j]); - ostname[MAX_OBD_NAME] = '\0'; - check_and_complete_ostname( - fsname, ostname); - } else { - strcpy(ostname, - cmds[j].ostname); - } - check_pool_cmd_result(cmd, fsname, - poolname, - ostname); - } + } /* for(j) */ + } /* for(i) */ + /* submit all commands */ + for (i = 0; i < cmds_nr; i++) { + cmds[i].rc = pool_cmd(cmd, argv[0], argv[1], fsname, + poolname, cmds[i].ostname); + /* Return an err if any of the add/dels fail */ + if (!rc) + rc = cmds[i].rc; + } + /* check results */ + for (i = 0; i < cmds_nr; i++) { + if (!cmds[i].rc) { + check_pool_cmd_result(cmd, fsname, poolname, + cmds[i].ostname); } - if (array_sz > 0) - free(array); - if (cmds) - free(cmds); - if (ostnames_buf) - free(ostnames_buf); } fallthrough; } } /* switch */ out: + if (array) + free(array); + if (cmds) + free(cmds); + if (rc != 0) { errno = -rc; perror(argv[0]); -- 1.8.3.1