From: Dmitry Zogin Date: Mon, 5 Apr 2010 18:49:42 +0000 (-0700) Subject: b=22235 llapi_uuid_match() prints bogus error message on upgraded filesystem X-Git-Tag: 1.10.0.40~18 X-Git-Url: https://git.whamcloud.com/?p=fs%2Flustre-release.git;a=commitdiff_plain;h=5bf26d86b7ef2d2b6f853fb5e092028f5b253d94;hp=13dc8fed9e415f0d03a5393c48478be8c76242f0 b=22235 llapi_uuid_match() prints bogus error message on upgraded filesystem 1. Increase the "lfs df" column width to handle TB sized devices cleanly 2. Allow matching OST names without trailing _UUID v2 (validate lengths) 3. Allow negating the "--obd" option to "lfs find" 4. Remove duplicate code in mntdf() iterating over MDTs/OSTs; handle errors o=andreas.dilger i=dmitry.zogin i=nathan.rutman --- diff --git a/lustre/doc/lfs.1 b/lustre/doc/lfs.1 index 224797f..55d2e83 100644 --- a/lustre/doc/lfs.1 +++ b/lustre/doc/lfs.1 @@ -15,7 +15,7 @@ lfs \- Lustre utility to create a file with specific striping pattern, find the .br .B lfs find [[!] --atime|-A [-+]N] [[!] --mtime|-M [-+]N] \fB[[!] --ctime|-C [-+]N] [--maxdepth|-D N] [--name|-n pattern] - \fB[--print|-p] \fB[--print0|-P] [--obd|-O ] + \fB[--print|-p] \fB[--print0|-P] [[!] --obd|-O ] \fB[[!] --size|-S [-+]N[kMGTPE]] [--type |-t {bcdflpsD}] \fB[[!] --gid|-g|--group|-G |] \fB[[!] --uid|-u|--user|-U |] diff --git a/lustre/include/lustre/liblustreapi.h b/lustre/include/lustre/liblustreapi.h index a096f43..c84e137 100644 --- a/lustre/include/lustre/liblustreapi.h +++ b/lustre/include/lustre/liblustreapi.h @@ -125,6 +125,7 @@ struct find_param { obds_printed:1, exclude_pattern:1, exclude_type:1, + exclude_obd:1, have_fileinfo:1, exclude_gid:1, exclude_uid:1, diff --git a/lustre/utils/lfs.c b/lustre/utils/lfs.c index 14ea0a2..654d6c3 100644 --- a/lustre/utils/lfs.c +++ b/lustre/utils/lfs.c @@ -140,10 +140,10 @@ command_t cmdlist[] = { "usage: pool_list [.] | \n"}, {"find", lfs_find, 0, "To find files that match given parameters recursively in a directory tree.\n" - "usage: find ... \n" + "usage: find ...\n" " [[!] --atime|-A [+-]N] [[!] --mtime|-M [+-]N] [[!] --ctime|-C [+-]N]\n" " [--maxdepth|-D N] [[!] --name|-n ] [--print0|-P]\n" - " [--print|-p] [--obd|-O ] [[!] --size|-s [+-]N[bkMGTP]]\n" + " [--print|-p] [[!] --obd|-O ] [[!] --size|-s [+-]N[bkMGTP]]\n" " [[!] --type|-t ] [[!] --gid|-g|--group|-G |]\n" " [[!] --uid|-u|--user|-U |]\n" " [[!] --pool ]\n" @@ -675,6 +675,8 @@ static int lfs_find(int argc, char **argv) return -ENOMEM; strcpy(buf, (char *)optarg); + param.exclude_obd = !!neg_opt; + if (param.num_alloc_obds == 0) { param.obduuid = malloc(FIND_MAX_OSTS * sizeof(struct obd_uuid)); @@ -944,12 +946,11 @@ static int lfs_osts(int argc, char **argv) radix; \ }) #define UUF "%-20s" -#define CSF "%9s" -#define CDF "%9llu" -#define HSF "%8s" -#define HDF "%6.1f" -#define RSF "%5s" -#define RDF "%4d%%" +#define CSF "%11s" +#define CDF "%11llu" +#define HDF "%8.1f%c" +#define RSF "%4s" +#define RDF "%3d%%" static int showdf(char *mntdir, struct obd_statfs *stat, char *uuid, int ishow, int cooked, @@ -989,21 +990,21 @@ static int showdf(char *mntdir, struct obd_statfs *stat, cook_val = (double)total; i = COOK(cook_val); if (i > 0) - sprintf(tbuf, HDF"%c", cook_val, suffix[i - 1]); + sprintf(tbuf, HDF, cook_val, suffix[i - 1]); else sprintf(tbuf, CDF, total); cook_val = (double)used; i = COOK(cook_val); if (i > 0) - sprintf(ubuf, HDF"%c", cook_val, suffix[i - 1]); + sprintf(ubuf, HDF, cook_val, suffix[i - 1]); else sprintf(ubuf, CDF, used); cook_val = (double)avail; i = COOK(cook_val); if (i > 0) - sprintf(abuf, HDF"%c", cook_val, suffix[i - 1]); + sprintf(abuf, HDF, cook_val, suffix[i - 1]); else sprintf(abuf, CDF, avail); } else { @@ -1032,11 +1033,20 @@ static int showdf(char *mntdir, struct obd_statfs *stat, return 0; } +struct ll_stat_type { + int st_op; + char *st_name; +}; + static int mntdf(char *mntdir, char *fsname, char *pool, int ishow, int cooked) { struct obd_statfs stat_buf, sum = { .os_bsize = 1 }; struct obd_uuid uuid_buf; char *poolname = NULL; + struct ll_stat_type types[] = { { LL_STATFS_MDC, "MDT" }, + { LL_STATFS_LOV, "OST" }, + { 0, NULL } }; + struct ll_stat_type *tp; __u32 index; int rc; @@ -1061,62 +1071,50 @@ static int mntdf(char *mntdir, char *fsname, char *pool, int ishow, int cooked) "UUID", cooked ? "bytes" : "1K-blocks", "Used", "Available", "Use%", "Mounted on"); - for (index = 0; ; index++) { - memset(&stat_buf, 0, sizeof(struct obd_statfs)); - memset(&uuid_buf, 0, sizeof(struct obd_uuid)); - rc = llapi_obd_statfs(mntdir, LL_STATFS_MDC, index, - &stat_buf, &uuid_buf); - if (rc == -ENODEV) - break; - - if (rc == -EAGAIN) - continue; - - if (rc == -ENOTCONN || rc == -ETIMEDOUT || rc == -EIO || - rc == -ENODATA || rc == 0) { - showdf(mntdir, &stat_buf, obd_uuid2str(&uuid_buf), - ishow, cooked, "MDT", index, rc); - } else { - fprintf(stderr, - "error: llapi_obd_statfs(%s): %s (%d)\n", - obd_uuid2str(&uuid_buf), strerror(-rc), rc); - return rc; - } - if (rc == 0) { - sum.os_ffree += stat_buf.os_ffree; - sum.os_files += stat_buf.os_files; - } - } - - for (index = 0; ; index++) { - memset(&stat_buf, 0, sizeof(struct obd_statfs)); - memset(&uuid_buf, 0, sizeof(struct obd_uuid)); - rc = llapi_obd_statfs(mntdir, LL_STATFS_LOV, index, - &stat_buf, &uuid_buf); - if (rc == -ENODEV) - break; + for (tp = types; tp->st_name != NULL; tp++) { + for (index = 0; ; index++) { + memset(&stat_buf, 0, sizeof(struct obd_statfs)); + memset(&uuid_buf, 0, sizeof(struct obd_uuid)); + rc = llapi_obd_statfs(mntdir, tp->st_op, index, + &stat_buf, &uuid_buf); + if (rc == -ENODEV) + break; - if (rc == -EAGAIN) - continue; + if (poolname && tp->st_op == LL_STATFS_LOV && + llapi_search_ost(fsname, poolname, + obd_uuid2str(&uuid_buf)) != 1) + continue; - if (llapi_search_ost(fsname, poolname, - obd_uuid2str(&uuid_buf)) != 1) - continue; + /* the llapi_obd_statfs() call may have returned with + * an error, but if it filled in uuid_buf we will at + * lease use that to print out a message for that OBD. + * If we didn't even fill in uuid_buf something is + * definitely incorrect and no point in continuing. */ + if (uuid_buf.uuid[0] != '\0') { + showdf(mntdir,&stat_buf,obd_uuid2str(&uuid_buf), + ishow, cooked, tp->st_name, index, rc); + } else { + char tmp_uuid[12]; - if (rc == -ENOTCONN || rc == -ETIMEDOUT || rc == -EIO || - rc == -ENODATA || rc == 0) { - showdf(mntdir, &stat_buf, obd_uuid2str(&uuid_buf), - ishow, cooked, "OST", index, rc); - } else { - fprintf(stderr, - "error: llapi_obd_statfs failed: %s (%d)\n", - strerror(-rc), rc); - return rc; - } - if (rc == 0) { - sum.os_blocks += stat_buf.os_blocks * stat_buf.os_bsize; - sum.os_bfree += stat_buf.os_bfree * stat_buf.os_bsize; - sum.os_bavail += stat_buf.os_bavail * stat_buf.os_bsize; + sprintf(tmp_uuid, "%s%04x", tp->st_name, index); + showdf(mntdir, &stat_buf, tmp_uuid, + ishow, cooked, tp->st_name, index, rc); + } + if (rc == 0) { + if (tp->st_op == LL_STATFS_MDC) { + sum.os_ffree += stat_buf.os_ffree; + sum.os_files += stat_buf.os_files; + } else /* if (tp->st_op == LL_STATFS_LOV) */ { + sum.os_blocks += stat_buf.os_blocks * + stat_buf.os_bsize; + sum.os_bfree += stat_buf.os_bfree * + stat_buf.os_bsize; + sum.os_bavail += stat_buf.os_bavail * + stat_buf.os_bsize; + } + } else if (rc == -EINVAL || rc == -EFAULT) { + break; + } } } @@ -1549,8 +1547,8 @@ do { \ * 2. specifiers may be encountered multiple times (2s3s is 5 seconds) * 3. empty integer value is interpreted as 0 */ - -static unsigned long str2sec(const char* timestr) { +static unsigned long str2sec(const char* timestr) +{ const char spec[] = "smhdw"; const unsigned long mult[] = {1, 60, 60*60, 24*60*60, 7*24*60*60}; unsigned long val = 0; diff --git a/lustre/utils/liblustreapi.c b/lustre/utils/liblustreapi.c index 516111e..1614dd87 100644 --- a/lustre/utils/liblustreapi.c +++ b/lustre/utils/liblustreapi.c @@ -1195,13 +1195,18 @@ int llapi_get_obd_count(char *mnt, int *count, int is_mdt) */ int llapi_uuid_match(char *real_uuid, char *search_uuid) { - int cmplen = strlen(real_uuid) - 5; + int cmplen = strlen(real_uuid); + int searchlen = strlen(search_uuid); - if ((strlen(search_uuid) > cmplen) && isxdigit(search_uuid[cmplen])) { - /* OST00000003 doesn't match OST0000 */ - llapi_err(LLAPI_MSG_ERROR, "Bad UUID format '%s'", search_uuid); + if (cmplen > 5 && strcmp(real_uuid + cmplen - 5, "_UUID") == 0) + cmplen -= 5; + if (searchlen > 5 && strcmp(search_uuid + searchlen - 5, "_UUID") == 0) + searchlen -= 5; + + /* The UUIDs may legitimately be different lengths, if + * the system was upgraded from an older version. */ + if (cmplen != searchlen) return 0; - } return (strncmp(search_uuid, real_uuid, cmplen) == 0); } @@ -1803,13 +1808,19 @@ static int cb_find_init(char *path, DIR *parent, DIR *dir, i < param->lmd->lmd_lmm.lmm_stripe_count; i++) { for (j = 0; j < param->num_obds; j++) { if (param->obdindexes[j] == - lmm_objects[i].l_ost_idx) + lmm_objects[i].l_ost_idx) { + if (param->exclude_obd) + goto decided; goto obd_matches; + } } } - if (i == param->lmd->lmd_lmm.lmm_stripe_count) + if (i == param->lmd->lmd_lmm.lmm_stripe_count) { + if (param->exclude_obd) + goto obd_matches; goto decided; + } } } @@ -1867,7 +1878,8 @@ obd_matches: The regular stat is almost of the same speed as some new 'glimpse-size-ioctl'. */ if (!decision && S_ISREG(st->st_mode) && - (param->lmd->lmd_lmm.lmm_stripe_count || param->size)) { + param->lmd->lmd_lmm.lmm_stripe_count && + (param->size ||param->atime || param->mtime || param->ctime)) { if (param->obdindex != OBD_NOT_FOUND) { /* Check whether the obd is active or not, if it is * not active, just print the object affected by this