Whamcloud - gitweb
b=22235 llapi_uuid_match() prints bogus error message on upgraded filesystem
authorDmitry Zogin <dmitry.zogin@sun.com>
Mon, 5 Apr 2010 18:49:42 +0000 (11:49 -0700)
committerRobert Read <robert.read@oracle.com>
Mon, 5 Apr 2010 18:49:42 +0000 (11:49 -0700)
   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

lustre/doc/lfs.1
lustre/include/lustre/liblustreapi.h
lustre/utils/lfs.c
lustre/utils/liblustreapi.c

index 224797f..55d2e83 100644 (file)
@@ -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 <uuid[s]>]
+        \fB[--print|-p] \fB[--print0|-P] [[!] --obd|-O <uuid[s]>]
         \fB[[!] --size|-S [-+]N[kMGTPE]] [--type |-t {bcdflpsD}]
         \fB[[!] --gid|-g|--group|-G <gname>|<gid>]
         \fB[[!] --uid|-u|--user|-U <uname>|<uid>]
index a096f43..c84e137 100644 (file)
@@ -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,
index 14ea0a2..654d6c3 100644 (file)
@@ -140,10 +140,10 @@ command_t cmdlist[] = {
          "usage: pool_list <fsname>[.<pool>] | <pathname>\n"},
         {"find", lfs_find, 0,
          "To find files that match given parameters recursively in a directory tree.\n"
-         "usage: find <dir|file> ... \n"
+         "usage: find <directory|filename> ...\n"
          "     [[!] --atime|-A [+-]N] [[!] --mtime|-M [+-]N] [[!] --ctime|-C [+-]N]\n"
          "     [--maxdepth|-D N] [[!] --name|-n <pattern>] [--print0|-P]\n"
-         "     [--print|-p] [--obd|-O <uuid[s]>] [[!] --size|-s [+-]N[bkMGTP]]\n"
+         "     [--print|-p] [[!] --obd|-O <uuid[s]>] [[!] --size|-s [+-]N[bkMGTP]]\n"
          "     [[!] --type|-t <filetype>] [[!] --gid|-g|--group|-G <gid>|<gname>]\n"
          "     [[!] --uid|-u|--user|-U <uid>|<uname>]\n"
          "     [[!] --pool <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;
index 516111e..1614dd8 100644 (file)
@@ -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