d1681e
From b6aa09f8718c5ab91ae4e99abb6567fb1601cdbb Mon Sep 17 00:00:00 2001
d1681e
From: Atin Mukherjee <amukherj@redhat.com>
d1681e
Date: Mon, 2 Jul 2018 20:48:22 +0530
d1681e
Subject: [PATCH 307/325] glusterd: Introduce daemon-log-level cluster wide
d1681e
 option
d1681e
d1681e
This option, applicable to the node level daemons can be very helpful in
d1681e
controlling the log level of these services. Please note any daemon
d1681e
which is started prior to setting the specific value of this option (if
d1681e
not INFO) will need to go through a restart to have this change into
d1681e
effect.
d1681e
d1681e
> upstream patch : https://review.gluster.org/#/c/20442/
d1681e
d1681e
Please note there's a difference in deownstream delta. The op-version
d1681e
against this option is already tageed as 3_11_2 in RHGS 3.3.1 and hence
d1681e
the same is retained. Marking this DOWNSTREAM_ONLY label because of
d1681e
d1681e
Label: DOWNSTREAM ONLY
d1681e
d1681e
>Change-Id: I7f6d2620bab2b094c737f5cc816bc093e9c9c4c9
d1681e
>fixes: bz#1597473
d1681e
>Signed-off-by: Atin Mukherjee <amukherj@redhat.com>
d1681e
d1681e
Change-Id: I7f6d2620bab2b094c737f5cc816bc093e9c9c4c9
d1681e
BUG: 1597511
d1681e
Signed-off-by: Atin Mukherjee <amukherj@redhat.com>
d1681e
Reviewed-on: https://code.engineering.redhat.com/gerrit/143137
d1681e
Tested-by: RHGS Build Bot <nigelb@redhat.com>
d1681e
Reviewed-by: Sanju Rakonde <srakonde@redhat.com>
d1681e
---
d1681e
 libglusterfs/src/globals.h                      |  3 +
d1681e
 tests/bugs/glusterd/daemon-log-level-option.t   | 93 +++++++++++++++++++++++++
d1681e
 xlators/mgmt/glusterd/src/glusterd-handler.c    |  1 +
d1681e
 xlators/mgmt/glusterd/src/glusterd-messages.h   | 10 ++-
d1681e
 xlators/mgmt/glusterd/src/glusterd-op-sm.c      | 51 ++++++++++++++
d1681e
 xlators/mgmt/glusterd/src/glusterd-svc-mgmt.c   |  8 +++
d1681e
 xlators/mgmt/glusterd/src/glusterd-volume-set.c |  6 ++
d1681e
 xlators/mgmt/glusterd/src/glusterd.h            |  1 +
d1681e
 8 files changed, 172 insertions(+), 1 deletion(-)
d1681e
 create mode 100644 tests/bugs/glusterd/daemon-log-level-option.t
d1681e
d1681e
diff --git a/libglusterfs/src/globals.h b/libglusterfs/src/globals.h
d1681e
index 8fd3318..39d9716 100644
d1681e
--- a/libglusterfs/src/globals.h
d1681e
+++ b/libglusterfs/src/globals.h
d1681e
@@ -109,6 +109,9 @@
d1681e
 
d1681e
 #define GD_OP_VERSION_3_13_2   31302 /* Op-version for GlusterFS 3.13.2 */
d1681e
 
d1681e
+/* Downstream only change */
d1681e
+#define GD_OP_VERSION_3_11_2   31102 /* Op-version for RHGS 3.3.1-async */
d1681e
+
d1681e
 #include "xlator.h"
d1681e
 
d1681e
 /* THIS */
