summaryrefslogtreecommitdiff
path: root/ctdb/server
diff options
context:
space:
mode:
authorMartin Schwenke <martin@meltin.net>2014-08-19 12:15:31 +1000
committerKarolin Seeger <kseeger@samba.org>2014-11-07 20:58:10 +0100
commit06b0deaf072239895e748f8d5f687c788cead6e2 (patch)
tree9135a313cbe8f1da76a547e5150f49ac58c50b5a /ctdb/server
parent2f59dd9893767d777893fde4053afe0b8ff587be (diff)
downloadsamba-06b0deaf072239895e748f8d5f687c788cead6e2.tar.gz
ctdb-logging: Update to use Samba style debug.h/debug.c
Samba's debug subsystem has changed a lot, so CTDB's logging needs to be rewritten to be compatible. The new debug.h/debug.c can't just be pulled in because it has some extra dependencies into Samba's lib/util. For now, to support the smallest possible patch, implement a minimal subset of Samba's debug.[ch] that just supports the DEBUG_CALLBACK logtype. Define a callback for each logging method. Check later to see if debug_extra (or similar) can somehow be implemented using debug classes. The timestamp on CTDB CLI tool and test program DEBUG() output goes away, so update the unit test code to cope. Signed-off-by: Martin Schwenke <martin@meltin.net> Reviewed-by: Volker Lendecke <vl@samba.org> (cherry picked from commit b4589b954e1090a934fafd3f8e3c2cf1ed785c61)
Diffstat (limited to 'ctdb/server')
-rw-r--r--ctdb/server/ctdb_logging.c77
1 files changed, 17 insertions, 60 deletions
diff --git a/ctdb/server/ctdb_logging.c b/ctdb/server/ctdb_logging.c
index 97cc3beda6f..3aba37b81d5 100644
--- a/ctdb/server/ctdb_logging.c
+++ b/ctdb/server/ctdb_logging.c
@@ -23,6 +23,7 @@
#include "system/syslog.h"
#include "system/time.h"
#include "system/filesys.h"
+#include "lib/util/debug.h"
struct syslog_message {
uint32_t level;
@@ -208,21 +209,15 @@ static struct ctdb_log_state *log_state;
/*
syslog logging function
*/
-static void ctdb_syslog_log(const char *format, va_list ap)
+static void ctdb_syslog_log(void *private_ptr, int dbglevel, const char *s)
{
struct syslog_message *msg;
int level = LOG_DEBUG;
- char *s = NULL;
- int len, ret;
+ int len;
int syslog_fd;
struct sockaddr_in syslog_sin;
- ret = vasprintf(&s, format, ap);
- if (ret == -1) {
- return;
- }
-
- switch (this_log_level) {
+ switch (dbglevel) {
case DEBUG_EMERG:
level = LOG_EMERG;
break;
@@ -252,7 +247,6 @@ static void ctdb_syslog_log(const char *format, va_list ap)
len = offsetof(struct syslog_message, message) + strlen(debug_extra) + strlen(s) + 1;
msg = malloc(len);
if (msg == NULL) {
- free(s);
return;
}
msg->level = level;
@@ -266,7 +260,6 @@ static void ctdb_syslog_log(const char *format, va_list ap)
syslog_fd = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP);
if (syslog_fd == -1) {
printf("Failed to create syslog socket\n");
- free(s);
free(msg);
return;
}
@@ -275,15 +268,14 @@ static void ctdb_syslog_log(const char *format, va_list ap)
syslog_sin.sin_port = htons(CTDB_PORT);
syslog_sin.sin_addr.s_addr = htonl(INADDR_LOOPBACK);
- ret = sendto(syslog_fd, msg, len, 0,
- (struct sockaddr *)&syslog_sin,
- sizeof(syslog_sin));
+ (void) sendto(syslog_fd, msg, len, 0,
+ (struct sockaddr *)&syslog_sin,
+ sizeof(syslog_sin));
/* no point in checking here since we cant log an error */
close(syslog_fd);
}
- free(s);
free(msg);
}
@@ -291,23 +283,14 @@ static void ctdb_syslog_log(const char *format, va_list ap)
/*
log file logging function
*/
-static void ctdb_logfile_log(const char *format, va_list ap)
+static void ctdb_logfile_log(void *private_ptr, int dbglevel, const char *s)
{
struct timeval t;
- char *s = NULL;
struct tm *tm;
char tbuf[100];
char *s2 = NULL;
int ret;
- ret = vasprintf(&s, format, ap);
- if (ret == -1) {
- const char *errstr = "vasprintf failed\n";
-
- sys_write(log_state->fd, errstr, strlen(errstr));
- return;
- }
-
t = timeval_current();
tm = localtime(&t.tv_sec);
@@ -316,7 +299,6 @@ static void ctdb_logfile_log(const char *format, va_list ap)
ret = asprintf(&s2, "%s.%06u [%s%5u]: %s",
tbuf, (unsigned)t.tv_usec,
debug_extra, (unsigned)getpid(), s);
- free(s);
if (ret == -1) {
const char *errstr = "asprintf failed\n";
sys_write(log_state->fd, errstr, strlen(errstr));
@@ -328,32 +310,12 @@ static void ctdb_logfile_log(const char *format, va_list ap)
}
}
-static void ctdb_logfile_log_add(const char *format, va_list ap)
-{
- char *s = NULL;
- int ret;
-
- ret = vasprintf(&s, format, ap);
- if (ret == -1) {
- const char *errstr = "vasprintf failed\n";
-
- sys_write(log_state->fd, errstr, strlen(errstr));
- return;
- }
-
- if (s) {
- sys_write(log_state->fd, s, strlen(s));
- free(s);
- }
-}
-
-
-
/*
choose the logfile location
*/
int ctdb_set_logfile(struct ctdb_context *ctdb, const char *logfile, bool use_syslog)
{
+ debug_callback_fn callback;
int ret;
ctdb->log = talloc_zero(ctdb, struct ctdb_log_state);
@@ -366,12 +328,10 @@ int ctdb_set_logfile(struct ctdb_context *ctdb, const char *logfile, bool use_sy
log_state = ctdb->log;
if (use_syslog) {
- do_debug_v = ctdb_syslog_log;
- do_debug_add_v = ctdb_syslog_log;
+ callback = ctdb_syslog_log;
ctdb->log->use_syslog = true;
} else if (logfile == NULL || strcmp(logfile, "-") == 0) {
- do_debug_v = ctdb_logfile_log;
- do_debug_add_v = ctdb_logfile_log_add;
+ callback = ctdb_logfile_log;
ctdb->log->fd = 1;
/* also catch stderr of subcommands to stdout */
ret = dup2(1, 2);
@@ -380,8 +340,7 @@ int ctdb_set_logfile(struct ctdb_context *ctdb, const char *logfile, bool use_sy
abort();
}
} else {
- do_debug_v = ctdb_logfile_log;
- do_debug_add_v = ctdb_logfile_log_add;
+ callback = ctdb_logfile_log;
ctdb->log->fd = open(logfile, O_WRONLY|O_APPEND|O_CREAT, 0666);
if (ctdb->log->fd == -1) {
@@ -390,6 +349,8 @@ int ctdb_set_logfile(struct ctdb_context *ctdb, const char *logfile, bool use_sy
}
}
+ debug_set_callback(NULL, callback);
+
return 0;
}
@@ -399,9 +360,9 @@ static void write_to_log(struct ctdb_log_state *log,
{
if (script_log_level <= DEBUGLEVEL) {
if (log != NULL && log->prefix != NULL) {
- do_debug("%s: %*.*s\n", log->prefix, len, len, buf);
+ dbgtext("%s: %*.*s\n", log->prefix, len, len, buf);
} else {
- do_debug("%*.*s\n", len, len, buf);
+ dbgtext("%*.*s\n", len, len, buf);
}
/* log it in the eventsystem as well */
if (log && log->logfn) {
@@ -435,8 +396,6 @@ static void ctdb_log_handler(struct event_context *ev, struct fd_event *fde,
return;
}
- this_log_level = script_log_level;
-
while (log->buf_used > 0 &&
(p = memchr(log->buf, '\n', log->buf_used)) != NULL) {
int n1 = (p - log->buf)+1;
@@ -462,7 +421,6 @@ static int log_context_destructor(struct ctdb_log_state *log)
{
/* Flush buffer in case it wasn't \n-terminated. */
if (log->buf_used > 0) {
- this_log_level = script_log_level;
write_to_log(log, log->buf, log->buf_used);
}
return 0;
@@ -629,8 +587,7 @@ static void ctdb_tevent_logging(void *private_data,
}
if (lvl <= DEBUGLEVEL) {
- this_log_level = lvl;
- do_debug_v(fmt, ap);
+ dbgtext(fmt, ap);
}
}