diff options
| author | Rajesh Amaravathi <rajesh@redhat.com> | 2012-01-31 17:04:37 +0530 | 
|---|---|---|
| committer | Vijay Bellur <vijay@gluster.com> | 2012-02-18 00:03:00 -0800 | 
| commit | df12073c4cc8340eb85b5d25c2da84fc21ec1f38 (patch) | |
| tree | bea7be987249a13120faeefd61f92362a0ab61bc /cli | |
| parent | acb691f8908049e651fc12ff1cf01e9cf4ddde65 (diff) | |
cli/glusterd: volume status modification
* Method of getting mount details of brick has been
  changed from direct reading of /etc/mtab to using
  libc's <mntent.h>, providing a fairly portable
  version independent of different linux distributions.
  It is only supported on Linux though.
* Wrong fs type (rootfs for /) in fedora-based
  distributions has been fixed.
* Allows options (detail, mem, fd, et al) to "all" volumes.
* Use of the fnmatch's GNU extension flag,
  FNM_LEADING_DIR is restricted to Linux hosts only.
  In case of non-Linux hosts, partial match functionality
  is absent.
Change-Id: I102ce808c192ef635c2536a2167101be0aa0fc50
BUG: 786367
Signed-off-by: Rajesh Amaravathi <rajesh@redhat.com>
Reviewed-on: http://review.gluster.com/2705
Tested-by: Gluster Build System <jenkins@build.gluster.com>
Reviewed-by: Jeff Darcy <jdarcy@redhat.com>
Reviewed-by: Vijay Bellur <vijay@gluster.com>
Diffstat (limited to 'cli')
| -rw-r--r-- | cli/src/cli-cmd-parser.c | 128 | ||||
| -rw-r--r-- | cli/src/cli-cmd-volume.c | 24 | ||||
| -rw-r--r-- | cli/src/cli-rpc-ops.c | 6 | ||||
| -rw-r--r-- | cli/src/cli.h | 4 | 
4 files changed, 92 insertions, 70 deletions
diff --git a/cli/src/cli-cmd-parser.c b/cli/src/cli-cmd-parser.c index b4c86bf1a..e483a1bd4 100644 --- a/cli/src/cli-cmd-parser.c +++ b/cli/src/cli-cmd-parser.c @@ -1839,39 +1839,42 @@ out:          return ret;  } -gf_boolean_t -cli_cmd_validate_statusop (const char *arg) +uint32_t +cli_cmd_get_statusop (const char *arg)  { -        char    *opwords[] = {"misc-details", "mem", "clients", "fd", "inode", -                              "callpool", NULL}; -        char    *w = NULL; +        int        i         = 0; +        uint32_t   ret       = GF_CLI_STATUS_NONE; +        char      *w         = NULL; +        char      *opwords[] = {"detail", "mem", "clients", "fd", +                                "inode", "callpool", NULL}; +        struct { +                char      *opname; +                uint32_t   opcode; +        } optable[] = { +                { "detail",   GF_CLI_STATUS_DETAIL   }, +                { "mem",      GF_CLI_STATUS_MEM      }, +                { "clients",  GF_CLI_STATUS_CLIENTS  }, +                { "fd",       GF_CLI_STATUS_FD       }, +                { "inode",    GF_CLI_STATUS_INODE    }, +                { "callpool", GF_CLI_STATUS_CALLPOOL }, +                { NULL } +        };          w = str_getunamb (arg, opwords);          if (!w) { -                gf_log ("cli", GF_LOG_ERROR, "Unknown status op  %s", -                        arg); -                return _gf_false; +                gf_log ("cli", GF_LOG_DEBUG, +                        "Not a status op  %s", arg); +                goto out;          } -        return _gf_true; -} -int -cli_cmd_get_statusop (const char *arg) -{ -        int ret = GF_CLI_STATUS_INVAL; -        if (!strcmp (arg, "misc-details")) -                ret = GF_CLI_STATUS_DETAIL; -        else if (!strcmp (arg, "mem")) -                ret = GF_CLI_STATUS_MEM; -        else if (!strcmp (arg, "clients")) -                ret = GF_CLI_STATUS_CLIENTS; -        else if (!strcmp (arg, "inode")) -                ret = GF_CLI_STATUS_INODE; -        else if (!strcmp (arg, "fd")) -                ret = GF_CLI_STATUS_FD; -        else if (!strcmp (arg, "callpool")) -                ret = GF_CLI_STATUS_CALLPOOL; +        for (i = 0; optable[i].opname; i++) { +                if (!strcmp (w, optable[i].opname)) { +                        ret = optable[i].opcode; +                        break; +                } +        } + out:          return ret;  } @@ -1879,9 +1882,9 @@ int  cli_cmd_volume_status_parse (const char **words, int wordcount,                               dict_t **options)  { -        dict_t *dict            = NULL; -        int     ret             = -1; -        int     cmd             = 0; +        dict_t    *dict            = NULL; +        int        ret             = -1; +        uint32_t   cmd             = 0;          GF_ASSERT (options); @@ -1898,60 +1901,69 @@ cli_cmd_volume_status_parse (const char **words, int wordcount,          case 3:                  if (!strcmp (words[2], "all")) { -                          cmd = GF_CLI_STATUS_ALL;                          ret = 0; +                  } else {                          cmd = GF_CLI_STATUS_VOL;                          ret = dict_set_str (dict, "volname", (char *)words[2]);                  } +                  break;          case 4: +                cmd = cli_cmd_get_statusop (words[3]); +                  if (!strcmp (words[2], "all")) { -                        cli_out ("Cannot specify brick/status-type for \"all\""); -                        ret = -1; -                        goto out; +                        if (cmd == GF_CLI_STATUS_NONE) { +                                cli_out ("%s is not a valid status option", +                                         words[3]); +                                ret = -1; +                                goto out; +                        } +                        cmd |= GF_CLI_STATUS_ALL; +                        ret  = 0; +                  } else { -                        cmd = GF_CLI_STATUS_VOL; -                        ret = dict_set_str (dict, "volname", (char *)words[2]); +                        ret = dict_set_str (dict, "volname", +                                            (char *)words[2]);                          if (ret)                                  goto out; -                } -                if (cli_cmd_validate_statusop (words[3])) { -                        ret = cli_cmd_get_statusop (words[3]); -                        if (GF_CLI_STATUS_INVAL == ret) -                                goto out; -                        cmd |= ret; -                        ret = 0; -                } else { -                        cmd = GF_CLI_STATUS_BRICK; -                        ret = dict_set_str (dict, "brick", (char *)words[3]); +                        if (cmd == GF_CLI_STATUS_NONE) { +                                cmd = GF_CLI_STATUS_BRICK; +                                ret = dict_set_str (dict, "brick", +                                                    (char *)words[3]); + +                        } else { +                                cmd |= GF_CLI_STATUS_VOL; +                                ret  = 0; +                        }                  } +                  break;          case 5: -                if (!cli_cmd_validate_statusop (words[4])) { +                if (!strcmp (words[2], "all")) { +                        cli_out ("Cannot specify brick for \"all\"");                          ret = -1;                          goto out;                  } -                cmd = GF_CLI_STATUS_BRICK; -                ret = cli_cmd_get_statusop (words[4]); -                if (GF_CLI_STATUS_INVAL == ret) -                        goto out; -                cmd |= ret; - -                if (!strcmp (words[2], "all")) { -                        cli_out ("Cannot specify brick/status-type for \"all\""); +                cmd = cli_cmd_get_statusop (words[4]); +                if (cmd == GF_CLI_STATUS_NONE) { +                        cli_out ("%s is not a valid status option", +                                 words[4]);                          ret = -1;                          goto out; -                } else { -                        ret = dict_set_str (dict, "volname", (char *)words[2]); -                        if (ret) -                                goto out;                  } + +                cmd |= GF_CLI_STATUS_BRICK; + +                ret = dict_set_str (dict, "volname", (char *)words[2]); +                if (ret) +                        goto out; +                  ret = dict_set_str (dict, "brick", (char *)words[3]);                  break; diff --git a/cli/src/cli-cmd-volume.c b/cli/src/cli-cmd-volume.c index 41007cb7b..6bea948e9 100644 --- a/cli/src/cli-cmd-volume.c +++ b/cli/src/cli-cmd-volume.c @@ -1431,6 +1431,7 @@ cli_get_detail_status (dict_t *dict, int i, cli_volume_status_t *status)          if (ret)                  goto out; +#ifdef GF_LINUX_HOST_OS          memset (key, 0, sizeof (key));          snprintf (key, sizeof (key), "brick%d.mnt_options", i);          ret = dict_get_str (dict, key, &(status->mount_options)); @@ -1442,19 +1443,23 @@ cli_get_detail_status (dict_t *dict, int i, cli_volume_status_t *status)          ret = dict_get_str (dict, key, &(status->fs_name));          if (ret)                  goto out; +#endif          if (IS_EXT_FS(status->fs_name) ||              !strcmp (status->fs_name, "xfs")) { +#ifdef GF_LINUX_HOST_OS                  memset (key, 0, sizeof (key));                  snprintf (key, sizeof (key), "brick%d.inode_size", i);                  ret = dict_get_str (dict, key, &(status->inode_size));                  if (ret)                          status->inode_size = NULL; +#endif                  memset (key, 0, sizeof (key));                  snprintf (key, sizeof (key), "brick%d.total_inodes", i); -                ret = dict_get_uint64 (dict, key, &(status->total_inodes)); +                ret = dict_get_uint64 (dict, key, +                                       &(status->total_inodes));                  if (ret)                          goto out; @@ -1463,9 +1468,10 @@ cli_get_detail_status (dict_t *dict, int i, cli_volume_status_t *status)                  ret = dict_get_uint64 (dict, key, &(status->free_inodes));                  if (ret)                          goto out; -          } else { +#ifdef GF_LINUX_HOST_OS                  status->inode_size = NULL; +#endif                  status->total_inodes = 0;                  status->free_inodes = 0;          } @@ -1481,6 +1487,8 @@ cli_print_detailed_status (cli_volume_status_t *status)          cli_out ("%-20s : %-20d", "Port", status->port);          cli_out ("%-20s : %-20c", "Online", (status->online) ? 'Y' : 'N');          cli_out ("%-20s : %-20s", "Pid", status->pid_str); + +#ifdef GF_LINUX_HOST_OS          cli_out ("%-20s : %-20s", "File System", status->fs_name);          cli_out ("%-20s : %-20s", "Device", status->device); @@ -1491,15 +1499,15 @@ cli_print_detailed_status (cli_volume_status_t *status)                  cli_out ("%-20s : %-20s", "Mount Options", "N/A");          } -        cli_out ("%-20s : %-20s", "Disk Space Free", status->free); -        cli_out ("%-20s : %-20s", "Total Disk Space", status->total); -          if (status->inode_size) {                  cli_out ("%-20s : %-20s", "Inode Size",                           status->inode_size);          } else {                  cli_out ("%-20s : %-20s", "Inode Size", "N/A");          } +#endif +        cli_out ("%-20s : %-20s", "Disk Space Free", status->free); +        cli_out ("%-20s : %-20s", "Total Disk Space", status->total);          if (status->total_inodes) {                  cli_out ("%-20s : %-20ld", "Inode Count", @@ -1821,10 +1829,10 @@ struct cli_cmd volume_cmds[] = {             cli_cmd_volume_top_cbk,             "volume top operations"}, -        { "volume status [all|{<VOLNAME> [<BRICKNAME>] " -          "[misc-details|clients|mem|inode|fd|callpool]}]", +        { "volume status [all | <VOLNAME> [<BRICK>]]" +          " [detail|clients|mem|inode|fd|callpool]",            cli_cmd_volume_status_cbk, -         "display status of specified volume"}, +          "display status of all or specified volume(s)/brick"},          { "volume heal <VOLNAME>",            cli_cmd_volume_heal_cbk, diff --git a/cli/src/cli-rpc-ops.c b/cli/src/cli-rpc-ops.c index 07a2f9fc7..6ed380bff 100644 --- a/cli/src/cli-rpc-ops.c +++ b/cli/src/cli-rpc-ops.c @@ -4956,7 +4956,7 @@ gf_cli3_1_status_cbk (struct rpc_req *req, struct iovec *iov,          char                           *volname        = NULL;          dict_t                         *dict           = NULL;          gf_cli_rsp                      rsp            = {0,}; -        cli_volume_status_t                 status         = {0}; +        cli_volume_status_t             status         = {0};          if (req->rpc_status == -1)                  goto out; @@ -5044,10 +5044,10 @@ gf_cli3_1_status_cbk (struct rpc_req *req, struct iovec *iov,          if (ret)                  goto out; -        cli_out ("\nSTATUS OF VOLUME: %s", volname); +        cli_out ("\nStatus of volume: %s", volname);          if ((cmd & GF_CLI_STATUS_DETAIL) == 0) -                cli_out ("BRICK\t\t\t\t\t\t\tPORT\tONLINE\tPID"); +                cli_out ("Brick\t\t\t\t\t\t\tPort\tOnline\tPid");          for (i = 0; i < count; i++) { diff --git a/cli/src/cli.h b/cli/src/cli.h index 25b17da49..74e1423f5 100644 --- a/cli/src/cli.h +++ b/cli/src/cli.h @@ -132,12 +132,14 @@ struct cli_volume_status {          uint64_t       free_inodes;          char          *brick;          char          *pid_str; -        char          *fs_name;          char          *free;          char          *total; +#ifdef GF_LINUX_HOST_OS +        char          *fs_name;          char          *mount_options;          char          *device;          char          *inode_size; +#endif  };  typedef struct cli_volume_status cli_volume_status_t;  | 