d1681e
diff --git a/tests/bugs/glusterd/daemon-log-level-option.t b/tests/bugs/glusterd/daemon-log-level-option.t
d1681e
new file mode 100644
d1681e
index 0000000..66e55e3
d1681e
--- /dev/null
d1681e
+++ b/tests/bugs/glusterd/daemon-log-level-option.t
d1681e
@@ -0,0 +1,93 @@
d1681e
+#!/bin/bash
d1681e
+
d1681e
+. $(dirname $0)/../../include.rc
d1681e
+
d1681e
+function Info_messages_count() {
d1681e
+        local shd_log=$1
d1681e
+        cat $shd_log | grep " I " | wc -l
d1681e
+}
d1681e
+
d1681e
+function Warning_messages_count() {
d1681e
+        local shd_log=$1
d1681e
+        cat $shd_log | grep " W " | wc -l
d1681e
+}
d1681e
+
d1681e
+function Debug_messages_count() {
d1681e
+        local shd_log=$1
d1681e
+        cat $shd_log | grep " D " | wc -l
d1681e
+}
d1681e
+
d1681e
+function Trace_messages_count() {
d1681e
+        local shd_log=$1
d1681e
+        cat $shd_log | grep " T " | wc -l
d1681e
+}
d1681e
+
d1681e
+cleanup;
d1681e
+
d1681e
+# Basic checks
d1681e
+TEST glusterd
d1681e
+TEST pidof glusterd
d1681e
+TEST $CLI volume info
d1681e
+
d1681e
+# set cluster.daemon-log-level option to DEBUG
d1681e
+TEST $CLI volume set all cluster.daemon-log-level DEBUG
d1681e
+
d1681e
+#Create a 3X2 distributed-replicate volume
d1681e
+TEST $CLI volume create $V0 replica 2 $H0:$B0/${V0}{1..6};
d1681e
+TEST $CLI volume start $V0
d1681e
+
d1681e
+# log should not have any trace messages
d1681e
+EXPECT 0 Trace_messages_count "/var/log/glusterfs/glustershd.log"
d1681e
+
d1681e
+# stop the volume and remove glustershd log
d1681e
+TEST $CLI volume stop $V0
d1681e
+rm -f /var/log/glusterfs/glustershd.log
d1681e
+
d1681e
+# set cluster.daemon-log-level option to INFO and start the volume
d1681e
+TEST $CLI volume set all cluster.daemon-log-level INFO
d1681e
+TEST $CLI volume start $V0
d1681e
+
d1681e
+# log should not have any debug messages
d1681e
+EXPECT 0 Debug_messages_count "/var/log/glusterfs/glustershd.log"
d1681e
+
d1681e
+# log should not have any trace messages
d1681e
+EXPECT 0 Trace_messages_count "/var/log/glusterfs/glustershd.log"
d1681e
+
d1681e
+# stop the volume and remove glustershd log
d1681e
+TEST $CLI volume stop $V0
d1681e
+rm -f /var/log/glusterfs/glustershd.log
d1681e
+
d1681e
+# set cluster.daemon-log-level option to WARNING and start the volume
d1681e
+TEST $CLI volume set all cluster.daemon-log-level WARNING
d1681e
+TEST $CLI volume start $V0
d1681e
+
d1681e
+# log should not have any info messages
d1681e
+EXPECT 0 Info_messages_count "/var/log/glusterfs/glustershd.log"
d1681e
+
d1681e
+# log should not have any debug messages
d1681e
+EXPECT 0 Debug_messages_count "/var/log/glusterfs/glustershd.log"
d1681e
+
d1681e
+# log should not have any trace messages
d1681e
+EXPECT 0 Trace_messages_count "/var/log/glusterfs/glustershd.log"
d1681e
+
d1681e
+# stop the volume and remove glustershd log
d1681e
+TEST $CLI volume stop $V0
d1681e
+rm -f /var/log/glusterfs/glustershd.log
d1681e
+
d1681e
+# set cluster.daemon-log-level option to ERROR and start the volume
d1681e
+TEST $CLI volume set all cluster.daemon-log-level ERROR
d1681e
+TEST $CLI volume start $V0
d1681e
+
d1681e
+# log should not have any info messages
d1681e
+EXPECT 0 Info_messages_count "/var/log/glusterfs/glustershd.log"
d1681e
+
d1681e
+# log should not have any warning messages
d1681e
+EXPECT 0 Warning_messages_count "/var/log/glusterfs/glustershd.log"
d1681e
+
d1681e
+# log should not have any debug messages
d1681e
+EXPECT 0 Debug_messages_count "/var/log/glusterfs/glustershd.log"
d1681e
+
d1681e
+# log should not have any trace messages
d1681e
+EXPECT 0 Trace_messages_count "/var/log/glusterfs/glustershd.log"
d1681e
+
d1681e
+cleanup
d1681e
diff --git a/xlators/mgmt/glusterd/src/glusterd-handler.c b/xlators/mgmt/glusterd/src/glusterd-handler.c
d1681e
index c072b05..c0c3e25 100644
d1681e
--- a/xlators/mgmt/glusterd/src/glusterd-handler.c
d1681e
+++ b/xlators/mgmt/glusterd/src/glusterd-handler.c
d1681e
@@ -4677,6 +4677,7 @@ gd_is_global_option (char *opt_key)
d1681e
                 strcmp (opt_key, GLUSTERD_GLOBAL_OP_VERSION_KEY) == 0 ||
