e7a346
From 1637d5018aeea96efc2916afe162c4905ef2c2d9 Mon Sep 17 00:00:00 2001
e7a346
From: Ravishankar N <ravishankar@redhat.com>
e7a346
Date: Fri, 14 Dec 2018 12:48:05 +0530
e7a346
Subject: [PATCH 459/493] glfsheal: add a '--nolog' flag
e7a346
e7a346
(Upstream master patch: https://review.gluster.org/#/c/glusterfs/+/21501/)
e7a346
e7a346
....and if set, change the log level to GF_LOG_NONE. This is useful for
e7a346
monitoring applications which invoke the heal info set of commands once
e7a346
every minute, leading to un-necessary glfsheal* logs in
e7a346
/var/log/glusterfs/. For example, we can now run
e7a346
e7a346
`gluster volume heal <VOLNAME> info --nolog`
e7a346
`gluster volume heal <VOLNAME> info split-brain --nolog` etc.
e7a346
e7a346
The default log level is still retained at GF_LOG_INFO.
e7a346
e7a346
The patch also changes glfsheal internally to accept '--xml' instead of 'xml'.
e7a346
Note: The --nolog flag is *not* displayed in the help anywhere, for the
e7a346
sake of consistency in how the other flags are not displayed anywhere in
e7a346
the help.
e7a346
e7a346
Change-Id: I932d0f79070880b0f9ca87e164d3c2a3b831c8c4
e7a346
BUG: 1579293
e7a346
Signed-off-by: Ravishankar N <ravishankar@redhat.com>
e7a346
Reviewed-on: https://code.engineering.redhat.com/gerrit/158640
e7a346
Tested-by: RHGS Build Bot <nigelb@redhat.com>
e7a346
Reviewed-by: Sunil Kumar Heggodu Gopala Acharya <sheggodu@redhat.com>
e7a346
---
e7a346
 cli/src/cli-cmd-volume.c |  8 ++++---
e7a346
 cli/src/cli.c            |  5 ++++
e7a346
 cli/src/cli.h            |  1 +
e7a346
 heal/src/glfs-heal.c     | 59 ++++++++++++++++++++++++++++++++++++------------
e7a346
 4 files changed, 56 insertions(+), 17 deletions(-)
e7a346
e7a346
diff --git a/cli/src/cli-cmd-volume.c b/cli/src/cli-cmd-volume.c
e7a346
index 32efa73..8fca7eb 100644
e7a346
--- a/cli/src/cli-cmd-volume.c
e7a346
+++ b/cli/src/cli-cmd-volume.c
e7a346
@@ -2830,7 +2830,7 @@ cli_launch_glfs_heal (int heal_op, dict_t *options)
e7a346
         switch (heal_op) {
e7a346
         case GF_SHD_OP_INDEX_SUMMARY:
e7a346
                 if (global_state->mode & GLUSTER_MODE_XML) {
e7a346
-                        runner_add_args (&runner, "xml", NULL);
e7a346
+                        runner_add_args (&runner, "--xml", NULL);
e7a346
                 }
e7a346
                 break;
e7a346
         case GF_SHD_OP_SBRAIN_HEAL_FROM_BIGGER_FILE:
e7a346
@@ -2854,7 +2854,7 @@ cli_launch_glfs_heal (int heal_op, dict_t *options)
e7a346
         case GF_SHD_OP_SPLIT_BRAIN_FILES:
e7a346
                 runner_add_args (&runner, "split-brain-info", NULL);
e7a346
                 if (global_state->mode & GLUSTER_MODE_XML) {
e7a346
-                        runner_add_args (&runner, "xml", NULL);
e7a346
+                        runner_add_args (&runner, "--xml", NULL);
e7a346
                 }
e7a346
                 break;
e7a346
         case GF_SHD_OP_GRANULAR_ENTRY_HEAL_ENABLE:
e7a346
@@ -2864,12 +2864,14 @@ cli_launch_glfs_heal (int heal_op, dict_t *options)
e7a346
         case GF_SHD_OP_HEAL_SUMMARY:
e7a346
                 runner_add_args (&runner, "info-summary", NULL);
e7a346
                 if (global_state->mode & GLUSTER_MODE_XML) {
e7a346
-                        runner_add_args (&runner, "xml", NULL);
e7a346
+                        runner_add_args (&runner, "--xml", NULL);
e7a346
                 }
e7a346
                 break;
e7a346
         default:
e7a346
                 ret = -1;
e7a346
         }
e7a346
+        if (global_state->mode & GLUSTER_MODE_GLFSHEAL_NOLOG)
e7a346
+                runner_add_args(&runner, "--nolog", NULL);
e7a346
         ret = runner_start (&runner);
e7a346
         if (ret == -1)
e7a346
                 goto out;
e7a346
diff --git a/cli/src/cli.c b/cli/src/cli.c
e7a346
index b64d4ef..3fd7bc5 100644
e7a346
--- a/cli/src/cli.c
e7a346
+++ b/cli/src/cli.c
e7a346
@@ -340,6 +340,11 @@ cli_opt_parse (char *opt, struct cli_state *state)
e7a346
                 return 0;
e7a346
         }
