diff options
author | Gluster Ant <bugzilla-bot@gluster.org> | 2018-09-12 17:52:45 +0530 |
---|---|---|
committer | Nigel Babu <nigelb@redhat.com> | 2018-09-12 17:52:45 +0530 |
commit | e16868dede6455cab644805af6fe1ac312775e13 (patch) | |
tree | 15aebdb4fff2d87cf8a72f836816b3aa634da58d /libglusterfs/src/logging.c | |
parent | 45a71c0548b6fd2c757aa2e7b7671a1411948894 (diff) |
Land part 2 of clang-format changes
Change-Id: Ia84cc24c8924e6d22d02ac15f611c10e26db99b4
Signed-off-by: Nigel Babu <nigelb@redhat.com>
Diffstat (limited to 'libglusterfs/src/logging.c')
-rw-r--r-- | libglusterfs/src/logging.c | 4038 |
1 files changed, 2020 insertions, 2018 deletions
diff --git a/libglusterfs/src/logging.c b/libglusterfs/src/logging.c index a46cb234b72..61909ef4dae 100644 --- a/libglusterfs/src/logging.c +++ b/libglusterfs/src/logging.c @@ -28,14 +28,14 @@ #include "syscall.h" -#define GF_JSON_MSG_LENGTH 8192 -#define GF_SYSLOG_CEE_FORMAT \ - "@cee: {\"msg\": \"%s\", \"gf_code\": \"%u\", \"gf_message\": \"%s\"}" -#define GF_LOG_CONTROL_FILE "/etc/glusterfs/logger.conf" -#define GF_LOG_BACKTRACE_DEPTH 5 -#define GF_LOG_BACKTRACE_SIZE 4096 -#define GF_LOG_TIMESTR_SIZE 256 -#define GF_MAX_SLOG_PAIR_COUNT 100 +#define GF_JSON_MSG_LENGTH 8192 +#define GF_SYSLOG_CEE_FORMAT \ + "@cee: {\"msg\": \"%s\", \"gf_code\": \"%u\", \"gf_message\": \"%s\"}" +#define GF_LOG_CONTROL_FILE "/etc/glusterfs/logger.conf" +#define GF_LOG_BACKTRACE_DEPTH 5 +#define GF_LOG_BACKTRACE_SIZE 4096 +#define GF_LOG_TIMESTR_SIZE 256 +#define GF_MAX_SLOG_PAIR_COUNT 100 #include "xlator.h" #include "logging.h" @@ -46,147 +46,146 @@ /* Do not replace gf_log in TEST_LOG with gf_msg, as there is a slight chance * that it could lead to an infinite recursion.*/ -#define TEST_LOG(__msg, __args ...) \ - gf_log ("logging-infra", GF_LOG_DEBUG, __msg, ##__args); +#define TEST_LOG(__msg, __args...) \ + gf_log("logging-infra", GF_LOG_DEBUG, __msg, ##__args); void -gf_log_flush_timeout_cbk (void *data); +gf_log_flush_timeout_cbk(void *data); int -gf_log_inject_timer_event (glusterfs_ctx_t *ctx); +gf_log_inject_timer_event(glusterfs_ctx_t *ctx); static void -gf_log_flush_extra_msgs (glusterfs_ctx_t *ctx, uint32_t new); +gf_log_flush_extra_msgs(glusterfs_ctx_t *ctx, uint32_t new); static char *gf_level_strings[] = {"", /* NONE */ - "M", /* EMERGENCY */ - "A", /* ALERT */ - "C", /* CRITICAL */ - "E", /* ERROR */ - "W", /* WARNING */ - "N", /* NOTICE */ - "I", /* INFO */ - "D", /* DEBUG */ - "T", /* TRACE */ - "" -}; + "M", /* EMERGENCY */ + "A", /* ALERT */ + "C", /* CRITICAL */ + "E", /* ERROR */ + "W", /* WARNING */ + "N", /* NOTICE */ + "I", /* INFO */ + "D", /* DEBUG */ + "T", /* TRACE */ + ""}; /* Ideally this should get moved to logging.h */ struct _msg_queue { - struct list_head msgs; + struct list_head msgs; }; struct _log_msg { - const char *msg; - struct list_head queue; + const char *msg; + struct list_head queue; }; void -gf_log_logrotate (int signum) +gf_log_logrotate(int signum) { - glusterfs_ctx_t *ctx = NULL; + glusterfs_ctx_t *ctx = NULL; - ctx = THIS->ctx; + ctx = THIS->ctx; - if (ctx) { - ctx->log.logrotate = 1; - ctx->log.cmd_history_logrotate = 1; - } + if (ctx) { + ctx->log.logrotate = 1; + ctx->log.cmd_history_logrotate = 1; + } } void -gf_log_enable_syslog (void) +gf_log_enable_syslog(void) { - glusterfs_ctx_t *ctx = NULL; + glusterfs_ctx_t *ctx = NULL; - ctx = THIS->ctx; + ctx = THIS->ctx; - if (ctx) - ctx->log.gf_log_syslog = 1; + if (ctx) + ctx->log.gf_log_syslog = 1; } void -gf_log_disable_syslog (void) +gf_log_disable_syslog(void) { - glusterfs_ctx_t *ctx = NULL; + glusterfs_ctx_t *ctx = NULL; - ctx = THIS->ctx; + ctx = THIS->ctx; - if (ctx) - ctx->log.gf_log_syslog = 0; + if (ctx) + ctx->log.gf_log_syslog = 0; } gf_loglevel_t -gf_log_get_loglevel (void) +gf_log_get_loglevel(void) { - glusterfs_ctx_t *ctx = NULL; + glusterfs_ctx_t *ctx = NULL; - ctx = THIS->ctx; + ctx = THIS->ctx; - if (ctx) - return ctx->log.loglevel; - else - /* return global defaults (see gf_log_globals_init) */ - return GF_LOG_INFO; + if (ctx) + return ctx->log.loglevel; + else + /* return global defaults (see gf_log_globals_init) */ + return GF_LOG_INFO; } void -gf_log_set_loglevel (glusterfs_ctx_t *ctx, gf_loglevel_t level) +gf_log_set_loglevel(glusterfs_ctx_t *ctx, gf_loglevel_t level) { - if (ctx) - ctx->log.loglevel = level; + if (ctx) + ctx->log.loglevel = level; } int -gf_log_get_localtime (void) +gf_log_get_localtime(void) { - glusterfs_ctx_t *ctx = NULL; + glusterfs_ctx_t *ctx = NULL; - ctx = THIS->ctx; + ctx = THIS->ctx; - if (ctx) - return ctx->log.localtime; - else - /* return global defaults (see gf_log_globals_init) */ - return 0; + if (ctx) + return ctx->log.localtime; + else + /* return global defaults (see gf_log_globals_init) */ + return 0; } void -gf_log_set_localtime (int on_off) +gf_log_set_localtime(int on_off) { - glusterfs_ctx_t *ctx = NULL; + glusterfs_ctx_t *ctx = NULL; - ctx = THIS->ctx; + ctx = THIS->ctx; - if (ctx) - ctx->log.localtime = on_off; + if (ctx) + ctx->log.localtime = on_off; } void -gf_log_flush (void) +gf_log_flush(void) { - xlator_t *this = NULL; - glusterfs_ctx_t *ctx = NULL; + xlator_t *this = NULL; + glusterfs_ctx_t *ctx = NULL; - this = THIS; - ctx = this->ctx; + this = THIS; + ctx = this->ctx; - if (ctx && ctx->log.logger == gf_logger_glusterlog) { - pthread_mutex_lock (&ctx->log.logfile_mutex); - fflush (ctx->log.gf_log_logfile); - pthread_mutex_unlock (&ctx->log.logfile_mutex); - } + if (ctx && ctx->log.logger == gf_logger_glusterlog) { + pthread_mutex_lock(&ctx->log.logfile_mutex); + fflush(ctx->log.gf_log_logfile); + pthread_mutex_unlock(&ctx->log.logfile_mutex); + } - return; + return; } void -gf_log_set_xl_loglevel (void *this, gf_loglevel_t level) +gf_log_set_xl_loglevel(void *this, gf_loglevel_t level) { - xlator_t *xl = this; - if (!xl) - return; - xl->loglevel = level; + xlator_t *xl = this; + if (!xl) + return; + xl->loglevel = level; } /* TODO: The following get/set functions are yet not invoked from anywhere @@ -207,104 +206,104 @@ gf_log_set_xl_loglevel (void *this, gf_loglevel_t level) * care needs to be taken to configure and start daemons based on the versions * that supports these features */ gf_log_format_t -gf_log_get_logformat (void) +gf_log_get_logformat(void) { - glusterfs_ctx_t *ctx = NULL; + glusterfs_ctx_t *ctx = NULL; - ctx = THIS->ctx; + ctx = THIS->ctx; - if (ctx) - return ctx->log.logformat; - else - /* return global defaluts (see gf_log_globals_init) */ - return gf_logformat_withmsgid; + if (ctx) + return ctx->log.logformat; + else + /* return global defaluts (see gf_log_globals_init) */ + return gf_logformat_withmsgid; } void -gf_log_set_logformat (gf_log_format_t format) +gf_log_set_logformat(gf_log_format_t format) { - glusterfs_ctx_t *ctx = NULL; + glusterfs_ctx_t *ctx = NULL; - ctx = THIS->ctx; + ctx = THIS->ctx; - if (ctx) - ctx->log.logformat = format; + if (ctx) + ctx->log.logformat = format; } gf_log_logger_t -gf_log_get_logger (void) +gf_log_get_logger(void) { - glusterfs_ctx_t *ctx = NULL; + glusterfs_ctx_t *ctx = NULL; - ctx = THIS->ctx; + ctx = THIS->ctx; - if (ctx) - return ctx->log.logger; - else - /* return global defaluts (see gf_log_globals_init) */ - return gf_logger_glusterlog; + if (ctx) + return ctx->log.logger; + else + /* return global defaluts (see gf_log_globals_init) */ + return gf_logger_glusterlog; } void -gf_log_set_logger (gf_log_logger_t logger) +gf_log_set_logger(gf_log_logger_t logger) { - glusterfs_ctx_t *ctx = NULL; + glusterfs_ctx_t *ctx = NULL; - ctx = THIS->ctx; + ctx = THIS->ctx; - if (ctx) - ctx->log.logger = logger; + if (ctx) + ctx->log.logger = logger; } gf_loglevel_t -gf_log_get_xl_loglevel (void *this) +gf_log_get_xl_loglevel(void *this) { - xlator_t *xl = this; - if (!xl) - return 0; - return xl->loglevel; + xlator_t *xl = this; + if (!xl) + return 0; + return xl->loglevel; } void -gf_log_set_log_buf_size (uint32_t buf_size) +gf_log_set_log_buf_size(uint32_t buf_size) { - uint32_t old = 0; - glusterfs_ctx_t *ctx = THIS->ctx; - - pthread_mutex_lock (&ctx->log.log_buf_lock); - { - old = ctx->log.lru_size; - ctx->log.lru_size = buf_size; - } - pthread_mutex_unlock (&ctx->log.log_buf_lock); - - /* If the old size is less than/equal to the new size, then do nothing. - * - * But if the new size is less than the old size, then - * a. If the cur size of the buf is less than or equal the new size, - * then do nothing. - * b. But if the current size of the buf is greater than the new size, - * then flush the least recently used (cur size - new_size) msgs - * to disk. - */ - if (buf_size < old) - gf_log_flush_extra_msgs (ctx, buf_size); + uint32_t old = 0; + glusterfs_ctx_t *ctx = THIS->ctx; + + pthread_mutex_lock(&ctx->log.log_buf_lock); + { + old = ctx->log.lru_size; + ctx->log.lru_size = buf_size; + } + pthread_mutex_unlock(&ctx->log.log_buf_lock); + + /* If the old size is less than/equal to the new size, then do nothing. + * + * But if the new size is less than the old size, then + * a. If the cur size of the buf is less than or equal the new size, + * then do nothing. + * b. But if the current size of the buf is greater than the new size, + * then flush the least recently used (cur size - new_size) msgs + * to disk. + */ + if (buf_size < old) + gf_log_flush_extra_msgs(ctx, buf_size); } void -gf_log_set_log_flush_timeout (uint32_t timeout) +gf_log_set_log_flush_timeout(uint32_t timeout) { - THIS->ctx->log.timeout = timeout; + THIS->ctx->log.timeout = timeout; } log_buf_t * -log_buf_new () +log_buf_new() { - log_buf_t *buf = NULL; + log_buf_t *buf = NULL; - buf = mem_get0 (THIS->ctx->logbuf_pool); + buf = mem_get0(THIS->ctx->logbuf_pool); - return buf; + return buf; } /* If log_buf_init() fails (indicated by a return value of -1), @@ -312,147 +311,145 @@ log_buf_new () * the log_buf_t object back to its memory pool. */ int -log_buf_init (log_buf_t *buf, const char *domain, const char *file, - const char *function, int32_t line, gf_loglevel_t level, - int errnum, uint64_t msgid, char **appmsgstr, int graph_id) +log_buf_init(log_buf_t *buf, const char *domain, const char *file, + const char *function, int32_t line, gf_loglevel_t level, + int errnum, uint64_t msgid, char **appmsgstr, int graph_id) { - int ret = -1; + int ret = -1; - if (!buf || !domain || !file || !function || !appmsgstr || !*appmsgstr) - goto out; + if (!buf || !domain || !file || !function || !appmsgstr || !*appmsgstr) + goto out; - buf->msg = gf_strdup (*appmsgstr); - if (!buf->msg) - goto out; + buf->msg = gf_strdup(*appmsgstr); + if (!buf->msg) + goto out; - buf->msg_id = msgid; - buf->errnum = errnum; - buf->domain = gf_strdup (domain); - if (!buf->domain) - goto out; + buf->msg_id = msgid; + buf->errnum = errnum; + buf->domain = gf_strdup(domain); + if (!buf->domain) + goto out; - buf->file = gf_strdup (file); - if (!buf->file) - goto out; + buf->file = gf_strdup(file); + if (!buf->file) + goto out; - buf->function = gf_strdup (function); - if (!buf->function) - goto out; + buf->function = gf_strdup(function); + if (!buf->function) + goto out; - buf->line = line; - buf->level = level; - buf->refcount = 0; - buf->graph_id = graph_id; - INIT_LIST_HEAD (&buf->msg_list); + buf->line = line; + buf->level = level; + buf->refcount = 0; + buf->graph_id = graph_id; + INIT_LIST_HEAD(&buf->msg_list); - ret = 0; + ret = 0; out: - return ret; + return ret; } int -log_buf_destroy (log_buf_t *buf) +log_buf_destroy(log_buf_t *buf) { + if (!buf) + return -1; - if (!buf) - return -1; - - GF_FREE (buf->msg); - GF_FREE (buf->domain); - GF_FREE (buf->file); - GF_FREE (buf->function); + GF_FREE(buf->msg); + GF_FREE(buf->domain); + GF_FREE(buf->file); + GF_FREE(buf->function); - mem_put (buf); - return 0; + mem_put(buf); + return 0; } static void gf_log_rotate(glusterfs_ctx_t *ctx) { - int fd = -1; - FILE *new_logfile = NULL; - FILE *old_logfile = NULL; - - /* not involving locks on initial check to speed it up */ - if (ctx->log.logrotate) { - /* let only one winner through on races */ - pthread_mutex_lock (&ctx->log.logfile_mutex); - - if (!ctx->log.logrotate) { - pthread_mutex_unlock (&ctx->log.logfile_mutex); - return; - } else { - ctx->log.logrotate = 0; - pthread_mutex_unlock (&ctx->log.logfile_mutex); - } - - fd = sys_open (ctx->log.filename, O_CREAT | O_WRONLY | O_APPEND, - S_IRUSR | S_IWUSR); - if (fd < 0) { - gf_msg ("logrotate", GF_LOG_ERROR, errno, - LG_MSG_FILE_OP_FAILED, "failed to open " - "logfile"); - return; - } + int fd = -1; + FILE *new_logfile = NULL; + FILE *old_logfile = NULL; + + /* not involving locks on initial check to speed it up */ + if (ctx->log.logrotate) { + /* let only one winner through on races */ + pthread_mutex_lock(&ctx->log.logfile_mutex); + + if (!ctx->log.logrotate) { + pthread_mutex_unlock(&ctx->log.logfile_mutex); + return; + } else { + ctx->log.logrotate = 0; + pthread_mutex_unlock(&ctx->log.logfile_mutex); + } - new_logfile = fdopen (fd, "a"); - if (!new_logfile) { - gf_msg ("logrotate", GF_LOG_CRITICAL, errno, - LG_MSG_FILE_OP_FAILED, "failed to open logfile" - " %s", ctx->log.filename); - sys_close (fd); - return; - } + fd = sys_open(ctx->log.filename, O_CREAT | O_WRONLY | O_APPEND, + S_IRUSR | S_IWUSR); + if (fd < 0) { + gf_msg("logrotate", GF_LOG_ERROR, errno, LG_MSG_FILE_OP_FAILED, + "failed to open " + "logfile"); + return; + } - pthread_mutex_lock (&ctx->log.logfile_mutex); - { - if (ctx->log.logfile) - old_logfile = ctx->log.logfile; + new_logfile = fdopen(fd, "a"); + if (!new_logfile) { + gf_msg("logrotate", GF_LOG_CRITICAL, errno, LG_MSG_FILE_OP_FAILED, + "failed to open logfile" + " %s", + ctx->log.filename); + sys_close(fd); + return; + } - ctx->log.gf_log_logfile = ctx->log.logfile = - new_logfile; - } - pthread_mutex_unlock (&ctx->log.logfile_mutex); + pthread_mutex_lock(&ctx->log.logfile_mutex); + { + if (ctx->log.logfile) + old_logfile = ctx->log.logfile; - if (old_logfile != NULL) - fclose (old_logfile); + ctx->log.gf_log_logfile = ctx->log.logfile = new_logfile; } + pthread_mutex_unlock(&ctx->log.logfile_mutex); - return; + if (old_logfile != NULL) + fclose(old_logfile); + } + + return; } void -gf_log_globals_fini (void) +gf_log_globals_fini(void) { - /* TODO: Nobody is invoking the fini, but cleanup needs to happen here, - * needs cleanup for, log.ident, log.filename, closelog, log file close - * rotate state, possibly under a lock */ - pthread_mutex_destroy (&THIS->ctx->log.logfile_mutex); - pthread_mutex_destroy (&THIS->ctx->log.log_buf_lock); + /* TODO: Nobody is invoking the fini, but cleanup needs to happen here, + * needs cleanup for, log.ident, log.filename, closelog, log file close + * rotate state, possibly under a lock */ + pthread_mutex_destroy(&THIS->ctx->log.logfile_mutex); + pthread_mutex_destroy(&THIS->ctx->log.log_buf_lock); } void -gf_log_disable_suppression_before_exit (glusterfs_ctx_t *ctx) +gf_log_disable_suppression_before_exit(glusterfs_ctx_t *ctx) { - /* - * First set log buf size to 0. This would ensure two things: - * i. that all outstanding log messages are flushed to disk, and - * ii. all subsequent calls to gf_msg will result in the logs getting - * directly flushed to disk without being buffered. - * - * Then, cancel the current log timer event. - */ - - gf_log_set_log_buf_size (0); - pthread_mutex_lock (&ctx->log.log_buf_lock); - { - if (ctx->log.log_flush_timer) { - gf_timer_call_cancel (ctx, ctx->log.log_flush_timer); - ctx->log.log_flush_timer = NULL; - } + /* + * First set log buf size to 0. This would ensure two things: + * i. that all outstanding log messages are flushed to disk, and + * ii. all subsequent calls to gf_msg will result in the logs getting + * directly flushed to disk without being buffered. + * + * Then, cancel the current log timer event. + */ + + gf_log_set_log_buf_size(0); + pthread_mutex_lock(&ctx->log.log_buf_lock); + { + if (ctx->log.log_flush_timer) { + gf_timer_call_cancel(ctx, ctx->log.log_flush_timer); + ctx->log.log_flush_timer = NULL; } - pthread_mutex_unlock (&ctx->log.log_buf_lock); - + } + pthread_mutex_unlock(&ctx->log.log_buf_lock); } /** gf_log_fini - function to perform the cleanup of the log information @@ -461,45 +458,44 @@ gf_log_disable_suppression_before_exit (glusterfs_ctx_t *ctx) * failure: -1 */ int -gf_log_fini (void *data) +gf_log_fini(void *data) { - glusterfs_ctx_t *ctx = data; - int ret = 0; - FILE *old_logfile = NULL; + glusterfs_ctx_t *ctx = data; + int ret = 0; + FILE *old_logfile = NULL; - if (ctx == NULL) { - ret = -1; - goto out; - } + if (ctx == NULL) { + ret = -1; + goto out; + } - gf_log_disable_suppression_before_exit (ctx); + gf_log_disable_suppression_before_exit(ctx); - pthread_mutex_lock (&ctx->log.logfile_mutex); - { - if (ctx->log.logfile) { - old_logfile = ctx->log.logfile; - - /* Logfile needs to be set to NULL, so that any - call to gf_log after calling gf_log_fini, will - log the message to stderr. - */ - ctx->log.loglevel = GF_LOG_NONE; - ctx->log.logfile = NULL; - } + pthread_mutex_lock(&ctx->log.logfile_mutex); + { + if (ctx->log.logfile) { + old_logfile = ctx->log.logfile; + + /* Logfile needs to be set to NULL, so that any + call to gf_log after calling gf_log_fini, will + log the message to stderr. + */ + ctx->log.loglevel = GF_LOG_NONE; + ctx->log.logfile = NULL; } - pthread_mutex_unlock (&ctx->log.logfile_mutex); + } + pthread_mutex_unlock(&ctx->log.logfile_mutex); - if (old_logfile && (fclose (old_logfile) != 0)) - ret = -1; + if (old_logfile && (fclose(old_logfile) != 0)) + ret = -1; - GF_FREE (ctx->log.ident); - GF_FREE (ctx->log.filename); + GF_FREE(ctx->log.ident); + GF_FREE(ctx->log.filename); - out: - return ret; +out: + return ret; } - /** * gf_openlog -function to open syslog specific to gluster based on * existence of file /etc/glusterfs/logger.conf @@ -512,27 +508,26 @@ gf_log_fini (void *data) * @return: void */ void -gf_openlog (const char *ident, int option, int facility) +gf_openlog(const char *ident, int option, int facility) { - int _option = option; - int _facility = facility; - - if (-1 == _option) { - _option = LOG_PID | LOG_NDELAY; - } - if (-1 == _facility) { - _facility = LOG_LOCAL1; - } - - /* TODO: Should check for errors here and return appropriately */ - setlocale(LC_ALL, ""); - setlocale(LC_NUMERIC, "C"); /* C-locale for strtod, ... */ - /* close the previous syslog if open as we are changing settings */ - closelog (); - openlog(ident, _option, _facility); + int _option = option; + int _facility = facility; + + if (-1 == _option) { + _option = LOG_PID | LOG_NDELAY; + } + if (-1 == _facility) { + _facility = LOG_LOCAL1; + } + + /* TODO: Should check for errors here and return appropriately */ + setlocale(LC_ALL, ""); + setlocale(LC_NUMERIC, "C"); /* C-locale for strtod, ... */ + /* close the previous syslog if open as we are changing settings */ + closelog(); + openlog(ident, _option, _facility); } - /** * _json_escape -function to convert string to json encoded string * @str: input string @@ -559,85 +554,75 @@ gf_openlog (const char *ident, int option, int facility) char * _json_escape(const char *str, char *buf, size_t len) { - static const unsigned char json_exceptions[UCHAR_MAX + 1] = - { - [0x01] = 1, [0x02] = 1, [0x03] = 1, [0x04] = 1, - [0x05] = 1, [0x06] = 1, [0x07] = 1, [0x08] = 1, - [0x09] = 1, [0x0a] = 1, [0x0b] = 1, [0x0c] = 1, - [0x0d] = 1, [0x0e] = 1, [0x0f] = 1, [0x10] = 1, - [0x11] = 1, [0x12] = 1, [0x13] = 1, [0x14] = 1, - [0x15] = 1, [0x16] = 1, [0x17] = 1, [0x18] = 1, - [0x19] = 1, [0x1a] = 1, [0x1b] = 1, [0x1c] = 1, - [0x1d] = 1, [0x1e] = 1, [0x1f] = 1, - ['\\'] = 1, ['"'] = 1 - }; - static const char json_hex_chars[16] = "0123456789abcdef"; - unsigned char *p = NULL; - size_t pos = 0; - - if (!str || !buf || len <= 0) { - return NULL; - } - - for (p = (unsigned char *)str; - *p && (pos + 1) < len; - p++) - { - if (json_exceptions[*p] == 0) { - buf[pos++] = *p; - continue; - } - - if ((pos + 2) >= len) { - break; - } - - switch (*p) - { - case '\b': - buf[pos++] = '\\'; - buf[pos++] = 'b'; - break; - case '\n': - buf[pos++] = '\\'; - buf[pos++] = 'n'; - break; - case '\r': - buf[pos++] = '\\'; - buf[pos++] = 'r'; - break; - case '\t': - buf[pos++] = '\\'; - buf[pos++] = 't'; - break; - case '\\': - buf[pos++] = '\\'; - buf[pos++] = '\\'; - break; - case '"': - buf[pos++] = '\\'; - buf[pos++] = '"'; - break; - default: - if ((pos + 6) >= len) { - buf[pos] = '\0'; - return (char *)p; - } - buf[pos++] = '\\'; - buf[pos++] = 'u'; - buf[pos++] = '0'; - buf[pos++] = '0'; - buf[pos++] = json_hex_chars[(*p) >> 4]; - buf[pos++] = json_hex_chars[(*p) & 0xf]; - break; + static const unsigned char json_exceptions[UCHAR_MAX + 1] = { + [0x01] = 1, [0x02] = 1, [0x03] = 1, [0x04] = 1, [0x05] = 1, [0x06] = 1, + [0x07] = 1, [0x08] = 1, [0x09] = 1, [0x0a] = 1, [0x0b] = 1, [0x0c] = 1, + [0x0d] = 1, [0x0e] = 1, [0x0f] = 1, [0x10] = 1, [0x11] = 1, [0x12] = 1, + [0x13] = 1, [0x14] = 1, [0x15] = 1, [0x16] = 1, [0x17] = 1, [0x18] = 1, + [0x19] = 1, [0x1a] = 1, [0x1b] = 1, [0x1c] = 1, [0x1d] = 1, [0x1e] = 1, + [0x1f] = 1, ['\\'] = 1, ['"'] = 1}; + static const char json_hex_chars[16] = "0123456789abcdef"; + unsigned char *p = NULL; + size_t pos = 0; + + if (!str || !buf || len <= 0) { + return NULL; + } + + for (p = (unsigned char *)str; *p && (pos + 1) < len; p++) { + if (json_exceptions[*p] == 0) { + buf[pos++] = *p; + continue; + } + + if ((pos + 2) >= len) { + break; + } + + switch (*p) { + case '\b': + buf[pos++] = '\\'; + buf[pos++] = 'b'; + break; + case '\n': + buf[pos++] = '\\'; + buf[pos++] = 'n'; + break; + case '\r': + buf[pos++] = '\\'; + buf[pos++] = 'r'; + break; + case '\t': + buf[pos++] = '\\'; + buf[pos++] = 't'; + break; + case '\\': + buf[pos++] = '\\'; + buf[pos++] = '\\'; + break; + case '"': + buf[pos++] = '\\'; + buf[pos++] = '"'; + break; + default: + if ((pos + 6) >= len) { + buf[pos] = '\0'; + return (char *)p; } + buf[pos++] = '\\'; + buf[pos++] = 'u'; + buf[pos++] = '0'; + buf[pos++] = '0'; + buf[pos++] = json_hex_chars[(*p) >> 4]; + buf[pos++] = json_hex_chars[(*p) & 0xf]; + break; } + } - buf[pos] = '\0'; - return (char *)p; + buf[pos] = '\0'; + return (char *)p; } - /** * gf_syslog -function to submit message to syslog specific to gluster * @facility_priority: facility_priority of syslog() @@ -646,158 +631,162 @@ _json_escape(const char *str, char *buf, size_t len) * @return: void */ void -gf_syslog (int facility_priority, char *format, ...) +gf_syslog(int facility_priority, char *format, ...) { - char *msg = NULL; - char json_msg[GF_JSON_MSG_LENGTH]; - GF_UNUSED char *p = NULL; - va_list ap; - - GF_ASSERT (format); - - va_start (ap, format); - if (vasprintf (&msg, format, ap) != -1) { - p = _json_escape (msg, json_msg, GF_JSON_MSG_LENGTH); - syslog (facility_priority, "%s", msg); - free (msg); - } else - syslog (GF_LOG_CRITICAL, "vasprintf() failed, out of memory?"); - va_end (ap); + char *msg = NULL; + char json_msg[GF_JSON_MSG_LENGTH]; + GF_UNUSED char *p = NULL; + va_list ap; + + GF_ASSERT(format); + + va_start(ap, format); + if (vasprintf(&msg, format, ap) != -1) { + p = _json_escape(msg, json_msg, GF_JSON_MSG_LENGTH); + syslog(facility_priority, "%s", msg); + free(msg); + } else + syslog(GF_LOG_CRITICAL, "vasprintf() failed, out of memory?"); + va_end(ap); } void -gf_log_globals_init (void *data, gf_loglevel_t level) +gf_log_globals_init(void *data, gf_loglevel_t level) { - glusterfs_ctx_t *ctx = data; + glusterfs_ctx_t *ctx = data; - pthread_mutex_init (&ctx->log.logfile_mutex, NULL); + pthread_mutex_init(&ctx->log.logfile_mutex, NULL); - ctx->log.loglevel = level; - ctx->log.gf_log_syslog = 1; - ctx->log.sys_log_level = GF_LOG_CRITICAL; - ctx->log.logger = gf_logger_glusterlog; - ctx->log.logformat = gf_logformat_withmsgid; - ctx->log.lru_size = GF_LOG_LRU_BUFSIZE_DEFAULT; - ctx->log.timeout = GF_LOG_FLUSH_TIMEOUT_DEFAULT; - ctx->log.localtime = GF_LOG_LOCALTIME_DEFAULT; + ctx->log.loglevel = level; + ctx->log.gf_log_syslog = 1; + ctx->log.sys_log_level = GF_LOG_CRITICAL; + ctx->log.logger = gf_logger_glusterlog; + ctx->log.logformat = gf_logformat_withmsgid; + ctx->log.lru_size = GF_LOG_LRU_BUFSIZE_DEFAULT; + ctx->log.timeout = GF_LOG_FLUSH_TIMEOUT_DEFAULT; + ctx->log.localtime = GF_LOG_LOCALTIME_DEFAULT; - pthread_mutex_init (&ctx->log.log_buf_lock, NULL); + pthread_mutex_init(&ctx->log.log_buf_lock, NULL); - INIT_LIST_HEAD (&ctx->log.lru_queue); + INIT_LIST_HEAD(&ctx->log.lru_queue); #ifdef GF_LINUX_HOST_OS - /* For the 'syslog' output. one can grep 'GlusterFS' in syslog - for serious logs */ - openlog ("GlusterFS", LOG_PID, LOG_DAEMON); + /* For the 'syslog' output. one can grep 'GlusterFS' in syslog + for serious logs */ + openlog("GlusterFS", LOG_PID, LOG_DAEMON); #endif - } int -gf_log_init (void *data, const char *file, const char *ident) +gf_log_init(void *data, const char *file, const char *ident) { - glusterfs_ctx_t *ctx = NULL; - int fd = -1; - struct stat buf; - - ctx = data; - - if (ctx == NULL) { - fprintf (stderr, "ERROR: ctx is NULL\n"); - return -1; - } - if (ident) { - GF_FREE (ctx->log.ident); - ctx->log.ident = gf_strdup (ident); - } - - /* we keep the files and the syslog open, so that on logger change, we - * are ready to log anywhere, that the new value specifies */ - if (ctx->log.ident) { - gf_openlog (ctx->log.ident, -1, LOG_DAEMON); - } else { - gf_openlog (NULL, -1, LOG_DAEMON); - } - /* TODO: make FACILITY configurable than LOG_DAEMON */ - if (sys_stat (GF_LOG_CONTROL_FILE, &buf) == 0) { - /* use syslog logging */ - ctx->log.log_control_file_found = 1; - } else { - /* use old style logging */ - ctx->log.log_control_file_found = 0; + glusterfs_ctx_t *ctx = NULL; + int fd = -1; + struct stat buf; + + ctx = data; + + if (ctx == NULL) { + fprintf(stderr, "ERROR: ctx is NULL\n"); + return -1; + } + if (ident) { + GF_FREE(ctx->log.ident); + ctx->log.ident = gf_strdup(ident); + } + + /* we keep the files and the syslog open, so that on logger change, we + * are ready to log anywhere, that the new value specifies */ + if (ctx->log.ident) { + gf_openlog(ctx->log.ident, -1, LOG_DAEMON); + } else { + gf_openlog(NULL, -1, LOG_DAEMON); + } + /* TODO: make FACILITY configurable than LOG_DAEMON */ + if (sys_stat(GF_LOG_CONTROL_FILE, &buf) == 0) { + /* use syslog logging */ + ctx->log.log_control_file_found = 1; + } else { + /* use old style logging */ + ctx->log.log_control_file_found = 0; + } + + if (!file) { + fprintf(stderr, "ERROR: no filename specified\n"); + return -1; + } + + /* free the (possible) previous filename */ + GF_FREE(ctx->log.filename); + ctx->log.filename = NULL; + + if (strcmp(file, "-") == 0) { + int dupfd = -1; + + ctx->log.filename = gf_strdup("/dev/stderr"); + if (!ctx->log.filename) { + fprintf(stderr, "ERROR: strdup failed\n"); + return -1; + } + + dupfd = dup(fileno(stderr)); + if (dupfd == -1) { + fprintf(stderr, "ERROR: could not dup %d (%s)\n", fileno(stderr), + strerror(errno)); + return -1; + } + + ctx->log.logfile = fdopen(dupfd, "a"); + if (!ctx->log.logfile) { + fprintf(stderr, "ERROR: could not fdopen on %d (%s)\n", dupfd, + strerror(errno)); + sys_close(dupfd); + return -1; + } + } else { + ctx->log.filename = gf_strdup(file); + if (!ctx->log.filename) { + fprintf(stderr, + "ERROR: updating log-filename failed: " + "%s\n", + strerror(errno)); + return -1; + } + + fd = sys_open(file, O_CREAT | O_WRONLY | O_APPEND, S_IRUSR | S_IWUSR); + if (fd < 0) { + fprintf(stderr, + "ERROR: failed to create logfile" + " \"%s\" (%s)\n", + file, strerror(errno)); + return -1; } - if (!file) { - fprintf (stderr, "ERROR: no filename specified\n"); - return -1; + ctx->log.logfile = fdopen(fd, "a"); + if (!ctx->log.logfile) { + fprintf(stderr, + "ERROR: failed to open logfile \"%s\" " + "(%s)\n", + file, strerror(errno)); + sys_close(fd); + return -1; } + } - /* free the (possible) previous filename */ - GF_FREE (ctx->log.filename); - ctx->log.filename = NULL; - - if (strcmp (file, "-") == 0) { - int dupfd = -1; - - ctx->log.filename = gf_strdup ("/dev/stderr"); - if (!ctx->log.filename) { - fprintf (stderr, "ERROR: strdup failed\n"); - return -1; - } - - dupfd = dup (fileno (stderr)); - if (dupfd == -1) { - fprintf (stderr, "ERROR: could not dup %d (%s)\n", - fileno (stderr), strerror (errno)); - return -1; - } - - ctx->log.logfile = fdopen (dupfd, "a"); - if (!ctx->log.logfile) { - fprintf (stderr, "ERROR: could not fdopen on %d (%s)\n", - dupfd, strerror (errno)); - sys_close (dupfd); - return -1; - } - } else { - ctx->log.filename = gf_strdup (file); - if (!ctx->log.filename) { - fprintf (stderr, "ERROR: updating log-filename failed: " - "%s\n", strerror (errno)); - return -1; - } - - fd = sys_open (file, O_CREAT | O_WRONLY | O_APPEND, - S_IRUSR | S_IWUSR); - if (fd < 0) { - fprintf (stderr, "ERROR: failed to create logfile" - " \"%s\" (%s)\n", file, strerror (errno)); - return -1; - } + ctx->log.gf_log_logfile = ctx->log.logfile; - ctx->log.logfile = fdopen (fd, "a"); - if (!ctx->log.logfile) { - fprintf (stderr, "ERROR: failed to open logfile \"%s\" " - "(%s)\n", file, strerror (errno)); - sys_close (fd); - return -1; - } - } - - ctx->log.gf_log_logfile = ctx->log.logfile; - - return 0; + return 0; } void -set_sys_log_level (gf_loglevel_t level) +set_sys_log_level(gf_loglevel_t level) { - glusterfs_ctx_t *ctx = NULL; + glusterfs_ctx_t *ctx = NULL; - ctx = THIS->ctx; + ctx = THIS->ctx; - if (ctx) - ctx->log.sys_log_level = level; + if (ctx) + ctx->log.sys_log_level = level; } /* Check if we should be logging @@ -805,1844 +794,1857 @@ set_sys_log_level (gf_loglevel_t level) * _gf_true : Do not Print the log */ static gf_boolean_t -skip_logging (xlator_t *this, gf_loglevel_t level) +skip_logging(xlator_t *this, gf_loglevel_t level) { - gf_boolean_t ret = _gf_false; - gf_loglevel_t existing_level = GF_LOG_NONE; - - if (level == GF_LOG_NONE) { - ret = _gf_true; - goto out; - } - - existing_level = this->loglevel ? this->loglevel : this->ctx->log.loglevel; - if (level > existing_level) { - ret = _gf_true; - goto out; - } + gf_boolean_t ret = _gf_false; + gf_loglevel_t existing_level = GF_LOG_NONE; + + if (level == GF_LOG_NONE) { + ret = _gf_true; + goto out; + } + + existing_level = this->loglevel ? this->loglevel : this->ctx->log.loglevel; + if (level > existing_level) { + ret = _gf_true; + goto out; + } out: - return ret; + return ret; } int -_gf_log_callingfn (const char *domain, const char *file, const char *function, - int line, gf_loglevel_t level, const char *fmt, ...) +_gf_log_callingfn(const char *domain, const char *file, const char *function, + int line, gf_loglevel_t level, const char *fmt, ...) { - const char *basename = NULL; - xlator_t *this = NULL; - char *str1 = NULL; - char *str2 = NULL; - char *msg = NULL; - char timestr[256] = {0,}; - char *callstr = NULL; - struct timeval tv = {0,}; - size_t len = 0; - int ret = 0; - va_list ap; - glusterfs_ctx_t *ctx = NULL; - - this = THIS; - ctx = this->ctx; - - if (!ctx) - goto out; - - if (skip_logging (this, level)) - goto out; - - static char *level_strings[] = {"", /* NONE */ - "M", /* EMERGENCY */ - "A", /* ALERT */ - "C", /* CRITICAL */ - "E", /* ERROR */ - "W", /* WARNING */ - "N", /* NOTICE */ - "I", /* INFO */ - "D", /* DEBUG */ - "T", /* TRACE */ - ""}; - - if (!domain || !file || !function || !fmt) { - fprintf (stderr, - "logging: %s:%s():%d: invalid argument\n", - __FILE__, __PRETTY_FUNCTION__, __LINE__); - return -1; + const char *basename = NULL; + xlator_t *this = NULL; + char *str1 = NULL; + char *str2 = NULL; + char *msg = NULL; + char timestr[256] = { + 0, + }; + char *callstr = NULL; + struct timeval tv = { + 0, + }; + size_t len = 0; + int ret = 0; + va_list ap; + glusterfs_ctx_t *ctx = NULL; + + this = THIS; + ctx = this->ctx; + + if (!ctx) + goto out; + + if (skip_logging(this, level)) + goto out; + + static char *level_strings[] = {"", /* NONE */ + "M", /* EMERGENCY */ + "A", /* ALERT */ + "C", /* CRITICAL */ + "E", /* ERROR */ + "W", /* WARNING */ + "N", /* NOTICE */ + "I", /* INFO */ + "D", /* DEBUG */ + "T", /* TRACE */ + ""}; + + if (!domain || !file || !function || !fmt) { + fprintf(stderr, "logging: %s:%s():%d: invalid argument\n", __FILE__, + __PRETTY_FUNCTION__, __LINE__); + return -1; + } + + basename = strrchr(file, '/'); + if (basename) + basename++; + else + basename = file; + + /*Saving the backtrace to pre-allocated ctx->btbuf + * to avoid allocating memory from the heap*/ + callstr = gf_backtrace_save(NULL); + + if (ctx->log.log_control_file_found) { + int priority; + /* treat GF_LOG_TRACE and GF_LOG_NONE as LOG_DEBUG and + other level as is */ + if (GF_LOG_TRACE == level || GF_LOG_NONE == level) { + priority = LOG_DEBUG; + } else { + priority = level - 1; } - basename = strrchr (file, '/'); - if (basename) - basename++; - else - basename = file; + va_start(ap, fmt); + vasprintf(&str2, fmt, ap); + va_end(ap); - /*Saving the backtrace to pre-allocated ctx->btbuf - * to avoid allocating memory from the heap*/ - callstr = gf_backtrace_save (NULL); + gf_syslog(priority, "[%s:%d:%s] %s %d-%s: %s", basename, line, function, + callstr, ((this->graph) ? this->graph->id : 0), domain, str2); - if (ctx->log.log_control_file_found) - { - int priority; - /* treat GF_LOG_TRACE and GF_LOG_NONE as LOG_DEBUG and - other level as is */ - if (GF_LOG_TRACE == level || GF_LOG_NONE == level) { - priority = LOG_DEBUG; - } else { - priority = level - 1; - } + goto out; + } - va_start (ap, fmt); - vasprintf (&str2, fmt, ap); - va_end (ap); + ret = gettimeofday(&tv, NULL); + if (-1 == ret) + goto out; + va_start(ap, fmt); + gf_time_fmt(timestr, sizeof timestr, tv.tv_sec, gf_timefmt_FT); + snprintf(timestr + strlen(timestr), sizeof timestr - strlen(timestr), + ".%" GF_PRI_SUSECONDS, tv.tv_usec); - gf_syslog (priority, "[%s:%d:%s] %s %d-%s: %s", - basename, line, function, - callstr, - ((this->graph) ? this->graph->id:0), domain, - str2); + ret = gf_asprintf(&str1, "[%s] %s [%s:%d:%s] %s %d-%s: ", timestr, + level_strings[level], basename, line, function, callstr, + ((this->graph) ? this->graph->id : 0), domain); + if (-1 == ret) { + goto out; + } - goto out; - } + ret = vasprintf(&str2, fmt, ap); + if (-1 == ret) { + goto out; + } - ret = gettimeofday (&tv, NULL); - if (-1 == ret) - goto out; - va_start (ap, fmt); - gf_time_fmt (timestr, sizeof timestr, tv.tv_sec, gf_timefmt_FT); - snprintf (timestr + strlen (timestr), sizeof timestr - strlen (timestr), - ".%"GF_PRI_SUSECONDS, tv.tv_usec); - - ret = gf_asprintf (&str1, "[%s] %s [%s:%d:%s] %s %d-%s: ", - timestr, level_strings[level], - basename, line, function, callstr, - ((this->graph) ? this->graph->id:0), domain); - if (-1 == ret) { - goto out; - } + va_end(ap); - ret = vasprintf (&str2, fmt, ap); - if (-1 == ret) { - goto out; - } + len = strlen(str1); + msg = GF_MALLOC(len + strlen(str2) + 1, gf_common_mt_char); + if (!msg) { + ret = -1; + goto out; + } - va_end (ap); + strcpy(msg, str1); + strcpy(msg + len, str2); - len = strlen (str1); - msg = GF_MALLOC (len + strlen (str2) + 1, gf_common_mt_char); - if (!msg) { - ret = -1; - goto out; + pthread_mutex_lock(&ctx->log.logfile_mutex); + { + if (ctx->log.logfile) { + fprintf(ctx->log.logfile, "%s\n", msg); + fflush(ctx->log.logfile); + } else if (ctx->log.loglevel >= level) { + fprintf(stderr, "%s\n", msg); + fflush(stderr); } - strcpy (msg, str1); - strcpy (msg + len, str2); - - pthread_mutex_lock (&ctx->log.logfile_mutex); - { - if (ctx->log.logfile) { - fprintf (ctx->log.logfile, "%s\n", msg); - fflush (ctx->log.logfile); - } else if (ctx->log.loglevel >= level) { - fprintf (stderr, "%s\n", msg); - fflush (stderr); - } - #ifdef GF_LINUX_HOST_OS - /* We want only serious log in 'syslog', not our debug - and trace logs */ - if (ctx->log.gf_log_syslog && level && - (level <= ctx->log.sys_log_level)) - syslog ((level-1), "%s\n", msg); + /* We want only serious log in 'syslog', not our debug + and trace logs */ + if (ctx->log.gf_log_syslog && level && + (level <= ctx->log.sys_log_level)) + syslog((level - 1), "%s\n", msg); #endif - } + } - pthread_mutex_unlock (&ctx->log.logfile_mutex); + pthread_mutex_unlock(&ctx->log.logfile_mutex); out: - GF_FREE (msg); + GF_FREE(msg); - GF_FREE (str1); + GF_FREE(str1); - FREE (str2); + FREE(str2); - va_end (ap); + va_end(ap); - return ret; + return ret; } int -_gf_msg_plain_internal (gf_loglevel_t level, const char *msg) +_gf_msg_plain_internal(gf_loglevel_t level, const char *msg) { - xlator_t *this = NULL; - glusterfs_ctx_t *ctx = NULL; - int priority; + xlator_t *this = NULL; + glusterfs_ctx_t *ctx = NULL; + int priority; - this = THIS; - ctx = this->ctx; + this = THIS; + ctx = this->ctx; - /* log to the configured logging service */ - switch (ctx->log.logger) { + /* log to the configured logging service */ + switch (ctx->log.logger) { case gf_logger_syslog: - if (ctx->log.log_control_file_found && ctx->log.gf_log_syslog) { - SET_LOG_PRIO (level, priority); + if (ctx->log.log_control_file_found && ctx->log.gf_log_syslog) { + SET_LOG_PRIO(level, priority); - syslog (priority, "%s", msg); - break; - } - /* NOTE: If syslog control file is absent, which is another - * way to control logging to syslog, then we will fall through - * to the gluster log. The ideal way to do things would be to - * not have the extra control file check */ + syslog(priority, "%s", msg); + break; + } + /* NOTE: If syslog control file is absent, which is another + * way to control logging to syslog, then we will fall through + * to the gluster log. The ideal way to do things would be to + * not have the extra control file check */ case gf_logger_glusterlog: - pthread_mutex_lock (&ctx->log.logfile_mutex); - { - if (ctx->log.logfile) { - fprintf (ctx->log.logfile, "%s\n", msg); - fflush (ctx->log.logfile); - } else { - fprintf (stderr, "%s\n", msg); - fflush (stderr); - } + pthread_mutex_lock(&ctx->log.logfile_mutex); + { + if (ctx->log.logfile) { + fprintf(ctx->log.logfile, "%s\n", msg); + fflush(ctx->log.logfile); + } else { + fprintf(stderr, "%s\n", msg); + fflush(stderr); + } #ifdef GF_LINUX_HOST_OS - /* We want only serious logs in 'syslog', not our debug - * and trace logs */ - if (ctx->log.gf_log_syslog && level && - (level <= ctx->log.sys_log_level)) - syslog ((level-1), "%s\n", msg); + /* We want only serious logs in 'syslog', not our debug + * and trace logs */ + if (ctx->log.gf_log_syslog && level && + (level <= ctx->log.sys_log_level)) + syslog((level - 1), "%s\n", msg); #endif - } - pthread_mutex_unlock (&ctx->log.logfile_mutex); + } + pthread_mutex_unlock(&ctx->log.logfile_mutex); - break; - } + break; + } - return 0; + return 0; } int -_gf_msg_plain (gf_loglevel_t level, const char *fmt, ...) +_gf_msg_plain(gf_loglevel_t level, const char *fmt, ...) { - xlator_t *this = NULL; - int ret = 0; - va_list ap; - char *msg = NULL; - glusterfs_ctx_t *ctx = NULL; + xlator_t *this = NULL; + int ret = 0; + va_list ap; + char *msg = NULL; + glusterfs_ctx_t *ctx = NULL; - this = THIS; - ctx = this->ctx; + this = THIS; + ctx = this->ctx; - if (!ctx) - goto out; + if (!ctx) + goto out; - if (skip_logging (this, level)) - goto out; + if (skip_logging(this, level)) + goto out; - va_start (ap, fmt); - ret = vasprintf (&msg, fmt, ap); - va_end (ap); - if (-1 == ret) { - goto out; - } + va_start(ap, fmt); + ret = vasprintf(&msg, fmt, ap); + va_end(ap); + if (-1 == ret) { + goto out; + } - ret = _gf_msg_plain_internal (level, msg); + ret = _gf_msg_plain_internal(level, msg); - FREE (msg); + FREE(msg); out: - return ret; + return ret; } int -_gf_msg_vplain (gf_loglevel_t level, const char *fmt, va_list ap) +_gf_msg_vplain(gf_loglevel_t level, const char *fmt, va_list ap) { - xlator_t *this = NULL; - int ret = 0; - char *msg = NULL; - glusterfs_ctx_t *ctx = NULL; + xlator_t *this = NULL; + int ret = 0; + char *msg = NULL; + glusterfs_ctx_t *ctx = NULL; - this = THIS; - ctx = this->ctx; + this = THIS; + ctx = this->ctx; - if (!ctx) - goto out; + if (!ctx) + goto out; - if (skip_logging (this, level)) - goto out; + if (skip_logging(this, level)) + goto out; - ret = vasprintf (&msg, fmt, ap); - if (-1 == ret) { - goto out; - } + ret = vasprintf(&msg, fmt, ap); + if (-1 == ret) { + goto out; + } - ret = _gf_msg_plain_internal (level, msg); + ret = _gf_msg_plain_internal(level, msg); - FREE (msg); + FREE(msg); out: - return ret; + return ret; } int -_gf_msg_plain_nomem (gf_loglevel_t level, const char *msg) +_gf_msg_plain_nomem(gf_loglevel_t level, const char *msg) { - xlator_t *this = NULL; - int ret = 0; - glusterfs_ctx_t *ctx = NULL; + xlator_t *this = NULL; + int ret = 0; + glusterfs_ctx_t *ctx = NULL; - this = THIS; - ctx = this->ctx; + this = THIS; + ctx = this->ctx; - if (!ctx) - goto out; + if (!ctx) + goto out; - if (skip_logging (this, level)) - goto out; + if (skip_logging(this, level)) + goto out; - ret = _gf_msg_plain_internal (level, msg); + ret = _gf_msg_plain_internal(level, msg); out: - return ret; + return ret; } void -_gf_msg_backtrace_nomem (gf_loglevel_t level, int stacksize) +_gf_msg_backtrace_nomem(gf_loglevel_t level, int stacksize) { - xlator_t *this = NULL; - glusterfs_ctx_t *ctx = NULL; - void *array[200]; - size_t bt_size = 0; - int fd = -1; - - this = THIS; - ctx = this->ctx; - - if (!ctx) - goto out; - - /* syslog does not have fd support, hence no no-mem variant */ - if (ctx->log.logger != gf_logger_glusterlog) - goto out; - - if (skip_logging (this, level)) - goto out; - - bt_size = backtrace (array, ((stacksize <= 200)? stacksize : 200)); - pthread_mutex_lock (&ctx->log.logfile_mutex); - { - fd = ctx->log.logfile? - fileno (ctx->log.logfile) : - fileno (stderr); - if (bt_size && (fd != -1)) { - /* print to the file fd, to prevent any - allocations from backtrace_symbols - */ - backtrace_symbols_fd (&array[0], bt_size, fd); - } - } - pthread_mutex_unlock (&ctx->log.logfile_mutex); + xlator_t *this = NULL; + glusterfs_ctx_t *ctx = NULL; + void *array[200]; + size_t bt_size = 0; + int fd = -1; + + this = THIS; + ctx = this->ctx; + + if (!ctx) + goto out; + + /* syslog does not have fd support, hence no no-mem variant */ + if (ctx->log.logger != gf_logger_glusterlog) + goto out; + + if (skip_logging(this, level)) + goto out; + + bt_size = backtrace(array, ((stacksize <= 200) ? stacksize : 200)); + pthread_mutex_lock(&ctx->log.logfile_mutex); + { + fd = ctx->log.logfile ? fileno(ctx->log.logfile) : fileno(stderr); + if (bt_size && (fd != -1)) { + /* print to the file fd, to prevent any + allocations from backtrace_symbols + */ + backtrace_symbols_fd(&array[0], bt_size, fd); + } + } + pthread_mutex_unlock(&ctx->log.logfile_mutex); out: - return; + return; } int -_gf_msg_backtrace (int stacksize, char *callstr, size_t strsize) +_gf_msg_backtrace(int stacksize, char *callstr, size_t strsize) { - int ret = -1; - int i = 0; - int size = 0; - int savstrsize = strsize; - void *array[200]; - char **callingfn = NULL; - - /* We chop off last 2 anyway, so if request is less than tolerance - * nothing to do */ - if (stacksize < 3) - goto out; - - size = backtrace (array, ((stacksize <= 200)? stacksize : 200)); - if ((size - 3) < 0) - goto out; - if (size) - callingfn = backtrace_symbols (&array[2], size - 2); - if (!callingfn) - goto out; - - ret = snprintf (callstr, strsize, "("); - PRINT_SIZE_CHECK (ret, out, strsize); - - for ((i = size - 3); i >= 0; i--) { - ret = snprintf (callstr + savstrsize - strsize, strsize, - "-->%s ", callingfn[i]); - PRINT_SIZE_CHECK (ret, out, strsize); - } - - ret = snprintf (callstr + savstrsize - strsize, strsize, ")"); - PRINT_SIZE_CHECK (ret, out, strsize); + int ret = -1; + int i = 0; + int size = 0; + int savstrsize = strsize; + void *array[200]; + char **callingfn = NULL; + + /* We chop off last 2 anyway, so if request is less than tolerance + * nothing to do */ + if (stacksize < 3) + goto out; + + size = backtrace(array, ((stacksize <= 200) ? stacksize : 200)); + if ((size - 3) < 0) + goto out; + if (size) + callingfn = backtrace_symbols(&array[2], size - 2); + if (!callingfn) + goto out; + + ret = snprintf(callstr, strsize, "("); + PRINT_SIZE_CHECK(ret, out, strsize); + + for ((i = size - 3); i >= 0; i--) { + ret = snprintf(callstr + savstrsize - strsize, strsize, "-->%s ", + callingfn[i]); + PRINT_SIZE_CHECK(ret, out, strsize); + } + + ret = snprintf(callstr + savstrsize - strsize, strsize, ")"); + PRINT_SIZE_CHECK(ret, out, strsize); out: - FREE (callingfn); - return ret; + FREE(callingfn); + return ret; } int -_gf_msg_nomem (const char *domain, const char *file, - const char *function, int line, gf_loglevel_t level, - size_t size) +_gf_msg_nomem(const char *domain, const char *file, const char *function, + int line, gf_loglevel_t level, size_t size) { - const char *basename = NULL; - xlator_t *this = NULL; - struct timeval tv = {0,}; - int ret = 0; - int fd = -1; - char msg[2048] = {0,}; - char timestr[GF_LOG_TIMESTR_SIZE] = {0,}; - glusterfs_ctx_t *ctx = NULL; - int wlen = 0; - int priority; - - this = THIS; - ctx = this->ctx; - - if (!ctx) - goto out; - - if (skip_logging (this, level)) - goto out; - - if (!domain || !file || !function) { - fprintf (stderr, - "logging: %s:%s():%d: invalid argument\n", - __FILE__, __PRETTY_FUNCTION__, __LINE__); - return -1; - } - - GET_FILE_NAME_TO_LOG (file, basename); + const char *basename = NULL; + xlator_t *this = NULL; + struct timeval tv = { + 0, + }; + int ret = 0; + int fd = -1; + char msg[2048] = { + 0, + }; + char timestr[GF_LOG_TIMESTR_SIZE] = { + 0, + }; + glusterfs_ctx_t *ctx = NULL; + int wlen = 0; + int priority; + + this = THIS; + ctx = this->ctx; + + if (!ctx) + goto out; + + if (skip_logging(this, level)) + goto out; + + if (!domain || !file || !function) { + fprintf(stderr, "logging: %s:%s():%d: invalid argument\n", __FILE__, + __PRETTY_FUNCTION__, __LINE__); + return -1; + } + + GET_FILE_NAME_TO_LOG(file, basename); + + ret = gettimeofday(&tv, NULL); + if (-1 == ret) + goto out; + gf_time_fmt(timestr, sizeof timestr, tv.tv_sec, gf_timefmt_FT); + ret = snprintf(timestr + strlen(timestr), sizeof timestr - strlen(timestr), + ".%" GF_PRI_SUSECONDS, tv.tv_usec); + if (-1 == ret) { + goto out; + } + + /* TODO: Currently we print in the enhanced format, with a message ID + * of 0. Need to enhance this to support format as configured */ + ret = snprintf(msg, sizeof msg, + "[%s] %s [MSGID: %" PRIu64 + "]" + " [%s:%d:%s] %s: no memory " + "available for size (%" GF_PRI_SIZET + ")" + " [call stack follows]\n", + timestr, gf_level_strings[level], (uint64_t)0, basename, + line, function, domain, size); + if (-1 == ret) { + goto out; + } + + /* log to the configured logging service */ + switch (ctx->log.logger) { + case gf_logger_syslog: + if (ctx->log.log_control_file_found && ctx->log.gf_log_syslog) { + SET_LOG_PRIO(level, priority); - ret = gettimeofday (&tv, NULL); - if (-1 == ret) - goto out; - gf_time_fmt (timestr, sizeof timestr, tv.tv_sec, gf_timefmt_FT); - ret = snprintf (timestr + strlen (timestr), - sizeof timestr - strlen (timestr), - ".%"GF_PRI_SUSECONDS, tv.tv_usec); - if (-1 == ret) { - goto out; - } + /* if syslog allocates, then this may fail, but we + * cannot do much about it at the moment */ + /* There is no fd for syslog, hence no stack printed */ + syslog(priority, "%s", msg); + break; + } + /* NOTE: If syslog control file is absent, which is another + * way to control logging to syslog, then we will fall through + * to the gluster log. The ideal way to do things would be to + * not have the extra control file check */ + case gf_logger_glusterlog: + pthread_mutex_lock(&ctx->log.logfile_mutex); + { + fd = ctx->log.logfile ? fileno(ctx->log.logfile) + : fileno(stderr); + if (fd == -1) { + pthread_mutex_unlock(&ctx->log.logfile_mutex); + goto out; + } - /* TODO: Currently we print in the enhanced format, with a message ID - * of 0. Need to enhance this to support format as configured */ - ret = snprintf (msg, sizeof msg, "[%s] %s [MSGID: %"PRIu64"]" - " [%s:%d:%s] %s: no memory " - "available for size (%"GF_PRI_SIZET")" - " [call stack follows]\n", - timestr, gf_level_strings[level], (uint64_t) 0, - basename, line, function, domain, size); - if (-1 == ret) { - goto out; - } + wlen = strlen(msg); - /* log to the configured logging service */ - switch (ctx->log.logger) { - case gf_logger_syslog: - if (ctx->log.log_control_file_found && ctx->log.gf_log_syslog) { - SET_LOG_PRIO (level, priority); - - /* if syslog allocates, then this may fail, but we - * cannot do much about it at the moment */ - /* There is no fd for syslog, hence no stack printed */ - syslog (priority, "%s", msg); - break; + /* write directly to the fd to prevent out of order + * message and stack */ + ret = sys_write(fd, msg, wlen); + if (ret == -1) { + pthread_mutex_unlock(&ctx->log.logfile_mutex); + goto out; } - /* NOTE: If syslog control file is absent, which is another - * way to control logging to syslog, then we will fall through - * to the gluster log. The ideal way to do things would be to - * not have the extra control file check */ - case gf_logger_glusterlog: - pthread_mutex_lock (&ctx->log.logfile_mutex); - { - fd = ctx->log.logfile? fileno (ctx->log.logfile) : - fileno (stderr); - if (fd == -1) { - pthread_mutex_unlock (&ctx->log.logfile_mutex); - goto out; - } - - wlen = strlen (msg); - - /* write directly to the fd to prevent out of order - * message and stack */ - ret = sys_write (fd, msg, wlen); - if (ret == -1) { - pthread_mutex_unlock (&ctx->log.logfile_mutex); - goto out; - } #ifdef GF_LINUX_HOST_OS - /* We want only serious log in 'syslog', not our debug - * and trace logs */ - if (ctx->log.gf_log_syslog && level && - (level <= ctx->log.sys_log_level)) - syslog ((level-1), "%s\n", msg); + /* We want only serious log in 'syslog', not our debug + * and trace logs */ + if (ctx->log.gf_log_syslog && level && + (level <= ctx->log.sys_log_level)) + syslog((level - 1), "%s\n", msg); #endif - } - pthread_mutex_unlock (&ctx->log.logfile_mutex); + } + pthread_mutex_unlock(&ctx->log.logfile_mutex); - _gf_msg_backtrace_nomem (level, GF_LOG_BACKTRACE_DEPTH); + _gf_msg_backtrace_nomem(level, GF_LOG_BACKTRACE_DEPTH); - break; - } + break; + } out: - return ret; + return ret; } static int -gf_log_syslog (glusterfs_ctx_t *ctx, const char *domain, const char *file, - const char *function, int32_t line, gf_loglevel_t level, - int errnum, uint64_t msgid, char **appmsgstr, char *callstr, - int graph_id, gf_log_format_t fmt) +gf_log_syslog(glusterfs_ctx_t *ctx, const char *domain, const char *file, + const char *function, int32_t line, gf_loglevel_t level, + int errnum, uint64_t msgid, char **appmsgstr, char *callstr, + int graph_id, gf_log_format_t fmt) { - int priority; - - SET_LOG_PRIO (level, priority); - - /* log with appropriate format */ - switch (fmt) { - case gf_logformat_traditional: - if (!callstr) { - if (errnum) - syslog (priority, "[%s:%d:%s] %d-%s: %s [%s]", - file, line, function, graph_id, domain, - *appmsgstr, strerror(errnum)); - else - syslog (priority, "[%s:%d:%s] %d-%s: %s", - file, line, function, graph_id, domain, - *appmsgstr); - } else { - if (errnum) - syslog (priority, "[%s:%d:%s] %s %d-%s:" - " %s [%s]", - file, line, function, callstr, graph_id, - domain, *appmsgstr, strerror(errnum)); - else - syslog (priority, "[%s:%d:%s] %s %d-%s: %s", - file, line, function, callstr, graph_id, - domain, *appmsgstr); - } - break; - case gf_logformat_withmsgid: - if (!callstr) { - if (errnum) - syslog (priority, "[MSGID: %"PRIu64"]" - " [%s:%d:%s] %d-%s: %s [%s]", msgid, - file, line, function, graph_id, domain, - *appmsgstr, strerror(errnum)); - else - syslog (priority, "[MSGID: %"PRIu64"]" - " [%s:%d:%s] %d-%s: %s", - msgid, file, line, function, graph_id, - domain, *appmsgstr); - } else { - if (errnum) - syslog (priority, "[MSGID: %"PRIu64"]" - " [%s:%d:%s] %s %d-%s: %s [%s]", - msgid, file, line, function, callstr, - graph_id, domain, *appmsgstr, - strerror(errnum)); - else - syslog (priority, "[MSGID: %"PRIu64"]" - " [%s:%d:%s] %s %d-%s: %s", - msgid, file, line, function, callstr, - graph_id, domain, *appmsgstr); - } - break; - case gf_logformat_cee: - /* TODO: Enhance CEE with additional parameters */ - gf_syslog (priority, "[%s:%d:%s] %d-%s: %s", - file, line, function, graph_id, domain, *appmsgstr); - break; - - default: - /* NOTE: should not get here without logging */ - break; - } - - /* TODO: There can be no errors from gf_syslog? */ - return 0; + int priority; + + SET_LOG_PRIO(level, priority); + + /* log with appropriate format */ + switch (fmt) { + case gf_logformat_traditional: + if (!callstr) { + if (errnum) + syslog(priority, "[%s:%d:%s] %d-%s: %s [%s]", file, line, + function, graph_id, domain, *appmsgstr, + strerror(errnum)); + else + syslog(priority, "[%s:%d:%s] %d-%s: %s", file, line, + function, graph_id, domain, *appmsgstr); + } else { + if (errnum) + syslog(priority, + "[%s:%d:%s] %s %d-%s:" + " %s [%s]", + file, line, function, callstr, graph_id, domain, + *appmsgstr, strerror(errnum)); + else + syslog(priority, "[%s:%d:%s] %s %d-%s: %s", file, line, + function, callstr, graph_id, domain, *appmsgstr); + } + break; + case gf_logformat_withmsgid: + if (!callstr) { + if (errnum) + syslog(priority, + "[MSGID: %" PRIu64 + "]" + " [%s:%d:%s] %d-%s: %s [%s]", + msgid, file, line, function, graph_id, domain, + *appmsgstr, strerror(errnum)); + else + syslog(priority, + "[MSGID: %" PRIu64 + "]" + " [%s:%d:%s] %d-%s: %s", + msgid, file, line, function, graph_id, domain, + *appmsgstr); + } else { + if (errnum) + syslog(priority, + "[MSGID: %" PRIu64 + "]" + " [%s:%d:%s] %s %d-%s: %s [%s]", + msgid, file, line, function, callstr, graph_id, + domain, *appmsgstr, strerror(errnum)); + else + syslog(priority, + "[MSGID: %" PRIu64 + "]" + " [%s:%d:%s] %s %d-%s: %s", + msgid, file, line, function, callstr, graph_id, + domain, *appmsgstr); + } + break; + case gf_logformat_cee: + /* TODO: Enhance CEE with additional parameters */ + gf_syslog(priority, "[%s:%d:%s] %d-%s: %s", file, line, function, + graph_id, domain, *appmsgstr); + break; + + default: + /* NOTE: should not get here without logging */ + break; + } + + /* TODO: There can be no errors from gf_syslog? */ + return 0; } static int -gf_log_glusterlog (glusterfs_ctx_t *ctx, const char *domain, const char *file, - const char *function, int32_t line, gf_loglevel_t level, - int errnum, uint64_t msgid, char **appmsgstr, char *callstr, - struct timeval tv, int graph_id, gf_log_format_t fmt) +gf_log_glusterlog(glusterfs_ctx_t *ctx, const char *domain, const char *file, + const char *function, int32_t line, gf_loglevel_t level, + int errnum, uint64_t msgid, char **appmsgstr, char *callstr, + struct timeval tv, int graph_id, gf_log_format_t fmt) { - char timestr[GF_LOG_TIMESTR_SIZE] = {0,}; - char *header = NULL; - char *footer = NULL; - char *msg = NULL; - size_t hlen = 0, flen = 0, mlen = 0; - int ret = 0; - - /* rotate if required */ - gf_log_rotate(ctx); - - /* format the time stamp */ - gf_time_fmt (timestr, sizeof timestr, tv.tv_sec, gf_timefmt_FT); - snprintf (timestr + strlen (timestr), sizeof timestr - strlen (timestr), - ".%"GF_PRI_SUSECONDS, tv.tv_usec); - - /* generate header and footer */ - if (fmt == gf_logformat_traditional) { - if (!callstr) { - ret = gf_asprintf (&header, "[%s] %s [%s:%d:%s]" - " %d-%s: ", - timestr, gf_level_strings[level], - file, line, function, graph_id, - domain); - } else { - ret = gf_asprintf (&header, "[%s] %s [%s:%d:%s] %s" - " %d-%s: ", - timestr, gf_level_strings[level], - file, line, function, callstr, - graph_id, domain); - } - if (-1 == ret) { - goto err; - } - } else { /* gf_logformat_withmsgid */ - /* CEE log format unsupported in logger_glusterlog, so just - * print enhanced log format */ - if (!callstr) { - ret = gf_asprintf (&header, "[%s] %s [MSGID: %"PRIu64"]" - " [%s:%d:%s] %d-%s: ", - timestr, gf_level_strings[level], - msgid, file, line, function, - graph_id, domain); - } else { - ret = gf_asprintf (&header, "[%s] %s [MSGID: %"PRIu64"]" - " [%s:%d:%s] %s %d-%s: ", - timestr, gf_level_strings[level], - msgid, file, line, function, callstr, - graph_id, domain); - } - if (-1 == ret) { - goto err; - } + char timestr[GF_LOG_TIMESTR_SIZE] = { + 0, + }; + char *header = NULL; + char *footer = NULL; + char *msg = NULL; + size_t hlen = 0, flen = 0, mlen = 0; + int ret = 0; + + /* rotate if required */ + gf_log_rotate(ctx); + + /* format the time stamp */ + gf_time_fmt(timestr, sizeof timestr, tv.tv_sec, gf_timefmt_FT); + snprintf(timestr + strlen(timestr), sizeof timestr - strlen(timestr), + ".%" GF_PRI_SUSECONDS, tv.tv_usec); + + /* generate header and footer */ + if (fmt == gf_logformat_traditional) { + if (!callstr) { + ret = gf_asprintf(&header, + "[%s] %s [%s:%d:%s]" + " %d-%s: ", + timestr, gf_level_strings[level], file, line, + function, graph_id, domain); + } else { + ret = gf_asprintf(&header, + "[%s] %s [%s:%d:%s] %s" + " %d-%s: ", + timestr, gf_level_strings[level], file, line, + function, callstr, graph_id, domain); } - - if (errnum) { - ret = gf_asprintf (&footer, " [%s]",strerror(errnum)); - if (-1 == ret) { - goto err; - } + if (-1 == ret) { + goto err; + } + } else { /* gf_logformat_withmsgid */ + /* CEE log format unsupported in logger_glusterlog, so just + * print enhanced log format */ + if (!callstr) { + ret = gf_asprintf(&header, + "[%s] %s [MSGID: %" PRIu64 + "]" + " [%s:%d:%s] %d-%s: ", + timestr, gf_level_strings[level], msgid, file, + line, function, graph_id, domain); + } else { + ret = gf_asprintf(&header, + "[%s] %s [MSGID: %" PRIu64 + "]" + " [%s:%d:%s] %s %d-%s: ", + timestr, gf_level_strings[level], msgid, file, + line, function, callstr, graph_id, domain); } - - /* generate the full message to log */ - hlen = strlen (header); - flen = footer? strlen (footer) : 0; - mlen = strlen (*appmsgstr); - msg = GF_MALLOC (hlen + flen + mlen + 1, gf_common_mt_char); - if (!msg) { - ret = -1; - goto err; + if (-1 == ret) { + goto err; } + } - strcpy (msg, header); - strcpy (msg + hlen, *appmsgstr); - if (footer) - strcpy (msg + hlen + mlen, footer); - - pthread_mutex_lock (&ctx->log.logfile_mutex); - { - if (ctx->log.logfile) { - fprintf (ctx->log.logfile, "%s\n", msg); - fflush (ctx->log.logfile); - } else if (ctx->log.loglevel >= level) { - fprintf (stderr, "%s\n", msg); - fflush (stderr); - } + if (errnum) { + ret = gf_asprintf(&footer, " [%s]", strerror(errnum)); + if (-1 == ret) { + goto err; + } + } + + /* generate the full message to log */ + hlen = strlen(header); + flen = footer ? strlen(footer) : 0; + mlen = strlen(*appmsgstr); + msg = GF_MALLOC(hlen + flen + mlen + 1, gf_common_mt_char); + if (!msg) { + ret = -1; + goto err; + } + + strcpy(msg, header); + strcpy(msg + hlen, *appmsgstr); + if (footer) + strcpy(msg + hlen + mlen, footer); + + pthread_mutex_lock(&ctx->log.logfile_mutex); + { + if (ctx->log.logfile) { + fprintf(ctx->log.logfile, "%s\n", msg); + fflush(ctx->log.logfile); + } else if (ctx->log.loglevel >= level) { + fprintf(stderr, "%s\n", msg); + fflush(stderr); + } #ifdef GF_LINUX_HOST_OS - /* We want only serious logs in 'syslog', not our debug - * and trace logs */ - if (ctx->log.gf_log_syslog && level && - (level <= ctx->log.sys_log_level)) - syslog ((level-1), "%s\n", msg); + /* We want only serious logs in 'syslog', not our debug + * and trace logs */ + if (ctx->log.gf_log_syslog && level && + (level <= ctx->log.sys_log_level)) + syslog((level - 1), "%s\n", msg); #endif - } + } - /* TODO: Plugin in memory log buffer retention here. For logs not - * flushed during cores, it would be useful to retain some of the last - * few messages in memory */ - pthread_mutex_unlock (&ctx->log.logfile_mutex); - ret = 0; + /* TODO: Plugin in memory log buffer retention here. For logs not + * flushed during cores, it would be useful to retain some of the last + * few messages in memory */ + pthread_mutex_unlock(&ctx->log.logfile_mutex); + ret = 0; err: - GF_FREE (msg); - GF_FREE (header); - GF_FREE (footer); + GF_FREE(msg); + GF_FREE(header); + GF_FREE(footer); - return ret; + return ret; } static int -gf_syslog_log_repetitions (const char *domain, const char *file, - const char *function, int32_t line, - gf_loglevel_t level, int errnum, uint64_t msgid, - char **appmsgstr, char *callstr, int refcount, - struct timeval oldest, struct timeval latest, - int graph_id) +gf_syslog_log_repetitions(const char *domain, const char *file, + const char *function, int32_t line, + gf_loglevel_t level, int errnum, uint64_t msgid, + char **appmsgstr, char *callstr, int refcount, + struct timeval oldest, struct timeval latest, + int graph_id) { - int priority; - char timestr_latest[256] = {0,}; - char timestr_oldest[256] = {0,}; - - SET_LOG_PRIO (level, priority); - - gf_time_fmt (timestr_latest, sizeof timestr_latest, latest.tv_sec, - gf_timefmt_FT); - snprintf (timestr_latest + strlen (timestr_latest), - sizeof (timestr_latest) - strlen (timestr_latest), - ".%"GF_PRI_SUSECONDS, latest.tv_usec); - - gf_time_fmt (timestr_oldest, sizeof timestr_oldest, oldest.tv_sec, - gf_timefmt_FT); - snprintf (timestr_oldest + strlen (timestr_oldest), - sizeof (timestr_oldest) - strlen (timestr_oldest), - ".%"GF_PRI_SUSECONDS, oldest.tv_usec); - - if (errnum) { - syslog (priority, "The message \"[MSGID: %"PRIu64"] [%s:%d:%s] " - "%d-%s: %s [%s] \" repeated %d times between %s and %s", - msgid, file, line, function, graph_id, domain, - *appmsgstr, strerror(errnum), refcount, timestr_oldest, - timestr_latest); - } else { - syslog (priority, "The message \"[MSGID: %"PRIu64"] [%s:%d:%s] " - "%d-%s: %s \" repeated %d times between %s and %s", - msgid, file, line, function, graph_id, domain, - *appmsgstr, refcount, timestr_oldest, timestr_latest); - } - return 0; + int priority; + char timestr_latest[256] = { + 0, + }; + char timestr_oldest[256] = { + 0, + }; + + SET_LOG_PRIO(level, priority); + + gf_time_fmt(timestr_latest, sizeof timestr_latest, latest.tv_sec, + gf_timefmt_FT); + snprintf(timestr_latest + strlen(timestr_latest), + sizeof(timestr_latest) - strlen(timestr_latest), + ".%" GF_PRI_SUSECONDS, latest.tv_usec); + + gf_time_fmt(timestr_oldest, sizeof timestr_oldest, oldest.tv_sec, + gf_timefmt_FT); + snprintf(timestr_oldest + strlen(timestr_oldest), + sizeof(timestr_oldest) - strlen(timestr_oldest), + ".%" GF_PRI_SUSECONDS, oldest.tv_usec); + + if (errnum) { + syslog(priority, + "The message \"[MSGID: %" PRIu64 + "] [%s:%d:%s] " + "%d-%s: %s [%s] \" repeated %d times between %s and %s", + msgid, file, line, function, graph_id, domain, *appmsgstr, + strerror(errnum), refcount, timestr_oldest, timestr_latest); + } else { + syslog(priority, + "The message \"[MSGID: %" PRIu64 + "] [%s:%d:%s] " + "%d-%s: %s \" repeated %d times between %s and %s", + msgid, file, line, function, graph_id, domain, *appmsgstr, + refcount, timestr_oldest, timestr_latest); + } + return 0; } static int -gf_glusterlog_log_repetitions (glusterfs_ctx_t *ctx, const char *domain, - const char *file, const char *function, - int32_t line, gf_loglevel_t level, int errnum, - uint64_t msgid, char **appmsgstr, char *callstr, - int refcount, struct timeval oldest, - struct timeval latest, int graph_id) +gf_glusterlog_log_repetitions(glusterfs_ctx_t *ctx, const char *domain, + const char *file, const char *function, + int32_t line, gf_loglevel_t level, int errnum, + uint64_t msgid, char **appmsgstr, char *callstr, + int refcount, struct timeval oldest, + struct timeval latest, int graph_id) { - int ret = 0; - size_t hlen = 0; - size_t flen = 0; - size_t mlen = 0; - char timestr_latest[256] = {0,}; - char timestr_oldest[256] = {0,}; - char errstr[256] = {0,}; - char *header = NULL; - char *footer = NULL; - char *msg = NULL; - - if (!ctx) - goto err; - - gf_log_rotate (ctx); - - gf_time_fmt (timestr_latest, sizeof timestr_latest, latest.tv_sec, - gf_timefmt_FT); - snprintf (timestr_latest + strlen (timestr_latest), - sizeof (timestr_latest) - strlen (timestr_latest), - ".%"GF_PRI_SUSECONDS, latest.tv_usec); - - gf_time_fmt (timestr_oldest, sizeof timestr_oldest, oldest.tv_sec, - gf_timefmt_FT); - snprintf (timestr_oldest + strlen (timestr_oldest), - sizeof (timestr_oldest) - strlen (timestr_oldest), - ".%"GF_PRI_SUSECONDS, oldest.tv_usec); - - ret = gf_asprintf (&header, "The message \"%s [MSGID: %"PRIu64"]" - " [%s:%d:%s] %d-%s: ", gf_level_strings[level], - msgid, file, line, function, graph_id, domain); - if (-1 == ret) - goto err; - - if (errnum) - snprintf (errstr, sizeof (errstr) - 1, " [%s]", - strerror (errnum)); - - ret = gf_asprintf (&footer, "%s\" repeated %d times between" - " [%s] and [%s]", errstr, refcount, timestr_oldest, - timestr_latest); - if (-1 == ret) - goto err; - - /* generate the full message to log */ - hlen = strlen (header); - flen = strlen (footer); - mlen = strlen (*appmsgstr); - msg = GF_MALLOC (hlen + flen + mlen + 1, gf_common_mt_char); - if (!msg) { - ret = -1; - goto err; + int ret = 0; + size_t hlen = 0; + size_t flen = 0; + size_t mlen = 0; + char timestr_latest[256] = { + 0, + }; + char timestr_oldest[256] = { + 0, + }; + char errstr[256] = { + 0, + }; + char *header = NULL; + char *footer = NULL; + char *msg = NULL; + + if (!ctx) + goto err; + + gf_log_rotate(ctx); + + gf_time_fmt(timestr_latest, sizeof timestr_latest, latest.tv_sec, + gf_timefmt_FT); + snprintf(timestr_latest + strlen(timestr_latest), + sizeof(timestr_latest) - strlen(timestr_latest), + ".%" GF_PRI_SUSECONDS, latest.tv_usec); + + gf_time_fmt(timestr_oldest, sizeof timestr_oldest, oldest.tv_sec, + gf_timefmt_FT); + snprintf(timestr_oldest + strlen(timestr_oldest), + sizeof(timestr_oldest) - strlen(timestr_oldest), + ".%" GF_PRI_SUSECONDS, oldest.tv_usec); + + ret = gf_asprintf(&header, + "The message \"%s [MSGID: %" PRIu64 + "]" + " [%s:%d:%s] %d-%s: ", + gf_level_strings[level], msgid, file, line, function, + graph_id, domain); + if (-1 == ret) + goto err; + + if (errnum) + snprintf(errstr, sizeof(errstr) - 1, " [%s]", strerror(errnum)); + + ret = gf_asprintf(&footer, + "%s\" repeated %d times between" + " [%s] and [%s]", + errstr, refcount, timestr_oldest, timestr_latest); + if (-1 == ret) + goto err; + + /* generate the full message to log */ + hlen = strlen(header); + flen = strlen(footer); + mlen = strlen(*appmsgstr); + msg = GF_MALLOC(hlen + flen + mlen + 1, gf_common_mt_char); + if (!msg) { + ret = -1; + goto err; + } + + strcpy(msg, header); + strcpy(msg + hlen, *appmsgstr); + strcpy(msg + hlen + mlen, footer); + + pthread_mutex_lock(&ctx->log.logfile_mutex); + { + if (ctx->log.logfile) { + fprintf(ctx->log.logfile, "%s\n", msg); + fflush(ctx->log.logfile); + } else if (ctx->log.loglevel >= level) { + fprintf(stderr, "%s\n", msg); + fflush(stderr); } - strcpy (msg, header); - strcpy (msg + hlen, *appmsgstr); - strcpy (msg + hlen + mlen, footer); - - pthread_mutex_lock (&ctx->log.logfile_mutex); - { - if (ctx->log.logfile) { - fprintf (ctx->log.logfile, "%s\n", msg); - fflush (ctx->log.logfile); - } else if (ctx->log.loglevel >= level) { - fprintf (stderr, "%s\n", msg); - fflush (stderr); - } - #ifdef GF_LINUX_HOST_OS - /* We want only serious logs in 'syslog', not our debug - * and trace logs */ - if (ctx->log.gf_log_syslog && level && - (level <= ctx->log.sys_log_level)) - syslog ((level-1), "%s\n", msg); + /* We want only serious logs in 'syslog', not our debug + * and trace logs */ + if (ctx->log.gf_log_syslog && level && + (level <= ctx->log.sys_log_level)) + syslog((level - 1), "%s\n", msg); #endif - } + } - /* TODO: Plugin in memory log buffer retention here. For logs not - * flushed during cores, it would be useful to retain some of the last - * few messages in memory */ - pthread_mutex_unlock (&ctx->log.logfile_mutex); - ret = 0; + /* TODO: Plugin in memory log buffer retention here. For logs not + * flushed during cores, it would be useful to retain some of the last + * few messages in memory */ + pthread_mutex_unlock(&ctx->log.logfile_mutex); + ret = 0; err: - GF_FREE (msg); - GF_FREE (header); - GF_FREE (footer); + GF_FREE(msg); + GF_FREE(header); + GF_FREE(footer); - return ret; + return ret; } static int -gf_log_print_with_repetitions (glusterfs_ctx_t *ctx, const char *domain, - const char *file, const char *function, - int32_t line, gf_loglevel_t level, int errnum, - uint64_t msgid, char **appmsgstr, char *callstr, - int refcount, struct timeval oldest, - struct timeval latest, int graph_id) +gf_log_print_with_repetitions(glusterfs_ctx_t *ctx, const char *domain, + const char *file, const char *function, + int32_t line, gf_loglevel_t level, int errnum, + uint64_t msgid, char **appmsgstr, char *callstr, + int refcount, struct timeval oldest, + struct timeval latest, int graph_id) { - int ret = -1; - gf_log_logger_t logger = 0; - - logger = ctx->log.logger; - - - switch (logger) { - case gf_logger_syslog: - if (ctx->log.log_control_file_found && ctx->log.gf_log_syslog) { - ret = gf_syslog_log_repetitions (domain, file, function, - line, level, errnum, - msgid, appmsgstr, - callstr, refcount, - oldest, latest, - graph_id); - break; - } - case gf_logger_glusterlog: - ret = gf_glusterlog_log_repetitions (ctx, domain, file, - function, line, level, - errnum, msgid, appmsgstr, - callstr, refcount, oldest, - latest, graph_id); + int ret = -1; + gf_log_logger_t logger = 0; + + logger = ctx->log.logger; + + switch (logger) { + case gf_logger_syslog: + if (ctx->log.log_control_file_found && ctx->log.gf_log_syslog) { + ret = gf_syslog_log_repetitions( + domain, file, function, line, level, errnum, msgid, + appmsgstr, callstr, refcount, oldest, latest, graph_id); break; - } + } + case gf_logger_glusterlog: + ret = gf_glusterlog_log_repetitions( + ctx, domain, file, function, line, level, errnum, msgid, + appmsgstr, callstr, refcount, oldest, latest, graph_id); + break; + } - return ret; + return ret; } static int -gf_log_print_plain_fmt (glusterfs_ctx_t *ctx, const char *domain, - const char *file, const char *function, int32_t line, - gf_loglevel_t level, int errnum, uint64_t msgid, - char **appmsgstr, char *callstr, struct timeval tv, - int graph_id, gf_log_format_t fmt) +gf_log_print_plain_fmt(glusterfs_ctx_t *ctx, const char *domain, + const char *file, const char *function, int32_t line, + gf_loglevel_t level, int errnum, uint64_t msgid, + char **appmsgstr, char *callstr, struct timeval tv, + int graph_id, gf_log_format_t fmt) { - int ret = -1; - gf_log_logger_t logger = 0; + int ret = -1; + gf_log_logger_t logger = 0; - logger = ctx->log.logger; + logger = ctx->log.logger; - /* log to the configured logging service */ - switch (logger) { + /* log to the configured logging service */ + switch (logger) { case gf_logger_syslog: - if (ctx->log.log_control_file_found && ctx->log.gf_log_syslog) { - ret = gf_log_syslog (ctx, domain, file, function, line, - level, errnum, msgid, appmsgstr, - callstr, graph_id, fmt); - break; - } - /* NOTE: If syslog control file is absent, which is another - * way to control logging to syslog, then we will fall through - * to the gluster log. The ideal way to do things would be to - * not have the extra control file check */ - case gf_logger_glusterlog: - ret = gf_log_glusterlog (ctx, domain, file, function, line, - level, errnum, msgid, appmsgstr, - callstr, tv, graph_id, fmt); + if (ctx->log.log_control_file_found && ctx->log.gf_log_syslog) { + ret = gf_log_syslog(ctx, domain, file, function, line, level, + errnum, msgid, appmsgstr, callstr, graph_id, + fmt); break; - } + } + /* NOTE: If syslog control file is absent, which is another + * way to control logging to syslog, then we will fall through + * to the gluster log. The ideal way to do things would be to + * not have the extra control file check */ + case gf_logger_glusterlog: + ret = gf_log_glusterlog(ctx, domain, file, function, line, level, + errnum, msgid, appmsgstr, callstr, tv, + graph_id, fmt); + break; + } - return ret; + return ret; } void -gf_log_flush_message (log_buf_t *buf, glusterfs_ctx_t *ctx) +gf_log_flush_message(log_buf_t *buf, glusterfs_ctx_t *ctx) { - if (buf->refcount == 1) { - (void) gf_log_print_plain_fmt (ctx, buf->domain, buf->file, - buf->function, buf->line, - buf->level, buf->errnum, - buf->msg_id, &buf->msg, NULL, - buf->latest, buf->graph_id, - gf_logformat_withmsgid); - } - - if (buf->refcount > 1) { - gf_log_print_with_repetitions (ctx, buf->domain, buf->file, - buf->function, buf->line, - buf->level, buf->errnum, - buf->msg_id, &buf->msg, NULL, - buf->refcount, buf->oldest, - buf->latest, buf->graph_id); - } - return; + if (buf->refcount == 1) { + (void)gf_log_print_plain_fmt(ctx, buf->domain, buf->file, buf->function, + buf->line, buf->level, buf->errnum, + buf->msg_id, &buf->msg, NULL, buf->latest, + buf->graph_id, gf_logformat_withmsgid); + } + + if (buf->refcount > 1) { + gf_log_print_with_repetitions( + ctx, buf->domain, buf->file, buf->function, buf->line, buf->level, + buf->errnum, buf->msg_id, &buf->msg, NULL, buf->refcount, + buf->oldest, buf->latest, buf->graph_id); + } + return; } static void -gf_log_flush_list (struct list_head *copy, glusterfs_ctx_t *ctx) +gf_log_flush_list(struct list_head *copy, glusterfs_ctx_t *ctx) { - log_buf_t *iter = NULL; - log_buf_t *tmp = NULL; - - list_for_each_entry_safe (iter, tmp, copy, msg_list) { - gf_log_flush_message (iter, ctx); - list_del_init (&iter->msg_list); - log_buf_destroy (iter); - } + log_buf_t *iter = NULL; + log_buf_t *tmp = NULL; + + list_for_each_entry_safe(iter, tmp, copy, msg_list) + { + gf_log_flush_message(iter, ctx); + list_del_init(&iter->msg_list); + log_buf_destroy(iter); + } } void -gf_log_flush_msgs (glusterfs_ctx_t *ctx) +gf_log_flush_msgs(glusterfs_ctx_t *ctx) { - struct list_head copy; + struct list_head copy; - INIT_LIST_HEAD (©); + INIT_LIST_HEAD(©); - pthread_mutex_lock (&ctx->log.log_buf_lock); - { - list_splice_init (&ctx->log.lru_queue, ©); - ctx->log.lru_cur_size = 0; - } - pthread_mutex_unlock (&ctx->log.log_buf_lock); + pthread_mutex_lock(&ctx->log.log_buf_lock); + { + list_splice_init(&ctx->log.lru_queue, ©); + ctx->log.lru_cur_size = 0; + } + pthread_mutex_unlock(&ctx->log.log_buf_lock); - gf_log_flush_list (©, ctx); + gf_log_flush_list(©, ctx); - return; + return; } static void -gf_log_flush_extra_msgs (glusterfs_ctx_t *ctx, uint32_t new) +gf_log_flush_extra_msgs(glusterfs_ctx_t *ctx, uint32_t new) { - int count = 0; - int i = 0; - log_buf_t *iter = NULL; - log_buf_t *tmp = NULL; - struct list_head copy; - - INIT_LIST_HEAD (©); - - /* If the number of outstanding log messages does not cause list - * overflow even after reducing the size of the list, then do nothing. - * Otherwise (that is if there are more items in the list than there - * need to be after reducing its size), move the least recently used - * 'diff' elements to be flushed into a separate list... - */ - - pthread_mutex_lock (&ctx->log.log_buf_lock); + int count = 0; + int i = 0; + log_buf_t *iter = NULL; + log_buf_t *tmp = NULL; + struct list_head copy; + + INIT_LIST_HEAD(©); + + /* If the number of outstanding log messages does not cause list + * overflow even after reducing the size of the list, then do nothing. + * Otherwise (that is if there are more items in the list than there + * need to be after reducing its size), move the least recently used + * 'diff' elements to be flushed into a separate list... + */ + + pthread_mutex_lock(&ctx->log.log_buf_lock); + { + if (ctx->log.lru_cur_size <= new) + goto unlock; + count = ctx->log.lru_cur_size - new; + list_for_each_entry_safe(iter, tmp, &ctx->log.lru_queue, msg_list) { - if (ctx->log.lru_cur_size <= new) - goto unlock; - count = ctx->log.lru_cur_size - new; - list_for_each_entry_safe (iter, tmp, &ctx->log.lru_queue, - msg_list) { - if (i == count) - break; - - list_del_init (&iter->msg_list); - list_add_tail (&iter->msg_list, ©); - i++; - } - ctx->log.lru_cur_size = ctx->log.lru_cur_size - count; + if (i == count) + break; + + list_del_init(&iter->msg_list); + list_add_tail(&iter->msg_list, ©); + i++; } - // ... quickly unlock ... + ctx->log.lru_cur_size = ctx->log.lru_cur_size - count; + } + // ... quickly unlock ... unlock: - pthread_mutex_unlock (&ctx->log.log_buf_lock); - if (list_empty (©)) - return; + pthread_mutex_unlock(&ctx->log.log_buf_lock); + if (list_empty(©)) + return; - TEST_LOG("Log buffer size reduced. About to flush %d extra log " - "messages", count); - // ... and then flush them outside the lock. - gf_log_flush_list (©, ctx); - TEST_LOG("Just flushed %d extra log messages", count); + TEST_LOG( + "Log buffer size reduced. About to flush %d extra log " + "messages", + count); + // ... and then flush them outside the lock. + gf_log_flush_list(©, ctx); + TEST_LOG("Just flushed %d extra log messages", count); - return; + return; } static int -__gf_log_inject_timer_event (glusterfs_ctx_t *ctx) +__gf_log_inject_timer_event(glusterfs_ctx_t *ctx) { - int ret = -1; - struct timespec timeout = {0,}; + int ret = -1; + struct timespec timeout = { + 0, + }; - if (!ctx) - goto out; + if (!ctx) + goto out; - if (ctx->log.log_flush_timer) { - gf_timer_call_cancel (ctx, ctx->log.log_flush_timer); - ctx->log.log_flush_timer = NULL; - } + if (ctx->log.log_flush_timer) { + gf_timer_call_cancel(ctx, ctx->log.log_flush_timer); + ctx->log.log_flush_timer = NULL; + } - timeout.tv_sec = ctx->log.timeout; - timeout.tv_nsec = 0; + timeout.tv_sec = ctx->log.timeout; + timeout.tv_nsec = 0; - TEST_LOG("Starting timer now. Timeout = %u, current buf size = %d", - ctx->log.timeout, ctx->log.lru_size); - ctx->log.log_flush_timer = gf_timer_call_after (ctx, timeout, - gf_log_flush_timeout_cbk, - (void *)ctx); - if (!ctx->log.log_flush_timer) - goto out; + TEST_LOG("Starting timer now. Timeout = %u, current buf size = %d", + ctx->log.timeout, ctx->log.lru_size); + ctx->log.log_flush_timer = gf_timer_call_after( + ctx, timeout, gf_log_flush_timeout_cbk, (void *)ctx); + if (!ctx->log.log_flush_timer) + goto out; - ret = 0; + ret = 0; out: - return ret; + return ret; } int -gf_log_inject_timer_event (glusterfs_ctx_t *ctx) +gf_log_inject_timer_event(glusterfs_ctx_t *ctx) { - int ret = -1; + int ret = -1; - if (!ctx) - return -1; + if (!ctx) + return -1; - pthread_mutex_lock (&ctx->log.log_buf_lock); - { - ret = __gf_log_inject_timer_event (ctx); - } - pthread_mutex_unlock (&ctx->log.log_buf_lock); + pthread_mutex_lock(&ctx->log.log_buf_lock); + { + ret = __gf_log_inject_timer_event(ctx); + } + pthread_mutex_unlock(&ctx->log.log_buf_lock); - return ret; + return ret; } void -gf_log_flush_timeout_cbk (void *data) +gf_log_flush_timeout_cbk(void *data) { - glusterfs_ctx_t *ctx = NULL; + glusterfs_ctx_t *ctx = NULL; - ctx = (glusterfs_ctx_t *) data; + ctx = (glusterfs_ctx_t *)data; - TEST_LOG("Log timer timed out. About to flush outstanding messages if " - "present"); - gf_log_flush_msgs (ctx); + TEST_LOG( + "Log timer timed out. About to flush outstanding messages if " + "present"); + gf_log_flush_msgs(ctx); - (void) gf_log_inject_timer_event (ctx); + (void)gf_log_inject_timer_event(ctx); - return; + return; } static int -_gf_msg_internal (const char *domain, const char *file, const char *function, - int32_t line, gf_loglevel_t level, int errnum, uint64_t msgid, - char **appmsgstr, char *callstr, int graph_id) +_gf_msg_internal(const char *domain, const char *file, const char *function, + int32_t line, gf_loglevel_t level, int errnum, uint64_t msgid, + char **appmsgstr, char *callstr, int graph_id) { - int ret = -1; - uint32_t size = 0; - const char *basename = NULL; - xlator_t *this = NULL; - glusterfs_ctx_t *ctx = NULL; - log_buf_t *iter = NULL; - log_buf_t *buf_tmp = NULL; - log_buf_t *buf_new = NULL; - log_buf_t *first = NULL; - struct timeval tv = {0,}; - gf_boolean_t found = _gf_false; - gf_boolean_t flush_lru = _gf_false; - gf_boolean_t flush_logged_msg = _gf_false; - - this = THIS; - ctx = this->ctx; - - if (!ctx) - goto out; + int ret = -1; + uint32_t size = 0; + const char *basename = NULL; + xlator_t *this = NULL; + glusterfs_ctx_t *ctx = NULL; + log_buf_t *iter = NULL; + log_buf_t *buf_tmp = NULL; + log_buf_t *buf_new = NULL; + log_buf_t *first = NULL; + struct timeval tv = { + 0, + }; + gf_boolean_t found = _gf_false; + gf_boolean_t flush_lru = _gf_false; + gf_boolean_t flush_logged_msg = _gf_false; + + this = THIS; + ctx = this->ctx; + + if (!ctx) + goto out; + + GET_FILE_NAME_TO_LOG(file, basename); + + ret = gettimeofday(&tv, NULL); + if (ret) + goto out; + + /* If this function is called via _gf_msg_callingfn () (indicated by a + * non-NULL callstr), or if the logformat is traditional, flush the + * message directly to disk. + */ + + if ((callstr) || (ctx->log.logformat == gf_logformat_traditional)) { + ret = gf_log_print_plain_fmt(ctx, domain, basename, function, line, + level, errnum, msgid, appmsgstr, callstr, + tv, graph_id, gf_logformat_traditional); + goto out; + } + + pthread_mutex_lock(&ctx->log.log_buf_lock); + { + /* Check if the msg being logged is already part of the list */ + list_for_each_entry_safe_reverse(iter, buf_tmp, &ctx->log.lru_queue, + msg_list) + { + if (first == NULL) + // Remember the first (lru) element in first ptr + first = iter; - GET_FILE_NAME_TO_LOG (file, basename); + /* Try to fail the search early on by doing the less + * expensive integer comparisons and continue to string + * parameter comparisons only after all int parameters + * are found to be matching. + */ + if (line != iter->line) + continue; - ret = gettimeofday (&tv, NULL); - if (ret) - goto out; + if (errnum != iter->errnum) + continue; - /* If this function is called via _gf_msg_callingfn () (indicated by a - * non-NULL callstr), or if the logformat is traditional, flush the - * message directly to disk. - */ + if (msgid != iter->msg_id) + continue; - if ((callstr) || (ctx->log.logformat == gf_logformat_traditional)) { - ret = gf_log_print_plain_fmt (ctx, domain, basename, function, - line, level, errnum, msgid, - appmsgstr, callstr, tv, graph_id, - gf_logformat_traditional); - goto out; - } + if (level != iter->level) + continue; - pthread_mutex_lock (&ctx->log.log_buf_lock); - { - /* Check if the msg being logged is already part of the list */ - list_for_each_entry_safe_reverse (iter, buf_tmp, - &ctx->log.lru_queue, - msg_list) { - if (first == NULL) - // Remember the first (lru) element in first ptr - first = iter; - - /* Try to fail the search early on by doing the less - * expensive integer comparisons and continue to string - * parameter comparisons only after all int parameters - * are found to be matching. - */ - if (line != iter->line) - continue; - - if (errnum != iter->errnum) - continue; - - if (msgid != iter->msg_id) - continue; - - if (level != iter->level) - continue; - - if (graph_id != iter->graph_id) - continue; - - if (strcmp (domain, iter->domain)) - continue; - - if (strcmp (basename, iter->file)) - continue; - - if (strcmp (function, iter->function)) - continue; - - if (strcmp (*appmsgstr, iter->msg)) - continue; - - //Ah! Found a match! - list_move_tail (&iter->msg_list, &ctx->log.lru_queue); - iter->refcount++; - found = _gf_true; - //Update the 'latest' timestamp. - memcpy ((void *)&(iter->latest), (void *)&tv, - sizeof (struct timeval)); - break; - } - if (found) { - ret = 0; - goto unlock; - } - // else ... - - size = ctx->log.lru_size; - /* If the upper limit on the log buf size is 0, flush the msg to - * disk directly after unlock. There's no need to buffer the - * msg here. - */ - if (size == 0) { - flush_logged_msg = _gf_true; - goto unlock; - } else if ((ctx->log.lru_cur_size + 1) > size) { - /* If the list is full, flush the lru msg to disk and also - * release it after unlock, and ... - * */ - if (first->refcount >= 1) - TEST_LOG("Buffer overflow of a buffer whose size limit " - "is %d. About to flush least recently used log" - " message to disk", size); - list_del_init (&first->msg_list); - ctx->log.lru_cur_size--; - flush_lru = _gf_true; - } - /* create a new list element, initialise and enqueue it. - * Additionally, this being the first occurrence of the msg, - * log it directly to disk after unlock. */ - buf_new = log_buf_new (); - if (!buf_new) { - ret = -1; - goto unlock; - } - ret = log_buf_init (buf_new, domain, basename, function, line, - level, errnum, msgid, appmsgstr, graph_id); - if (ret) { - log_buf_destroy (buf_new); - goto unlock; - } + if (graph_id != iter->graph_id) + continue; - memcpy ((void *)&(buf_new->latest), (void *)&tv, - sizeof (struct timeval)); - memcpy ((void *)&(buf_new->oldest), (void *)&tv, - sizeof (struct timeval)); + if (strcmp(domain, iter->domain)) + continue; - list_add_tail (&buf_new->msg_list, &ctx->log.lru_queue); - ctx->log.lru_cur_size++; - flush_logged_msg = _gf_true; - ret = 0; - } -unlock: - pthread_mutex_unlock (&ctx->log.log_buf_lock); + if (strcmp(basename, iter->file)) + continue; - /* Value of @ret is a don't-care below since irrespective of success or - * failure post setting of @flush_lru, @first must be flushed and freed. - */ - if (flush_lru) { - gf_log_flush_message (first, ctx); - log_buf_destroy (first); + if (strcmp(function, iter->function)) + continue; + + if (strcmp(*appmsgstr, iter->msg)) + continue; + + // Ah! Found a match! + list_move_tail(&iter->msg_list, &ctx->log.lru_queue); + iter->refcount++; + found = _gf_true; + // Update the 'latest' timestamp. + memcpy((void *)&(iter->latest), (void *)&tv, + sizeof(struct timeval)); + break; } - /* Similarly, irrespective of whether all operations since setting of - * @flush_logged_msg were successful or not, flush the message being - * logged to disk in the plain format. - */ - if (flush_logged_msg) { - ret = gf_log_print_plain_fmt (ctx, domain, basename, - function, line, level, - errnum, msgid, appmsgstr, - callstr, tv, graph_id, - gf_logformat_withmsgid); + if (found) { + ret = 0; + goto unlock; } + // else ... + + size = ctx->log.lru_size; + /* If the upper limit on the log buf size is 0, flush the msg to + * disk directly after unlock. There's no need to buffer the + * msg here. + */ + if (size == 0) { + flush_logged_msg = _gf_true; + goto unlock; + } else if ((ctx->log.lru_cur_size + 1) > size) { + /* If the list is full, flush the lru msg to disk and also + * release it after unlock, and ... + * */ + if (first->refcount >= 1) + TEST_LOG( + "Buffer overflow of a buffer whose size limit " + "is %d. About to flush least recently used log" + " message to disk", + size); + list_del_init(&first->msg_list); + ctx->log.lru_cur_size--; + flush_lru = _gf_true; + } + /* create a new list element, initialise and enqueue it. + * Additionally, this being the first occurrence of the msg, + * log it directly to disk after unlock. */ + buf_new = log_buf_new(); + if (!buf_new) { + ret = -1; + goto unlock; + } + ret = log_buf_init(buf_new, domain, basename, function, line, level, + errnum, msgid, appmsgstr, graph_id); + if (ret) { + log_buf_destroy(buf_new); + goto unlock; + } + + memcpy((void *)&(buf_new->latest), (void *)&tv, sizeof(struct timeval)); + memcpy((void *)&(buf_new->oldest), (void *)&tv, sizeof(struct timeval)); + + list_add_tail(&buf_new->msg_list, &ctx->log.lru_queue); + ctx->log.lru_cur_size++; + flush_logged_msg = _gf_true; + ret = 0; + } +unlock: + pthread_mutex_unlock(&ctx->log.log_buf_lock); + + /* Value of @ret is a don't-care below since irrespective of success or + * failure post setting of @flush_lru, @first must be flushed and freed. + */ + if (flush_lru) { + gf_log_flush_message(first, ctx); + log_buf_destroy(first); + } + /* Similarly, irrespective of whether all operations since setting of + * @flush_logged_msg were successful or not, flush the message being + * logged to disk in the plain format. + */ + if (flush_logged_msg) { + ret = gf_log_print_plain_fmt(ctx, domain, basename, function, line, + level, errnum, msgid, appmsgstr, callstr, + tv, graph_id, gf_logformat_withmsgid); + } out: - return ret; + return ret; } int -_gf_msg (const char *domain, const char *file, const char *function, - int32_t line, gf_loglevel_t level, int errnum, int trace, - uint64_t msgid, const char *fmt, ...) +_gf_msg(const char *domain, const char *file, const char *function, + int32_t line, gf_loglevel_t level, int errnum, int trace, + uint64_t msgid, const char *fmt, ...) { - int ret = 0; - char *msgstr = NULL; - va_list ap; - xlator_t *this = NULL; - glusterfs_ctx_t *ctx = NULL; - char callstr[GF_LOG_BACKTRACE_SIZE] = {0,}; - int passcallstr = 0; - int log_inited = 0; - - /* in args check */ - if (!domain || !file || !function || !fmt) { - fprintf (stderr, - "logging: %s:%s():%d: invalid argument\n", - __FILE__, __PRETTY_FUNCTION__, __LINE__); - return -1; - } - - this = THIS; - - if (this == NULL) - return -1; - - ctx = this->ctx; - if (ctx == NULL) { - /* messages before context initialization are ignored */ - return -1; - } - - /* check if we should be logging */ - if (skip_logging (this, level)) - goto out; - - if (trace) { - ret = _gf_msg_backtrace (GF_LOG_BACKTRACE_DEPTH, callstr, - GF_LOG_BACKTRACE_SIZE); - if (ret >= 0) - passcallstr = 1; - else - ret = 0; - } - - pthread_mutex_lock (&ctx->log.logfile_mutex); - { - if (ctx->log.logfile) { - log_inited = 1; - } - } - pthread_mutex_unlock (&ctx->log.logfile_mutex); - - /* form the message */ - va_start (ap, fmt); - ret = vasprintf (&msgstr, fmt, ap); - va_end (ap); - - /* log */ - if (ret != -1) { - if (!log_inited && ctx->log.gf_log_syslog) { - ret = gf_log_syslog (ctx, domain, file, function, line, - level, errnum, msgid, &msgstr, - (passcallstr? callstr : NULL), - (this->graph)? this->graph->id : 0, - gf_logformat_traditional); - } else { - ret = _gf_msg_internal (domain, file, function, line, - level, errnum, msgid, &msgstr, - (passcallstr? callstr : NULL), - (this->graph)? this->graph->id : 0); - } + int ret = 0; + char *msgstr = NULL; + va_list ap; + xlator_t *this = NULL; + glusterfs_ctx_t *ctx = NULL; + char callstr[GF_LOG_BACKTRACE_SIZE] = { + 0, + }; + int passcallstr = 0; + int log_inited = 0; + + /* in args check */ + if (!domain || !file || !function || !fmt) { + fprintf(stderr, "logging: %s:%s():%d: invalid argument\n", __FILE__, + __PRETTY_FUNCTION__, __LINE__); + return -1; + } + + this = THIS; + + if (this == NULL) + return -1; + + ctx = this->ctx; + if (ctx == NULL) { + /* messages before context initialization are ignored */ + return -1; + } + + /* check if we should be logging */ + if (skip_logging(this, level)) + goto out; + + if (trace) { + ret = _gf_msg_backtrace(GF_LOG_BACKTRACE_DEPTH, callstr, + GF_LOG_BACKTRACE_SIZE); + if (ret >= 0) + passcallstr = 1; + else + ret = 0; + } + + pthread_mutex_lock(&ctx->log.logfile_mutex); + { + if (ctx->log.logfile) { + log_inited = 1; + } + } + pthread_mutex_unlock(&ctx->log.logfile_mutex); + + /* form the message */ + va_start(ap, fmt); + ret = vasprintf(&msgstr, fmt, ap); + va_end(ap); + + /* log */ + if (ret != -1) { + if (!log_inited && ctx->log.gf_log_syslog) { + ret = gf_log_syslog( + ctx, domain, file, function, line, level, errnum, msgid, + &msgstr, (passcallstr ? callstr : NULL), + (this->graph) ? this->graph->id : 0, gf_logformat_traditional); } else { - /* man (3) vasprintf states on error strp contents - * are undefined, be safe */ - msgstr = NULL; + ret = _gf_msg_internal(domain, file, function, line, level, errnum, + msgid, &msgstr, + (passcallstr ? callstr : NULL), + (this->graph) ? this->graph->id : 0); } + } else { + /* man (3) vasprintf states on error strp contents + * are undefined, be safe */ + msgstr = NULL; + } - FREE (msgstr); + FREE(msgstr); out: - return ret; + return ret; } /* TODO: Deprecate (delete) _gf_log, _gf_log_callingfn, * once messages are changed to use _gf_msgXXX APIs for logging */ int -_gf_log (const char *domain, const char *file, const char *function, int line, - gf_loglevel_t level, const char *fmt, ...) +_gf_log(const char *domain, const char *file, const char *function, int line, + gf_loglevel_t level, const char *fmt, ...) { - const char *basename = NULL; - FILE *new_logfile = NULL; - va_list ap; - char timestr[GF_LOG_TIMESTR_SIZE] = {0,}; - struct timeval tv = {0,}; - char *str1 = NULL; - char *str2 = NULL; - char *msg = NULL; - size_t len = 0; - int ret = 0; - int fd = -1; - xlator_t *this = NULL; - glusterfs_ctx_t *ctx = NULL; - - this = THIS; - ctx = this->ctx; - - if (!ctx) - goto out; - - if (skip_logging (this, level)) - goto out; - - static char *level_strings[] = {"", /* NONE */ - "M", /* EMERGENCY */ - "A", /* ALERT */ - "C", /* CRITICAL */ - "E", /* ERROR */ - "W", /* WARNING */ - "N", /* NOTICE */ - "I", /* INFO */ - "D", /* DEBUG */ - "T", /* TRACE */ - ""}; - - if (!domain || !file || !function || !fmt) { - fprintf (stderr, - "logging: %s:%s():%d: invalid argument\n", - __FILE__, __PRETTY_FUNCTION__, __LINE__); - return -1; + const char *basename = NULL; + FILE *new_logfile = NULL; + va_list ap; + char timestr[GF_LOG_TIMESTR_SIZE] = { + 0, + }; + struct timeval tv = { + 0, + }; + char *str1 = NULL; + char *str2 = NULL; + char *msg = NULL; + size_t len = 0; + int ret = 0; + int fd = -1; + xlator_t *this = NULL; + glusterfs_ctx_t *ctx = NULL; + + this = THIS; + ctx = this->ctx; + + if (!ctx) + goto out; + + if (skip_logging(this, level)) + goto out; + + static char *level_strings[] = {"", /* NONE */ + "M", /* EMERGENCY */ + "A", /* ALERT */ + "C", /* CRITICAL */ + "E", /* ERROR */ + "W", /* WARNING */ + "N", /* NOTICE */ + "I", /* INFO */ + "D", /* DEBUG */ + "T", /* TRACE */ + ""}; + + if (!domain || !file || !function || !fmt) { + fprintf(stderr, "logging: %s:%s():%d: invalid argument\n", __FILE__, + __PRETTY_FUNCTION__, __LINE__); + return -1; + } + + basename = strrchr(file, '/'); + if (basename) + basename++; + else + basename = file; + + if (ctx->log.log_control_file_found) { + int priority; + /* treat GF_LOG_TRACE and GF_LOG_NONE as LOG_DEBUG and + other level as is */ + if (GF_LOG_TRACE == level || GF_LOG_NONE == level) { + priority = LOG_DEBUG; + } else { + priority = level - 1; } - basename = strrchr (file, '/'); - if (basename) - basename++; - else - basename = file; + va_start(ap, fmt); + vasprintf(&str2, fmt, ap); + va_end(ap); - if (ctx->log.log_control_file_found) - { - int priority; - /* treat GF_LOG_TRACE and GF_LOG_NONE as LOG_DEBUG and - other level as is */ - if (GF_LOG_TRACE == level || GF_LOG_NONE == level) { - priority = LOG_DEBUG; - } else { - priority = level - 1; - } + gf_syslog(priority, "[%s:%d:%s] %d-%s: %s", basename, line, function, + ((this->graph) ? this->graph->id : 0), domain, str2); + goto err; + } - va_start (ap, fmt); - vasprintf (&str2, fmt, ap); - va_end (ap); + if (ctx->log.logrotate) { + ctx->log.logrotate = 0; - gf_syslog (priority, "[%s:%d:%s] %d-%s: %s", - basename, line, function, - ((this->graph) ? this->graph->id:0), domain, str2); - goto err; + fd = sys_open(ctx->log.filename, O_CREAT | O_RDONLY, S_IRUSR | S_IWUSR); + if (fd < 0) { + gf_msg("logrotate", GF_LOG_ERROR, errno, LG_MSG_FILE_OP_FAILED, + "failed to open logfile"); + return -1; } + sys_close(fd); - if (ctx->log.logrotate) { - ctx->log.logrotate = 0; - - fd = sys_open (ctx->log.filename, - O_CREAT | O_RDONLY, S_IRUSR | S_IWUSR); - if (fd < 0) { - gf_msg ("logrotate", GF_LOG_ERROR, errno, - LG_MSG_FILE_OP_FAILED, - "failed to open logfile"); - return -1; - } - sys_close (fd); - - new_logfile = fopen (ctx->log.filename, "a"); - if (!new_logfile) { - gf_msg ("logrotate", GF_LOG_CRITICAL, errno, - LG_MSG_FILE_OP_FAILED, - "failed to open logfile %s", - ctx->log.filename); - goto log; - } - - pthread_mutex_lock (&ctx->log.logfile_mutex); - { - if (ctx->log.logfile) - fclose (ctx->log.logfile); - - ctx->log.gf_log_logfile = - ctx->log.logfile = new_logfile; - } - pthread_mutex_unlock (&ctx->log.logfile_mutex); - + new_logfile = fopen(ctx->log.filename, "a"); + if (!new_logfile) { + gf_msg("logrotate", GF_LOG_CRITICAL, errno, LG_MSG_FILE_OP_FAILED, + "failed to open logfile %s", ctx->log.filename); + goto log; } -log: - ret = gettimeofday (&tv, NULL); - if (-1 == ret) - goto out; - va_start (ap, fmt); - gf_time_fmt (timestr, sizeof timestr, tv.tv_sec, gf_timefmt_FT); - snprintf (timestr + strlen (timestr), sizeof timestr - strlen (timestr), - ".%"GF_PRI_SUSECONDS, tv.tv_usec); - - ret = gf_asprintf (&str1, "[%s] %s [%s:%d:%s] %d-%s: ", - timestr, level_strings[level], - basename, line, function, - ((this->graph)?this->graph->id:0), domain); - if (-1 == ret) { - goto err; - } + pthread_mutex_lock(&ctx->log.logfile_mutex); + { + if (ctx->log.logfile) + fclose(ctx->log.logfile); - ret = vasprintf (&str2, fmt, ap); - if (-1 == ret) { - goto err; + ctx->log.gf_log_logfile = ctx->log.logfile = new_logfile; } + pthread_mutex_unlock(&ctx->log.logfile_mutex); + } - va_end (ap); - - len = strlen (str1); - msg = GF_MALLOC (len + strlen (str2) + 1, gf_common_mt_char); - if (!msg) { - goto err; +log: + ret = gettimeofday(&tv, NULL); + if (-1 == ret) + goto out; + va_start(ap, fmt); + gf_time_fmt(timestr, sizeof timestr, tv.tv_sec, gf_timefmt_FT); + snprintf(timestr + strlen(timestr), sizeof timestr - strlen(timestr), + ".%" GF_PRI_SUSECONDS, tv.tv_usec); + + ret = gf_asprintf(&str1, "[%s] %s [%s:%d:%s] %d-%s: ", timestr, + level_strings[level], basename, line, function, + ((this->graph) ? this->graph->id : 0), domain); + if (-1 == ret) { + goto err; + } + + ret = vasprintf(&str2, fmt, ap); + if (-1 == ret) { + goto err; + } + + va_end(ap); + + len = strlen(str1); + msg = GF_MALLOC(len + strlen(str2) + 1, gf_common_mt_char); + if (!msg) { + goto err; + } + + strcpy(msg, str1); + strcpy(msg + len, str2); + + pthread_mutex_lock(&ctx->log.logfile_mutex); + { + if (ctx->log.logfile) { + fprintf(ctx->log.logfile, "%s\n", msg); + fflush(ctx->log.logfile); + } else if (ctx->log.loglevel >= level) { + fprintf(stderr, "%s\n", msg); + fflush(stderr); } - strcpy (msg, str1); - strcpy (msg + len, str2); - - pthread_mutex_lock (&ctx->log.logfile_mutex); - { - - if (ctx->log.logfile) { - fprintf (ctx->log.logfile, "%s\n", msg); - fflush (ctx->log.logfile); - } else if (ctx->log.loglevel >= level) { - fprintf (stderr, "%s\n", msg); - fflush (stderr); - } - #ifdef GF_LINUX_HOST_OS - /* We want only serious log in 'syslog', not our debug - and trace logs */ - if (ctx->log.gf_log_syslog && level && - (level <= ctx->log.sys_log_level)) - syslog ((level-1), "%s\n", msg); + /* We want only serious log in 'syslog', not our debug + and trace logs */ + if (ctx->log.gf_log_syslog && level && + (level <= ctx->log.sys_log_level)) + syslog((level - 1), "%s\n", msg); #endif - } + } - pthread_mutex_unlock (&ctx->log.logfile_mutex); + pthread_mutex_unlock(&ctx->log.logfile_mutex); err: - GF_FREE (msg); + GF_FREE(msg); - GF_FREE (str1); + GF_FREE(str1); - FREE (str2); + FREE(str2); out: - va_end (ap); - return (0); + va_end(ap); + return (0); } int -_gf_log_eh (const char *function, const char *fmt, ...) +_gf_log_eh(const char *function, const char *fmt, ...) { - int ret = -1; - va_list ap; - char *str1 = NULL; - char *str2 = NULL; - char *msg = NULL; - xlator_t *this = NULL; - - this = THIS; - - ret = gf_asprintf (&str1, "[%d] %s: ", - ((this->graph)?this->graph->id:0), - function); - if (-1 == ret) { - goto out; - } + int ret = -1; + va_list ap; + char *str1 = NULL; + char *str2 = NULL; + char *msg = NULL; + xlator_t *this = NULL; - va_start (ap, fmt); + this = THIS; - ret = vasprintf (&str2, fmt, ap); - if (-1 == ret) { - goto out; - } + ret = gf_asprintf(&str1, "[%d] %s: ", ((this->graph) ? this->graph->id : 0), + function); + if (-1 == ret) { + goto out; + } - msg = GF_MALLOC (strlen (str1) + strlen (str2) + 1, gf_common_mt_char); - if (!msg) { - ret = -1; - goto out; - } + va_start(ap, fmt); + + ret = vasprintf(&str2, fmt, ap); + if (-1 == ret) { + goto out; + } - strcpy (msg, str1); - strcat (msg, str2); + msg = GF_MALLOC(strlen(str1) + strlen(str2) + 1, gf_common_mt_char); + if (!msg) { + ret = -1; + goto out; + } - ret = eh_save_history (this->history, msg); - if (ret < 0) - GF_FREE (msg); + strcpy(msg, str1); + strcat(msg, str2); + + ret = eh_save_history(this->history, msg); + if (ret < 0) + GF_FREE(msg); out: - GF_FREE (str1); + GF_FREE(str1); - /* Use FREE instead of GF_FREE since str2 was allocated by vasprintf */ - if (str2) - FREE (str2); + /* Use FREE instead of GF_FREE since str2 was allocated by vasprintf */ + if (str2) + FREE(str2); - va_end (ap); + va_end(ap); - return ret; + return ret; } int -gf_cmd_log_init (const char *filename) +gf_cmd_log_init(const char *filename) { - int fd = -1; - xlator_t *this = NULL; - glusterfs_ctx_t *ctx = NULL; - - this = THIS; - ctx = this->ctx; - - if (!ctx) - return -1; - - if (!filename){ - gf_msg (this->name, GF_LOG_CRITICAL, 0, LG_MSG_INVALID_ENTRY, - "gf_cmd_log_init: no filename specified\n"); - return -1; - } - - ctx->log.cmd_log_filename = gf_strdup (filename); - if (!ctx->log.cmd_log_filename) { - return -1; - } - /* close and reopen cmdlogfile for log rotate*/ - if (ctx->log.cmdlogfile) { - fclose (ctx->log.cmdlogfile); - ctx->log.cmdlogfile = NULL; - } - - fd = sys_open (ctx->log.cmd_log_filename, - O_CREAT | O_WRONLY | O_APPEND, S_IRUSR | S_IWUSR); - if (fd < 0) { - gf_msg (this->name, GF_LOG_CRITICAL, errno, - LG_MSG_FILE_OP_FAILED, "failed to open cmd_log_file"); - return -1; - } - - ctx->log.cmdlogfile = fdopen (fd, "a"); - if (!ctx->log.cmdlogfile){ - gf_msg (this->name, GF_LOG_CRITICAL, errno, - LG_MSG_FILE_OP_FAILED, - "gf_cmd_log_init: failed to open logfile \"%s\" " - "\n", ctx->log.cmd_log_filename); - sys_close (fd); - return -1; - } - return 0; + int fd = -1; + xlator_t *this = NULL; + glusterfs_ctx_t *ctx = NULL; + + this = THIS; + ctx = this->ctx; + + if (!ctx) + return -1; + + if (!filename) { + gf_msg(this->name, GF_LOG_CRITICAL, 0, LG_MSG_INVALID_ENTRY, + "gf_cmd_log_init: no filename specified\n"); + return -1; + } + + ctx->log.cmd_log_filename = gf_strdup(filename); + if (!ctx->log.cmd_log_filename) { + return -1; + } + /* close and reopen cmdlogfile for log rotate*/ + if (ctx->log.cmdlogfile) { + fclose(ctx->log.cmdlogfile); + ctx->log.cmdlogfile = NULL; + } + + fd = sys_open(ctx->log.cmd_log_filename, O_CREAT | O_WRONLY | O_APPEND, + S_IRUSR | S_IWUSR); + if (fd < 0) { + gf_msg(this->name, GF_LOG_CRITICAL, errno, LG_MSG_FILE_OP_FAILED, + "failed to open cmd_log_file"); + return -1; + } + + ctx->log.cmdlogfile = fdopen(fd, "a"); + if (!ctx->log.cmdlogfile) { + gf_msg(this->name, GF_LOG_CRITICAL, errno, LG_MSG_FILE_OP_FAILED, + "gf_cmd_log_init: failed to open logfile \"%s\" " + "\n", + ctx->log.cmd_log_filename); + sys_close(fd); + return -1; + } + return 0; } int -gf_cmd_log (const char *domain, const char *fmt, ...) +gf_cmd_log(const char *domain, const char *fmt, ...) { - va_list ap; - char timestr[64]; - struct timeval tv = {0,}; - char *str1 = NULL; - char *str2 = NULL; - char *msg = NULL; - size_t len = 0; - int ret = 0; - int fd = -1; - glusterfs_ctx_t *ctx = NULL; - - ctx = THIS->ctx; - - if (!ctx) - return -1; - - if (!ctx->log.cmdlogfile) - return -1; - - - if (!domain || !fmt) { - gf_msg_trace ("glusterd", 0, - "logging: invalid argument\n"); - return -1; - } + va_list ap; + char timestr[64]; + struct timeval tv = { + 0, + }; + char *str1 = NULL; + char *str2 = NULL; + char *msg = NULL; + size_t len = 0; + int ret = 0; + int fd = -1; + glusterfs_ctx_t *ctx = NULL; + + ctx = THIS->ctx; + + if (!ctx) + return -1; + + if (!ctx->log.cmdlogfile) + return -1; + + if (!domain || !fmt) { + gf_msg_trace("glusterd", 0, "logging: invalid argument\n"); + return -1; + } + + ret = gettimeofday(&tv, NULL); + if (ret == -1) + goto out; + va_start(ap, fmt); + gf_time_fmt(timestr, sizeof timestr, tv.tv_sec, gf_timefmt_FT); + snprintf(timestr + strlen(timestr), GF_LOG_TIMESTR_SIZE - strlen(timestr), + ".%" GF_PRI_SUSECONDS, tv.tv_usec); + + ret = gf_asprintf(&str1, "[%s] %s : ", timestr, domain); + if (ret == -1) { + goto out; + } + + ret = vasprintf(&str2, fmt, ap); + if (ret == -1) { + goto out; + } + + va_end(ap); + + len = strlen(str1); + msg = GF_MALLOC(len + strlen(str2) + 1, gf_common_mt_char); + if (!msg) { + goto out; + } + + strcpy(msg, str1); + strcpy(msg + len, str2); + + /* close and reopen cmdlogfile fd for in case of log rotate*/ + if (ctx->log.cmd_history_logrotate) { + ctx->log.cmd_history_logrotate = 0; - ret = gettimeofday (&tv, NULL); - if (ret == -1) - goto out; - va_start (ap, fmt); - gf_time_fmt (timestr, sizeof timestr, tv.tv_sec, gf_timefmt_FT); - snprintf (timestr + strlen (timestr), - GF_LOG_TIMESTR_SIZE - strlen (timestr), - ".%"GF_PRI_SUSECONDS, tv.tv_usec); - - ret = gf_asprintf (&str1, "[%s] %s : ", - timestr, domain); - if (ret == -1) { - goto out; - } - - ret = vasprintf (&str2, fmt, ap); - if (ret == -1) { - goto out; + if (ctx->log.cmdlogfile) { + fclose(ctx->log.cmdlogfile); + ctx->log.cmdlogfile = NULL; } - va_end (ap); - - len = strlen (str1); - msg = GF_MALLOC (len + strlen (str2) + 1, gf_common_mt_char); - if (!msg) { - goto out; + fd = sys_open(ctx->log.cmd_log_filename, O_CREAT | O_WRONLY | O_APPEND, + S_IRUSR | S_IWUSR); + if (fd < 0) { + gf_msg(THIS->name, GF_LOG_CRITICAL, errno, LG_MSG_FILE_OP_FAILED, + "failed to open " + "logfile \"%s\" \n", + ctx->log.cmd_log_filename); + ret = -1; + goto out; } - strcpy (msg, str1); - strcpy (msg + len, str2); - - /* close and reopen cmdlogfile fd for in case of log rotate*/ - if (ctx->log.cmd_history_logrotate) { - ctx->log.cmd_history_logrotate = 0; - - if (ctx->log.cmdlogfile) { - fclose (ctx->log.cmdlogfile); - ctx->log.cmdlogfile = NULL; - } - - fd = sys_open (ctx->log.cmd_log_filename, - O_CREAT | O_WRONLY | O_APPEND, - S_IRUSR | S_IWUSR); - if (fd < 0) { - gf_msg (THIS->name, GF_LOG_CRITICAL, errno, - LG_MSG_FILE_OP_FAILED, "failed to open " - "logfile \"%s\" \n", ctx->log.cmd_log_filename); - ret = -1; - goto out; - } - - ctx->log.cmdlogfile = fdopen (fd, "a"); - if (!ctx->log.cmdlogfile) { - gf_msg (THIS->name, GF_LOG_CRITICAL, errno, - LG_MSG_FILE_OP_FAILED, - "failed to open logfile \"%s\"" - " \n", ctx->log.cmd_log_filename); - ret = -1; - sys_close (fd); - goto out; - } + ctx->log.cmdlogfile = fdopen(fd, "a"); + if (!ctx->log.cmdlogfile) { + gf_msg(THIS->name, GF_LOG_CRITICAL, errno, LG_MSG_FILE_OP_FAILED, + "failed to open logfile \"%s\"" + " \n", + ctx->log.cmd_log_filename); + ret = -1; + sys_close(fd); + goto out; } + } - fprintf (ctx->log.cmdlogfile, "%s\n", msg); - fflush (ctx->log.cmdlogfile); + fprintf(ctx->log.cmdlogfile, "%s\n", msg); + fflush(ctx->log.cmdlogfile); out: - GF_FREE (msg); + GF_FREE(msg); - GF_FREE (str1); + GF_FREE(str1); - FREE (str2); + FREE(str2); - va_end (ap); + va_end(ap); - return ret; + return ret; } static int -_do_slog_format (const char *event, va_list inp, char **msg) { - va_list valist_tmp; - int i = 0; - int j = 0; - int k = 0; - int ret = 0; - char *fmt = NULL; - char *buffer = NULL; - int num_format_chars = 0; - char format_char = '%'; - char *tmp1 = NULL; - char *tmp2 = NULL; - - ret = gf_asprintf (&tmp2, "%s", event); - if (ret == -1) +_do_slog_format(const char *event, va_list inp, char **msg) +{ + va_list valist_tmp; + int i = 0; + int j = 0; + int k = 0; + int ret = 0; + char *fmt = NULL; + char *buffer = NULL; + int num_format_chars = 0; + char format_char = '%'; + char *tmp1 = NULL; + char *tmp2 = NULL; + + ret = gf_asprintf(&tmp2, "%s", event); + if (ret == -1) + goto out; + + /* Hardcoded value for max key value pairs, exits early */ + /* from loop if found NULL */ + for (i = 0; i < GF_MAX_SLOG_PAIR_COUNT; i++) { + fmt = va_arg(inp, char *); + if (fmt == NULL) { + break; + } + + /* Get number of times % is used in input for formatting, */ + /* this count will be used to skip those many args from the */ + /* main list and will be used to format inner format */ + num_format_chars = 0; + for (k = 0; fmt[k] != '\0'; k++) { + /* If %% is used then that is escaped */ + if (fmt[k] == format_char && fmt[k + 1] == format_char) { + k++; + } else if (fmt[k] == format_char) { + num_format_chars++; + } + } + + tmp1 = gf_strdup(tmp2); + if (!tmp1) { + ret = -1; + goto out; + } + + GF_FREE(tmp2); + tmp2 = NULL; + + if (num_format_chars > 0) { + /* Make separate valist and format the string */ + va_copy(valist_tmp, inp); + ret = gf_vasprintf(&buffer, fmt, valist_tmp); + if (ret < 0) { + va_end(valist_tmp); goto out; + } + va_end(valist_tmp); - /* Hardcoded value for max key value pairs, exits early */ - /* from loop if found NULL */ - for (i = 0; i < GF_MAX_SLOG_PAIR_COUNT; i++) { - fmt = va_arg (inp, char*); - if (fmt == NULL) { - break; - } - - /* Get number of times % is used in input for formatting, */ - /* this count will be used to skip those many args from the */ - /* main list and will be used to format inner format */ - num_format_chars = 0; - for (k = 0; fmt[k] != '\0'; k++) { - /* If %% is used then that is escaped */ - if (fmt[k] == format_char && fmt[k+1] == format_char) { - k++; - } else if (fmt[k] == format_char) { - num_format_chars++; - } - } - - tmp1 = gf_strdup (tmp2); - if (!tmp1) { - ret = -1; - goto out; - } + for (j = 0; j < num_format_chars; j++) { + /* Skip the va_arg value since these values + are already used for internal formatting */ + (void)va_arg(inp, void *); + } - GF_FREE (tmp2); - tmp2 = NULL; - - if (num_format_chars > 0) { - /* Make separate valist and format the string */ - va_copy (valist_tmp, inp); - ret = gf_vasprintf (&buffer, fmt, valist_tmp); - if (ret < 0) { - va_end (valist_tmp); - goto out; - } - va_end (valist_tmp); - - for (j = 0; j < num_format_chars; j++) { - /* Skip the va_arg value since these values - are already used for internal formatting */ - (void) va_arg (inp, void*); - } - - ret = gf_asprintf (&tmp2, "%s\t%s", tmp1, buffer); - if (ret < 0) - goto out; - - GF_FREE (buffer); - buffer = NULL; - } else { - ret = gf_asprintf (&tmp2, "%s\t%s", tmp1, fmt); - if (ret < 0) - goto out; - } + ret = gf_asprintf(&tmp2, "%s\t%s", tmp1, buffer); + if (ret < 0) + goto out; - GF_FREE (tmp1); - tmp1 = NULL; + GF_FREE(buffer); + buffer = NULL; + } else { + ret = gf_asprintf(&tmp2, "%s\t%s", tmp1, fmt); + if (ret < 0) + goto out; } - *msg = gf_strdup (tmp2); - if (!*msg) - ret = -1; + GF_FREE(tmp1); + tmp1 = NULL; + } - out: - if (buffer) - GF_FREE (buffer); + *msg = gf_strdup(tmp2); + if (!*msg) + ret = -1; - if (tmp1) - GF_FREE (tmp1); +out: + if (buffer) + GF_FREE(buffer); - if (tmp2) - GF_FREE (tmp2); + if (tmp1) + GF_FREE(tmp1); - return ret; + if (tmp2) + GF_FREE(tmp2); + + return ret; } int -_gf_smsg (const char *domain, const char *file, const char *function, - int32_t line, gf_loglevel_t level, int errnum, int trace, - uint64_t msgid, const char *event, ...) +_gf_smsg(const char *domain, const char *file, const char *function, + int32_t line, gf_loglevel_t level, int errnum, int trace, + uint64_t msgid, const char *event, ...) { - va_list valist; - char *msg = NULL; - int ret = 0; + va_list valist; + char *msg = NULL; + int ret = 0; - va_start (valist, event); - ret = _do_slog_format (event, valist, &msg); - if (ret == -1) - goto out; + va_start(valist, event); + ret = _do_slog_format(event, valist, &msg); + if (ret == -1) + goto out; - ret = _gf_msg (domain, file, function, line, level, errnum, trace, - msgid, "%s", msg); + ret = _gf_msg(domain, file, function, line, level, errnum, trace, msgid, + "%s", msg); - out: - va_end (valist); - if (msg) - GF_FREE (msg); - return ret; +out: + va_end(valist); + if (msg) + GF_FREE(msg); + return ret; } int -_gf_slog (const char *domain, const char *file, const char *function, int line, - gf_loglevel_t level, const char *event, ...) +_gf_slog(const char *domain, const char *file, const char *function, int line, + gf_loglevel_t level, const char *event, ...) { - va_list valist; - char *msg = NULL; - int ret = 0; + va_list valist; + char *msg = NULL; + int ret = 0; - va_start (valist, event); - ret = _do_slog_format (event, valist, &msg); - if (ret == -1) - goto out; + va_start(valist, event); + ret = _do_slog_format(event, valist, &msg); + if (ret == -1) + goto out; - ret = _gf_log (domain, file, function, line, level, "%s", msg); + ret = _gf_log(domain, file, function, line, level, "%s", msg); - out: - va_end (valist); - if (msg) - GF_FREE (msg); - return ret; +out: + va_end(valist); + if (msg) + GF_FREE(msg); + return ret; } |