d1681e
                 strcmp (opt_key, GLUSTERD_BRICK_MULTIPLEX_KEY) == 0 ||
d1681e
                 strcmp (opt_key, GLUSTERD_LOCALTIME_LOGGING_KEY) == 0 ||
d1681e
+                strcmp (opt_key, GLUSTERD_DAEMON_LOG_LEVEL_KEY) == 0 ||
d1681e
                 strcmp (opt_key, GLUSTERD_MAX_OP_VERSION_KEY) == 0);
d1681e
 
d1681e
 out:
d1681e
diff --git a/xlators/mgmt/glusterd/src/glusterd-messages.h b/xlators/mgmt/glusterd/src/glusterd-messages.h
d1681e
index 4ccf299..64f7378 100644
d1681e
--- a/xlators/mgmt/glusterd/src/glusterd-messages.h
d1681e
+++ b/xlators/mgmt/glusterd/src/glusterd-messages.h
d1681e
@@ -41,7 +41,7 @@
d1681e
 
d1681e
 #define GLUSTERD_COMP_BASE      GLFS_MSGID_GLUSTERD
d1681e
 
d1681e
-#define GLFS_NUM_MESSAGES       614
d1681e
+#define GLFS_NUM_MESSAGES       615
d1681e
 
d1681e
 #define GLFS_MSGID_END          (GLUSTERD_COMP_BASE + GLFS_NUM_MESSAGES + 1)
d1681e
 /* Messaged with message IDs */
d1681e
@@ -4984,6 +4984,14 @@
d1681e
  */
d1681e
 #define GD_MSG_MANAGER_FUNCTION_FAILED  (GLUSTERD_COMP_BASE + 614)
d1681e
 
d1681e
+/*!
d1681e
+ * @messageid
d1681e
+ * @diagnosis
d1681e
+ * @recommendedaction
d1681e
+ *
d1681e
+ */
d1681e
+#define GD_MSG_DAEMON_LOG_LEVEL_VOL_OPT_VALIDATE_FAIL (GLUSTERD_COMP_BASE + 615)
d1681e
+
d1681e
 /*------------*/
d1681e
 
d1681e
 #define glfs_msg_end_x GLFS_MSGID_END, "Invalid: End of messages"
d1681e
diff --git a/xlators/mgmt/glusterd/src/glusterd-op-sm.c b/xlators/mgmt/glusterd/src/glusterd-op-sm.c
d1681e
index 7e959a0..d022532 100644
d1681e
--- a/xlators/mgmt/glusterd/src/glusterd-op-sm.c
d1681e
+++ b/xlators/mgmt/glusterd/src/glusterd-op-sm.c
d1681e
@@ -86,6 +86,7 @@ glusterd_all_vol_opts valid_all_vol_opts[] = {
d1681e
          * dynamic value depending on the memory specifications per node */
d1681e
         { GLUSTERD_BRICKMUX_LIMIT_KEY,          "0"},
d1681e
         /*{ GLUSTERD_LOCALTIME_LOGGING_KEY,       "disable"},*/
d1681e
+        { GLUSTERD_DAEMON_LOG_LEVEL_KEY,        "INFO"},
d1681e
         { NULL },
d1681e
 };
