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