e7a346
 
e7a346
+        if (strcmp(opt, "nolog") == 0) {
e7a346
+                state->mode |= GLUSTER_MODE_GLFSHEAL_NOLOG;
e7a346
+                return 0;
e7a346
+        }
e7a346
+
e7a346
         if (strcmp (opt, "wignore-partition") == 0) {
e7a346
                 state->mode |= GLUSTER_MODE_WIGNORE_PARTITION;
e7a346
                 return 0;
e7a346
diff --git a/cli/src/cli.h b/cli/src/cli.h
e7a346
index 109dcd4..104d601 100644
e7a346
--- a/cli/src/cli.h
e7a346
+++ b/cli/src/cli.h
e7a346
@@ -61,6 +61,7 @@ typedef enum {
e7a346
 #define GLUSTER_MODE_XML                (1 << 2)
e7a346
 #define GLUSTER_MODE_WIGNORE            (1 << 3)
e7a346
 #define GLUSTER_MODE_WIGNORE_PARTITION  (1 << 4)
e7a346
+#define GLUSTER_MODE_GLFSHEAL_NOLOG     (1 << 5)
e7a346
 
e7a346
 
e7a346
 #define GLUSTERD_GET_QUOTA_LIST_MOUNT_PATH(abspath, volname, path) do {       \
e7a346
diff --git a/heal/src/glfs-heal.c b/heal/src/glfs-heal.c
e7a346
index 153cd29..12746dc 100644
e7a346
--- a/heal/src/glfs-heal.c
e7a346
+++ b/heal/src/glfs-heal.c
e7a346
@@ -40,6 +40,9 @@ xmlDocPtr        glfsh_doc = NULL;
e7a346
                         ret = 0;                                \
e7a346
         } while (0)                                             \
e7a346
 
e7a346
+#define MODE_XML (1 << 0)
e7a346
+#define MODE_NO_LOG (1 << 1)
e7a346
+
e7a346
 typedef struct num_entries {
e7a346
         uint64_t num_entries;
e7a346
         uint64_t pending_entries;
e7a346
@@ -1434,6 +1437,28 @@ out:
e7a346
         return ret;
e7a346
 }
e7a346
 
e7a346
+static void
e7a346
+parse_flags(int *argc, char **argv, int *flags)
e7a346
+{
e7a346
+        int i = 0;
e7a346
+        char *opt = NULL;
e7a346
+        int count = 0;
e7a346
+
e7a346
+        for (i = 0; i < *argc; i++) {
e7a346
+                opt = strtail(argv[i], "--");
e7a346
+                if (!opt)
e7a346
+                        continue;
e7a346
+                if (strcmp(opt, "nolog") == 0) {
e7a346
+                        *flags |= MODE_NO_LOG;
e7a346
+                        count++;
e7a346
+                } else if (strcmp(opt, "xml") == 0) {
e7a346
+                        *flags |= MODE_XML;
e7a346
+                        count++;
e7a346
+                }
e7a346
+        }
e7a346
+        *argc = *argc - count;
e7a346
+}
e7a346
+
e7a346
 int
e7a346
 glfsh_heal_from_bigger_file_or_mtime (glfs_t *fs, xlator_t *top_subvol,
e7a346
                                       loc_t *rootloc, char *file,
e7a346
@@ -1518,6 +1543,8 @@ main (int argc, char **argv)
e7a346
         char      *file = NULL;
e7a346
         char      *op_errstr = NULL;
e7a346
         gf_xl_afr_op_t heal_op = -1;
e7a346
+        gf_loglevel_t log_level = GF_LOG_INFO;
e7a346
+        int flags = 0;
e7a346
 
e7a346
         if (argc < 2) {
e7a346
                 printf (USAGE_STR, argv[0]);
e7a346
@@ -1526,6 +1553,13 @@ main (int argc, char **argv)
e7a346
         }
e7a346
 
e7a346
         volname = argv[1];
e7a346
+
e7a346
+        parse_flags(&argc, argv, &flags);
e7a346
+        if (flags & MODE_NO_LOG)
e7a346
+                log_level = GF_LOG_NONE;
e7a346
+        if (flags & MODE_XML)
e7a346
+                is_xml = 1;
e7a346
+
e7a346
         switch (argc) {
e7a346
         case 2:
e7a346
                 heal_op = GF_SHD_OP_INDEX_SUMMARY;
e7a346
@@ -1533,9 +1567,6 @@ main (int argc, char **argv)
e7a346
         case 3:
e7a346
                 if (!strcmp (argv[2], "split-brain-info")) {
e7a346
                         heal_op = GF_SHD_OP_SPLIT_BRAIN_FILES;
e7a346
-                } else if (!strcmp (argv[2], "xml")) {
e7a346
-                        heal_op = GF_SHD_OP_INDEX_SUMMARY;
e7a346
-                        is_xml = 1;
e7a346
                 } else if (!strcmp (argv[2], "granular-entry-heal-op")) {
e7a346
                         heal_op = GF_SHD_OP_GRANULAR_ENTRY_HEAL_ENABLE;
e7a346
 		} else if (!strcmp (argv[2], "info-summary")) {
e7a346
@@ -1547,15 +1578,7 @@ main (int argc, char **argv)
e7a346
                 }
e7a346
                 break;
e7a346
         case 4:
e7a346
-                if ((!strcmp (argv[2], "split-brain-info"))
e7a346
-                                && (!strcmp (argv[3], "xml"))) {
e7a346
-                        heal_op = GF_SHD_OP_SPLIT_BRAIN_FILES;
e7a346
-                        is_xml = 1;
e7a346
-                } else if ((!strcmp (argv[2], "info-summary"))
e7a346
-                                && (!strcmp (argv[3], "xml"))) {
e7a346
-                        heal_op = GF_SHD_OP_HEAL_SUMMARY;
e7a346
-                        is_xml = 1;
e7a346
-                } else if (!strcmp (argv[2], "bigger-file")) {
e7a346
+                if (!strcmp (argv[2], "bigger-file")) {
e7a346
                         heal_op = GF_SHD_OP_SBRAIN_HEAL_FROM_BIGGER_FILE;
e7a346
                         file = argv[3];
e7a346
                 } else if (!strcmp (argv[2], "latest-mtime")) {
e7a346
@@ -1592,7 +1615,15 @@ main (int argc, char **argv)
e7a346
         glfsh_output = &glfsh_human_readable;
e7a346
         if (is_xml) {
e7a346
 #if (HAVE_LIB_XML)
e7a346
-                glfsh_output = &glfsh_xml_output;
e7a346
+                if ((heal_op == GF_SHD_OP_INDEX_SUMMARY) ||
e7a346
+                    (heal_op == GF_SHD_OP_SPLIT_BRAIN_FILES) ||
e7a346
+                    (heal_op == GF_SHD_OP_HEAL_SUMMARY)) {
e7a346
+                        glfsh_output = &glfsh_xml_output;
e7a346
+                } else {
e7a346
+                        printf(USAGE_STR, argv[0]);
e7a346
+                        ret = -1;
e7a346
+                        goto out;
e7a346
+                }
e7a346
 #else
e7a346
                 /*No point doing anything, just fail the command*/
e7a346
                 exit (EXIT_FAILURE);
e7a346
@@ -1636,7 +1667,7 @@ main (int argc, char **argv)
e7a346
         }
e7a346
         snprintf (logfilepath, sizeof (logfilepath),
e7a346
                   DEFAULT_HEAL_LOG_FILE_DIRECTORY"/glfsheal-%s.log", volname);
e7a346
-        ret = glfs_set_logging(fs, logfilepath, GF_LOG_INFO);
e7a346
+        ret = glfs_set_logging(fs, logfilepath, log_level);
e7a346
         if (ret < 0) {
e7a346
                 ret = -errno;
e7a346
                 gf_asprintf (&op_errstr, "Failed to set the log file path, "
e7a346
-- 
e7a346
1.8.3.1
e7a346