d1681e
 
d1681e
@@ -928,6 +929,47 @@ out:
d1681e
 }
d1681e
 
d1681e
 static int
d1681e
+glusterd_validate_daemon_log_level (char *key, char *value, char *errstr)
d1681e
+{
d1681e
+        int32_t            ret                      = -1;
d1681e
+        xlator_t          *this                     = NULL;
d1681e
+        glusterd_conf_t   *conf                     = NULL;
d1681e
+
d1681e
+        this = THIS;
d1681e
+        GF_VALIDATE_OR_GOTO ("glusterd", this, out);
d1681e
+
d1681e
+        conf = this->private;
d1681e
+        GF_VALIDATE_OR_GOTO (this->name, conf, out);
d1681e
+
d1681e
+        GF_VALIDATE_OR_GOTO (this->name, key, out);
d1681e
+        GF_VALIDATE_OR_GOTO (this->name, value, out);
d1681e
+        GF_VALIDATE_OR_GOTO (this->name, errstr, out);
d1681e
+
d1681e
+        ret = 0;
d1681e
+
d1681e
+        if (strcmp (key, GLUSTERD_DAEMON_LOG_LEVEL_KEY)) {
d1681e
+                goto out;
d1681e
+        }
d1681e
+
d1681e
+        if ((strcmp (value, "INFO")) &&
d1681e
+            (strcmp (value, "WARNING")) &&
d1681e
+            (strcmp (value, "DEBUG")) &&
d1681e
+            (strcmp (value, "TRACE")) &&
d1681e
+            (strcmp (value, "ERROR"))) {
d1681e
+                snprintf (errstr, PATH_MAX,
d1681e
+                          "Invalid option(%s). Valid options "
d1681e
+                          "are 'INFO' or 'WARNING' or 'ERROR' or 'DEBUG' or "
d1681e
+                          " 'TRACE'", value);
d1681e
+                gf_msg (this->name, GF_LOG_ERROR, EINVAL,
d1681e
+                        GD_MSG_INVALID_ENTRY, "%s", errstr);
d1681e
+                ret = -1;
d1681e
+        }
d1681e
+
d1681e
+out:
d1681e
+        return ret;
d1681e
+}
d1681e
+
d1681e
+static int
d1681e
 glusterd_op_stage_set_volume (dict_t *dict, char **op_errstr)
d1681e
 {
d1681e
         int                   ret                         = -1;
d1681e
@@ -1326,6 +1368,15 @@ glusterd_op_stage_set_volume (dict_t *dict, char **op_errstr)
d1681e
                         goto out;
d1681e
                 }
d1681e
 
d1681e
+                ret = glusterd_validate_daemon_log_level (key, value, errstr);
d1681e
+                if (ret) {
d1681e
+                        gf_msg (this->name, GF_LOG_ERROR, 0,
d1681e
+                                GD_MSG_DAEMON_LOG_LEVEL_VOL_OPT_VALIDATE_FAIL,
d1681e
+                                "Failed to validate daemon-log-level volume "
d1681e
+                                "options");
d1681e
+                        goto out;
d1681e
+                }
d1681e
+
d1681e
                 if (volinfo) {
d1681e
                         ret = glusterd_volinfo_get (volinfo,
d1681e
                                                 VKEY_FEATURES_TRASH, &val_dup);
d1681e
diff --git a/xlators/mgmt/glusterd/src/glusterd-svc-mgmt.c b/xlators/mgmt/glusterd/src/glusterd-svc-mgmt.c
d1681e
index ba948b4..ebb288c 100644
d1681e
--- a/xlators/mgmt/glusterd/src/glusterd-svc-mgmt.c
d1681e
+++ b/xlators/mgmt/glusterd/src/glusterd-svc-mgmt.c
d1681e
@@ -151,6 +151,8 @@ glusterd_svc_start (glusterd_svc_t *svc, int flags, dict_t *cmdline)
d1681e
         xlator_t            *this                       = NULL;
d1681e
         char                 valgrind_logfile[PATH_MAX] = {0};
d1681e
         char                *localtime_logging          = NULL;
d1681e
+        char                *log_level                  = NULL;
d1681e
+        char                 daemon_log_level[30]       = {0};
d1681e
 
d1681e
         this = THIS;
d1681e
         GF_ASSERT (this);
d1681e
@@ -196,6 +198,12 @@ glusterd_svc_start (glusterd_svc_t *svc, int flags, dict_t *cmdline)
d1681e
                 if (strcmp (localtime_logging, "enable") == 0)
d1681e
                         runner_add_arg (&runner, "--localtime-logging");
d1681e
         }
d1681e
+        if (dict_get_str (priv->opts, GLUSTERD_DAEMON_LOG_LEVEL_KEY,
d1681e
+                          &log_level) == 0) {
d1681e
+                snprintf (daemon_log_level, 30, "--log-level=%s", log_level);
d1681e
+                runner_add_arg (&runner, daemon_log_level);
d1681e
+        }
d1681e
+
d1681e
         if (cmdline)
d1681e
                 dict_foreach (cmdline, svc_add_args, (void *) &runner);
d1681e
 
d1681e
diff --git a/xlators/mgmt/glusterd/src/glusterd-volume-set.c b/xlators/mgmt/glusterd/src/glusterd-volume-set.c
d1681e
index b9da961..8cc756a 100644
d1681e
--- a/xlators/mgmt/glusterd/src/glusterd-volume-set.c
d1681e
+++ b/xlators/mgmt/glusterd/src/glusterd-volume-set.c
d1681e
@@ -3573,6 +3573,12 @@ struct volopt_map_entry glusterd_volopt_map[] = {
d1681e
           .op_version  = GD_OP_VERSION_3_12_0,
d1681e
           .validate_fn = validate_boolean
d1681e
         },*/
d1681e
+        { .key         = GLUSTERD_DAEMON_LOG_LEVEL_KEY,
d1681e
+          .voltype     = "mgmt/glusterd",
d1681e
+          .type        = GLOBAL_NO_DOC,
d1681e
+          .value       = "INFO",
d1681e
+          .op_version  = GD_OP_VERSION_3_11_2
d1681e
+        },
d1681e
         { .key        = "disperse.parallel-writes",
d1681e
           .voltype    = "cluster/disperse",
d1681e
           .type       = NO_DOC,
d1681e
diff --git a/xlators/mgmt/glusterd/src/glusterd.h b/xlators/mgmt/glusterd/src/glusterd.h
d1681e
index b0656e6..4ec609f 100644
d1681e
--- a/xlators/mgmt/glusterd/src/glusterd.h
d1681e
+++ b/xlators/mgmt/glusterd/src/glusterd.h
d1681e
@@ -56,6 +56,7 @@
d1681e
 #define GLUSTERD_BRICK_MULTIPLEX_KEY    "cluster.brick-multiplex"
d1681e
 #define GLUSTERD_BRICKMUX_LIMIT_KEY     "cluster.max-bricks-per-process"
d1681e
 #define GLUSTERD_LOCALTIME_LOGGING_KEY  "cluster.localtime-logging"
d1681e
+#define GLUSTERD_DAEMON_LOG_LEVEL_KEY   "cluster.daemon-log-level"
d1681e
 
d1681e
 #define GANESHA_HA_CONF  CONFDIR "/ganesha-ha.conf"
d1681e
 #define GANESHA_EXPORT_DIRECTORY        CONFDIR"/exports"
d1681e
-- 
d1681e
1.8.3.1
d1681e