[PATCH] New debug backend "ringbuf"

Ralph Böhme slow at samba.org
Sun Jan 8 15:59:09 UTC 2017


On Sun, Jan 08, 2017 at 12:49:57PM +0100, Ralph Böhme wrote:
> On Sun, Jan 08, 2017 at 10:48:26AM +0100, Volker Lendecke wrote:
> > On Sun, Jan 08, 2017 at 10:08:53AM +0100, Ralph Böhme wrote:
> > > This one made my day when trying to fix a subtle bug in some asyc
> > > code in ctdbd_conn.c I'm currently working on. The bug was subject
> > > to timing effects, I could easily reproduce it at log level 1, but
> > > as soon as I cranked up log level it hid away. Arg.
> > > 
> > > I tried moving the logfile to a memdisk, but even with that, timings
> > > were different enough so I still couldn't reproduce it. Ahhhhhh...
> > > 
> > > That's when I thought of adding a new logging backend that simply
> > > writes all log messages into a memory buffer, et voila, with this I
> > > was able to reproduce the issue at log level 10. Bug found and
> > > fixed. :)
> > > 
> > > To make use of it when hunting for a bug, you must be able to
> > > identify a place in the codepath where you know things are gone
> > > south and you can cause a panic. You then attach with gdb to the
> > > panicked (and in developer mode sleeping process, otherwise grab the
> > > corefile) and run:
> > > 
> > > (gdb) dump binary memory samba.log debug_ringbuf debug_ringbuf+SIZE
> > > 
> > > The default size is 1 MB, but this can be changed by a backend
> > > option:
> > > 
> > >  logging = ringbuf:size=NBYTES
> > > 
> > > Fwiw, the ringbuffer is of course only allocated if the backend is
> > > used.
> > 
> > This looks really interesting. Question -- would you be fine if I
> > wrote a smbcontrol to grab the log, similar to for example pool-usage?
> 
> great idea! If you're not going to do it, I will. Let's see who's faster. :)

me. :)

Updated patchset attached. While I was at it I found it worthwhile improving
messaging.idl and pidl to use and add support for mixed with/without value
enums. What do you think?

Cheerio!
-slow
-------------- next part --------------
From 811fe48b7f1bd6a8982a21cc5848f5f56b7bbc05 Mon Sep 17 00:00:00 2001
From: Ralph Boehme <slow at samba.org>
Date: Sun, 8 Jan 2017 13:57:51 +0100
Subject: [PATCH 1/6] pidl: allow mixing enum entries with and without values

Signed-off-by: Ralph Boehme <slow at samba.org>
---
 pidl/lib/Parse/Pidl/Samba4/Header.pm | 18 +++++++++---------
 1 file changed, 9 insertions(+), 9 deletions(-)

diff --git a/pidl/lib/Parse/Pidl/Samba4/Header.pm b/pidl/lib/Parse/Pidl/Samba4/Header.pm
index e9b7bee..f73c30c 100644
--- a/pidl/lib/Parse/Pidl/Samba4/Header.pm
+++ b/pidl/lib/Parse/Pidl/Samba4/Header.pm
@@ -140,8 +140,7 @@ sub HeaderEnum($$;$)
 		pidl "\n";
 		pidl "#else\n";
 		my $count = 0;
-		my $with_val = 0;
-		my $without_val = 0;
+		my $fstr = "%d";
 		pidl " { __do_not_use_enum_$name=0x7FFFFFFF}\n";
 		foreach my $e (@{$enum->{ELEMENTS}}) {
 			my $t = "$e";
@@ -150,15 +149,16 @@ sub HeaderEnum($$;$)
 			if ($t =~ /(.*)=(.*)/) {
 				$name = $1;
 				$value = $2;
-				$with_val = 1;
-				fatal($e->{ORIGINAL}, "you can't mix enum member with values and without values!")
-					unless ($without_val == 0);
+				$count = oct($value) if $value =~ /^0/;
+				$count++;
+				if ($value =~ /^0x/) {
+					$fstr = "0x%x";
+				} else {
+					$fstr = "%d";
+				}
 			} else {
 				$name = $t;
-				$value = $count++;
-				$without_val = 1;
-				fatal($e->{ORIGINAL}, "you can't mix enum member with values and without values!")
-					unless ($with_val == 0);
+				$value = sprintf $fstr, $count++;
 			}
 			pidl "#define $name ( $value )\n";
 		}
-- 
2.7.4


From 691b9e8527c651f293bba67e4dd1b100d0bd1ab5 Mon Sep 17 00:00:00 2001
From: Ralph Boehme <slow at samba.org>
Date: Sun, 8 Jan 2017 13:59:05 +0100
Subject: [PATCH 2/6] messaging.idl: convert to automatic enum enumeration

Signed-off-by: Ralph Boehme <slow at samba.org>
---
 librpc/idl/messaging.idl | 148 +++++++++++++++++++++++------------------------
 1 file changed, 74 insertions(+), 74 deletions(-)

diff --git a/librpc/idl/messaging.idl b/librpc/idl/messaging.idl
index a54d13c..48f68c2 100644
--- a/librpc/idl/messaging.idl
+++ b/librpc/idl/messaging.idl
@@ -17,124 +17,124 @@ interface messaging
 
 		/* general messages */
 		MSG_DEBUG			= 0x0001,
-		MSG_PING			= 0x0002,
-		MSG_PONG			= 0x0003,
-		MSG_PROFILE			= 0x0004,
-		MSG_REQ_DEBUGLEVEL		= 0x0005,
-		MSG_DEBUGLEVEL			= 0x0006,
-		MSG_REQ_PROFILELEVEL		= 0x0007,
-		MSG_PROFILELEVEL		= 0x0008,
-		MSG_REQ_POOL_USAGE		= 0x0009,
-		MSG_POOL_USAGE			= 0x000A,
+		MSG_PING,
+		MSG_PONG,
+		MSG_PROFILE,
+		MSG_REQ_DEBUGLEVEL,
+		MSG_DEBUGLEVEL,
+		MSG_REQ_PROFILELEVEL,
+		MSG_PROFILELEVEL,
+		MSG_REQ_POOL_USAGE,
+		MSG_POOL_USAGE,
 
 		/* If dmalloc is included, set a steady-state mark */
-		MSG_REQ_DMALLOC_MARK		= 0x000B,
+		MSG_REQ_DMALLOC_MARK,
 
 		/* If dmalloc is included, dump to the dmalloc log a description of
 		 * what has changed since the last MARK */
-		MSG_REQ_DMALLOC_LOG_CHANGED	= 0x000C,
-		MSG_SHUTDOWN			= 0x000D,
+		MSG_REQ_DMALLOC_LOG_CHANGED,
+		MSG_SHUTDOWN,
 
-		/* ID_CACHE_FLUSH		= 0x000E, obsoleted */
-		ID_CACHE_DELETE			= 0x000F,
-		ID_CACHE_KILL			= 0x0010,
+		/* ID_CACHE_FLUSH obsoleted */
+		ID_CACHE_DELETE,
+		ID_CACHE_KILL,
 
 		/* Changes to smb.conf are really of general interest */
-		MSG_SMB_CONF_UPDATED		= 0x0021,
+		MSG_SMB_CONF_UPDATED,
 
-		MSG_PREFORK_CHILD_EVENT		= 0x0031,
-		MSG_PREFORK_PARENT_EVENT	= 0x0032,
+		MSG_PREFORK_CHILD_EVENT,
+		MSG_PREFORK_PARENT_EVENT,
 
 		/* nmbd messages */
 		MSG_FORCE_ELECTION		= 0x0101,
-		MSG_WINS_NEW_ENTRY		= 0x0102,
-		MSG_SEND_PACKET			= 0x0103,
+		MSG_WINS_NEW_ENTRY,
+		MSG_SEND_PACKET,
 
 		/* printing messages */
-		/* MSG_PRINTER_NOTIFY		= 0x2001,  Obsoleted */
-		MSG_PRINTER_NOTIFY2		= 0x0202,
-		MSG_PRINTER_DRVUPGRADE		= 0x0203,
-		MSG_PRINTERDATA_INIT_RESET	= 0x0204,
-		MSG_PRINTER_UPDATE		= 0x0205,
-		MSG_PRINTER_MOD			= 0x0206,
-		MSG_PRINTER_PCAP		= 0x0207,
+		/* MSG_PRINTER_NOTIFY obsoleted */
+		MSG_PRINTER_NOTIFY2		= 0x0201,
+		MSG_PRINTER_DRVUPGRADE,
+		MSG_PRINTERDATA_INIT_RESET,
+		MSG_PRINTER_UPDATE,
+		MSG_PRINTER_MOD,
+		MSG_PRINTER_PCAP,
 
 		/* smbd messages */
-		/* MSG_SMB_CONF_UPDATED		= 0x0301,  Obsoleted */
-		MSG_SMB_FORCE_TDIS		= 0x0302,
-		/* MSG_SMB_SAM_SYNC		= 0x0303,  Obsoleted */
-		/* MSG_SMB_SAM_REPL		= 0x0304,  Obsoleted */
-		MSG_SMB_UNLOCK			= 0x0305,
-		MSG_SMB_BREAK_REQUEST		= 0x0306,
-		/* MSG_SMB_BREAK_RESPONSE	= 0x0307,  Obsoleted */
-		/* MSG_SMB_ASYNC_LEVEL2_BREAK	= 0x0308,  Obsoleted */
-		/* MSG_SMB_OPEN_RETRY		= 0x0309,  Obsoleted */
-		MSG_SMB_KERNEL_BREAK		= 0x030A,
-		MSG_SMB_FILE_RENAME		= 0x030B,
-		MSG_SMB_INJECT_FAULT		= 0x030C,
-		MSG_SMB_BLOCKING_LOCK_CANCEL	= 0x030D,
-		MSG_SMB_NOTIFY			= 0x030E,
-		MSG_SMB_STAT_CACHE_DELETE	= 0x030F,
+		/* MSG_SMB_CONF_UPDATED obsoleted */
+		MSG_SMB_FORCE_TDIS		= 0x0301,
+		/* MSG_SMB_SAM_SYNC obsoleted */
+		/* MSG_SMB_SAM_REPL obsoleted */
+		MSG_SMB_UNLOCK,
+		MSG_SMB_BREAK_REQUEST,
+		/* MSG_SMB_BREAK_RESPONSE obsoleted */
+		/* MSG_SMB_ASYNC_LEVEL2_BREAK obsoleted */
+		/* MSG_SMB_OPEN_RETRY obsoleted */
+		MSG_SMB_KERNEL_BREAK,
+		MSG_SMB_FILE_RENAME,
+		MSG_SMB_INJECT_FAULT,
+		MSG_SMB_BLOCKING_LOCK_CANCEL,
+		MSG_SMB_NOTIFY,
+		MSG_SMB_STAT_CACHE_DELETE,
 
 		/* Samba4 compatibility */
-		MSG_PVFS_NOTIFY			= 0x0310,
+		MSG_PVFS_NOTIFY,
 
 		/* cluster reconfigure events */
-		MSG_SMB_BRL_VALIDATE		= 0x0311,
+		MSG_SMB_BRL_VALIDATE,
 
 		/*Close a specific file given a share entry. */
-		MSG_SMB_CLOSE_FILE		= 0x0313,
+		MSG_SMB_CLOSE_FILE,
 
 		/* Trigger a notify cleanup run */
-		MSG_SMB_NOTIFY_CLEANUP		= 0x0314,
-		MSG_SMB_SCAVENGER		= 0x0315,
+		MSG_SMB_NOTIFY_CLEANUP,
+		MSG_SMB_SCAVENGER,
 
 		/* shutdown connection for given client */
-		MSG_SMB_KILL_CLIENT_IP		= 0x0316,
+		MSG_SMB_KILL_CLIENT_IP,
 
 		/* Tell number of child processes */
-		MSG_SMB_TELL_NUM_CHILDREN       = 0x0317,
-		MSG_SMB_NUM_CHILDREN            = 0x0318,
+		MSG_SMB_TELL_NUM_CHILDREN,
+		MSG_SMB_NUM_CHILDREN,
 
 		/* Cancel a notify, directory got deleted */
-		MSG_SMB_NOTIFY_CANCEL_DELETED   = 0x0319,
+		MSG_SMB_NOTIFY_CANCEL_DELETED,
 
 		/* notifyd messages */
-		MSG_SMB_NOTIFY_REC_CHANGE	= 0x031A,
-		MSG_SMB_NOTIFY_TRIGGER		= 0x031B,
-		MSG_SMB_NOTIFY_GET_DB		= 0x031C,
-		MSG_SMB_NOTIFY_DB		= 0x031D,
-		MSG_SMB_NOTIFY_REC_CHANGES	= 0x031E,
-		MSG_SMB_NOTIFY_STARTED          = 0x031F,
+		MSG_SMB_NOTIFY_REC_CHANGE,
+		MSG_SMB_NOTIFY_TRIGGER,
+		MSG_SMB_NOTIFY_GET_DB,
+		MSG_SMB_NOTIFY_DB,
+		MSG_SMB_NOTIFY_REC_CHANGES,
+		MSG_SMB_NOTIFY_STARTED,
 
 		/* winbind messages */
 		MSG_WINBIND_FINISHED		= 0x0401,
-		MSG_WINBIND_FORGET_STATE	= 0x0402,
-		MSG_WINBIND_ONLINE		= 0x0403,
-		MSG_WINBIND_OFFLINE		= 0x0404,
-		MSG_WINBIND_ONLINESTATUS	= 0x0405,
-		MSG_WINBIND_TRY_TO_GO_ONLINE	= 0x0406,
-		MSG_WINBIND_FAILED_TO_GO_ONLINE = 0x0407,
-		MSG_WINBIND_VALIDATE_CACHE	= 0x0408,
-		MSG_WINBIND_DUMP_DOMAIN_LIST	= 0x0409,
-		MSG_WINBIND_IP_DROPPED		= 0x040A,
-		MSG_WINBIND_DOMAIN_ONLINE	= 0x040B,
-		MSG_WINBIND_DOMAIN_OFFLINE	= 0x040C,
-		MSG_WINBIND_NEW_TRUSTED_DOMAIN	= 0x040D,
+		MSG_WINBIND_FORGET_STATE,
+		MSG_WINBIND_ONLINE,
+		MSG_WINBIND_OFFLINE,
+		MSG_WINBIND_ONLINESTATUS,
+		MSG_WINBIND_TRY_TO_GO_ONLINE,
+		MSG_WINBIND_FAILED_TO_GO_ONLINE,
+		MSG_WINBIND_VALIDATE_CACHE,
+		MSG_WINBIND_DUMP_DOMAIN_LIST,
+		MSG_WINBIND_IP_DROPPED,
+		MSG_WINBIND_DOMAIN_ONLINE,
+		MSG_WINBIND_DOMAIN_OFFLINE,
+		MSG_WINBIND_NEW_TRUSTED_DOMAIN,
 
 		/* event messages */
 		MSG_DUMP_EVENT_LIST		= 0x0500,
 
 		/* smbXsrv messages */
 		MSG_SMBXSRV_SESSION_CLOSE	= 0x0600,
-		MSG_SMBXSRV_CONNECTION_PASS	= 0x0601,
+		MSG_SMBXSRV_CONNECTION_PASS,
 
 		/* source4 and NTVFS smb server messages */
 		MSG_BRL_RETRY                   = 0x0700,
-		MSG_PVFS_RETRY_OPEN             = 0x0701,
-		MSG_IRPC                        = 0x0702,
-		MSG_NTVFS_OPLOCK_BREAK          = 0x0703,
-		MSG_DREPL_ALLOCATE_RID          = 0x0704,
+		MSG_PVFS_RETRY_OPEN,
+		MSG_IRPC,
+		MSG_NTVFS_OPLOCK_BREAK,
+		MSG_DREPL_ALLOCATE_RID,
 
 		/* dbwrap messages 4001-4999 (0x0FA0 - 0x1387) */
 		/* MSG_DBWRAP_TDB2_CHANGES		= 4001, */
-- 
2.7.4


From 6c2c80449a1b073c74ec95152575f692b02047f7 Mon Sep 17 00:00:00 2001
From: Ralph Boehme <slow at samba.org>
Date: Sat, 7 Jan 2017 19:34:46 +0100
Subject: [PATCH 3/6] debug: parse, store and pass backend option

Will be used in the next commit by new "ringbuf" backend.

Signed-off-by: Ralph Boehme <slow at samba.org>
---
 lib/util/debug.c | 24 +++++++++++++++---------
 1 file changed, 15 insertions(+), 9 deletions(-)

diff --git a/lib/util/debug.c b/lib/util/debug.c
index 37582db..5ce3325 100644
--- a/lib/util/debug.c
+++ b/lib/util/debug.c
@@ -149,7 +149,7 @@ static void debug_file_log(int msg_level,
 
 #ifdef WITH_SYSLOG
 static void debug_syslog_reload(bool enabled, bool previously_enabled,
-				const char *prog_name)
+				const char *prog_name, char *option)
 {
 	if (enabled && !previously_enabled) {
 #ifdef LOG_DAEMON
@@ -207,7 +207,7 @@ static void debug_lttng_log(int msg_level,
 #ifdef HAVE_GPFS
 #include "gpfswrap.h"
 static void debug_gpfs_reload(bool enabled, bool previously_enabled,
-			      const char *prog_name)
+			      const char *prog_name, char *option)
 {
 	gpfswrap_init();
 
@@ -240,8 +240,10 @@ static struct debug_backend {
 	const char *name;
 	int log_level;
 	int new_log_level;
-	void (*reload)(bool enabled, bool prev_enabled, const char *prog_name);
+	void (*reload)(bool enabled, bool prev_enabled,
+		       const char *prog_name, char *option);
 	void (*log)(int msg_level, const char *msg, const char *msg_no_nl);
+	char *option;
 } debug_backends[] = {
 	{
 		.name = "file",
@@ -297,6 +299,7 @@ static struct debug_backend *debug_find_backend(const char *name)
 static void debug_backend_parse_token(char *tok)
 {
 	char *backend_name_option, *backend_name,*backend_level, *saveptr;
+	char *backend_option;
 	struct debug_backend *b;
 
 	/*
@@ -317,12 +320,7 @@ static void debug_backend_parse_token(char *tok)
 		return;
 	}
 
-	/*
-	 * No backend is using the option yet.
-	 */
-#if 0
 	backend_option = strtok_r(NULL, "\0", &saveptr);
-#endif
 
 	/*
 	 * Find and update backend
@@ -337,6 +335,13 @@ static void debug_backend_parse_token(char *tok)
 	} else {
 		b->new_log_level = atoi(backend_level);
 	}
+
+	if (backend_option != NULL) {
+		b->option = strdup(backend_option);
+		if (b->option == NULL) {
+			return;
+		}
+	}
 }
 
 /*
@@ -380,7 +385,8 @@ static void debug_set_backends(const char *param)
 			bool enabled = b->new_log_level > -1;
 			bool previously_enabled = b->log_level > -1;
 
-			b->reload(enabled, previously_enabled, state.prog_name);
+			b->reload(enabled, previously_enabled, state.prog_name,
+				  b->option);
 		}
 		b->log_level = b->new_log_level;
 	}
-- 
2.7.4


From 758a1494ec545564a973be8f0f937049ca974c1e Mon Sep 17 00:00:00 2001
From: Ralph Boehme <slow at samba.org>
Date: Sat, 7 Jan 2017 14:36:24 +0100
Subject: [PATCH 4/6] debug: add "ringbuf" backend logging to a ringbuffer

This is useful for debugging bugs that involve timing effects and are
not reproducible when logging at higher debug levels with the file
backend.

The log can be dumped to a file with gdb:

(gdb) dump binary memory samba.log debug_ringbuf debug_ringbuf+SIZE

Signed-off-by: Ralph Boehme <slow at samba.org>
---
 docs-xml/smbdotconf/logging/logging.xml |  5 +++
 lib/util/debug.c                        | 72 +++++++++++++++++++++++++++++++++
 lib/util/debug.h                        |  3 ++
 3 files changed, 80 insertions(+)

diff --git a/docs-xml/smbdotconf/logging/logging.xml b/docs-xml/smbdotconf/logging/logging.xml
index 8524884..b152d0c 100644
--- a/docs-xml/smbdotconf/logging/logging.xml
+++ b/docs-xml/smbdotconf/logging/logging.xml
@@ -31,8 +31,13 @@
     <listitem><para><parameter moreinfo="none">systemd</parameter></para></listitem>
     <listitem><para><parameter moreinfo="none">lttng</parameter></para></listitem>
     <listitem><para><parameter moreinfo="none">gpfs</parameter></para></listitem>
+    <listitem><para><parameter moreinfo="none">ringbuf</parameter></para></listitem>
   </itemizedlist>
 
+  <para>The <parameter moreinfo="none">ringbuf</parameter> backend supports an
+  optional size argument to change the buffer size used, the default is 1 MB:
+  <parameter moreinfo="none">ringbuf:size=NBYTES</parameter></para>
+
 </description>
 <value type="default"></value>
 <value type="example">syslog at 1 file</value>
diff --git a/lib/util/debug.c b/lib/util/debug.c
index 5ce3325..87f18bf 100644
--- a/lib/util/debug.c
+++ b/lib/util/debug.c
@@ -236,6 +236,73 @@ static void debug_gpfs_log(int msg_level,
 }
 #endif /* HAVE_GPFS */
 
+#define DEBUG_RINGBUF_SIZE (1024 * 1024)
+#define DEBUG_RINGBUF_SIZE_OPT "size="
+
+static char *debug_ringbuf;
+static size_t debug_ringbuf_size;
+static size_t debug_ringbuf_ofs;
+
+char *debug_get_ringbuf(void)
+{
+	return debug_ringbuf;
+}
+
+size_t debug_get_ringbuf_size(void)
+{
+	return debug_ringbuf_size;
+}
+
+static void debug_ringbuf_reload(bool enabled, bool previously_enabled,
+				 const char *prog_name, char *option)
+{
+	bool cmp;
+	size_t optlen = strlen(DEBUG_RINGBUF_SIZE_OPT);
+
+	debug_ringbuf_size = DEBUG_RINGBUF_SIZE;
+	debug_ringbuf_ofs = 0;
+
+	if (debug_ringbuf != NULL) {
+		free(debug_ringbuf);
+		debug_ringbuf = NULL;
+	}
+
+	if (!enabled) {
+		return;
+	}
+
+	if (option != NULL) {
+		cmp = strncmp(option, DEBUG_RINGBUF_SIZE_OPT, optlen);
+		if (cmp == 0) {
+			debug_ringbuf_size = (size_t)strtoull(
+				option + optlen, NULL, 10);
+		}
+	}
+
+	debug_ringbuf = calloc(debug_ringbuf_size + 1, sizeof(char));
+	if (debug_ringbuf == NULL) {
+		return;
+	}
+}
+
+static void debug_ringbuf_log(int msg_level,
+			      const char *msg,
+			      const char *msg_no_nl)
+{
+	size_t msglen = strlen(msg);
+
+	if (debug_ringbuf == NULL) {
+		return;
+	}
+
+	if (msglen + debug_ringbuf_ofs >= debug_ringbuf_size) {
+		debug_ringbuf_ofs = 0;
+	}
+
+	memcpy(debug_ringbuf + debug_ringbuf_ofs, msg, msglen);
+	debug_ringbuf_ofs += msglen;
+}
+
 static struct debug_backend {
 	const char *name;
 	int log_level;
@@ -278,6 +345,11 @@ static struct debug_backend {
 		.log = debug_gpfs_log,
 	},
 #endif
+	{
+		.name = "ringbuf",
+		.log = debug_ringbuf_log,
+		.reload = debug_ringbuf_reload,
+	},
 };
 
 static struct debug_backend *debug_find_backend(const char *name)
diff --git a/lib/util/debug.h b/lib/util/debug.h
index b50bf50..43c6aa0 100644
--- a/lib/util/debug.h
+++ b/lib/util/debug.h
@@ -287,4 +287,7 @@ typedef void (*debug_callback_fn)(void *private_ptr, int level, const char *msg)
  */
 void debug_set_callback(void *private_ptr, debug_callback_fn fn);
 
+char *debug_get_ringbuf(void);
+size_t debug_get_ringbuf_size(void);
+
 #endif /* _SAMBA_DEBUG_H */
-- 
2.7.4


From 4407dc100ae26231ee89bfadfdb7c3448929ec82 Mon Sep 17 00:00:00 2001
From: Ralph Boehme <slow at samba.org>
Date: Sun, 8 Jan 2017 14:08:27 +0100
Subject: [PATCH 5/6] s3/debug: listen for MSG_REQ_RINGBUF_LOG messaging
 requests

Signed-off-by: Ralph Boehme <slow at samba.org>
---
 lib/util/debug_s3.c      | 21 +++++++++++++++++++++
 librpc/idl/messaging.idl |  2 ++
 2 files changed, 23 insertions(+)

diff --git a/lib/util/debug_s3.c b/lib/util/debug_s3.c
index 98e7b00..1367d16 100644
--- a/lib/util/debug_s3.c
+++ b/lib/util/debug_s3.c
@@ -21,6 +21,7 @@
 #include "includes.h"
 #include "librpc/gen_ndr/messaging.h"
 #include "messages.h"
+#include "lib/util/memory.h"
 
 /* This is the Samba3-specific implementation of reopen_logs(), which
  * calls out to the s3 loadparm code, and means that we don't depend
@@ -98,9 +99,29 @@ static void debuglevel_message(struct messaging_context *msg_ctx,
 
 	TALLOC_FREE(message);
 }
+
+static void debug_ringbuf_log(struct messaging_context *msg_ctx,
+			      void *private_data,
+			      uint32_t msg_type,
+			      struct server_id src,
+			      DATA_BLOB *data)
+{
+	char *log = debug_get_ringbuf();
+	size_t logsize = debug_get_ringbuf_size() + 1;
+
+	if (log == NULL) {
+		log = discard_const_p(char, "*disabled*\n");
+		logsize = strlen("*disabled*\n") + 1;
+	}
+
+	messaging_send_buf(msg_ctx, src, MSG_RINGBUF_LOG, (uint8_t *)log, logsize);
+}
+
 void debug_register_msgs(struct messaging_context *msg_ctx)
 {
 	messaging_register(msg_ctx, NULL, MSG_DEBUG, debug_message);
 	messaging_register(msg_ctx, NULL, MSG_REQ_DEBUGLEVEL,
 			   debuglevel_message);
+	messaging_register(msg_ctx, NULL, MSG_REQ_RINGBUF_LOG,
+			   debug_ringbuf_log);
 }
diff --git a/librpc/idl/messaging.idl b/librpc/idl/messaging.idl
index 48f68c2..c47d41d 100644
--- a/librpc/idl/messaging.idl
+++ b/librpc/idl/messaging.idl
@@ -26,6 +26,8 @@ interface messaging
 		MSG_PROFILELEVEL,
 		MSG_REQ_POOL_USAGE,
 		MSG_POOL_USAGE,
+		MSG_REQ_RINGBUF_LOG,
+		MSG_RINGBUF_LOG,
 
 		/* If dmalloc is included, set a steady-state mark */
 		MSG_REQ_DMALLOC_MARK,
-- 
2.7.4


From 7f84362048261864aa0129777e6c10106edb9499 Mon Sep 17 00:00:00 2001
From: Ralph Boehme <slow at samba.org>
Date: Sun, 8 Jan 2017 16:47:30 +0100
Subject: [PATCH 6/6] smbcontrol: add ringbuf-log

Signed-off-by: Ralph Boehme <slow at samba.org>
---
 docs-xml/manpages/smbcontrol.1.xml |  7 +++++++
 source3/utils/smbcontrol.c         | 43 ++++++++++++++++++++++++++++++++++++++
 2 files changed, 50 insertions(+)

diff --git a/docs-xml/manpages/smbcontrol.1.xml b/docs-xml/manpages/smbcontrol.1.xml
index ebbb8dc..e9a3acf 100644
--- a/docs-xml/manpages/smbcontrol.1.xml
+++ b/docs-xml/manpages/smbcontrol.1.xml
@@ -257,6 +257,13 @@
 	</varlistentry>
 
 	<varlistentry>
+	<term>ringbuf-log</term>
+	<listitem><para>Fetch and print the ringbuf log. Requires
+	<parameter>logging = ringbuf</parameter>. Available for smbd, winbindd
+	and nmbd.</para></listitem>
+	</varlistentry>
+
+	<varlistentry>
 	<term>drvupgrade</term>
 	<listitem><para>Force clients of printers using specified driver 
 	to update their local version of the driver. Can only be 
diff --git a/source3/utils/smbcontrol.c b/source3/utils/smbcontrol.c
index ad602b3..595fffa 100644
--- a/source3/utils/smbcontrol.c
+++ b/source3/utils/smbcontrol.c
@@ -886,6 +886,48 @@ static bool do_poolusage(struct tevent_context *ev_ctx,
 	return num_replies;
 }
 
+/* Fetch and print the ringbuf log */
+
+static void print_ringbuf_log_cb(struct messaging_context *msg,
+				 void *private_data,
+				 uint32_t msg_type,
+				 struct server_id pid,
+				 DATA_BLOB *data)
+{
+	printf("%s", (const char *)data->data);
+	num_replies++;
+}
+
+static bool do_ringbuflog(struct tevent_context *ev_ctx,
+			  struct messaging_context *msg_ctx,
+			  const struct server_id pid,
+			  const int argc, const char **argv)
+{
+	if (argc != 1) {
+		fprintf(stderr, "Usage: smbcontrol <dest> ringbuf-log\n");
+		return False;
+	}
+
+	messaging_register(msg_ctx, NULL, MSG_RINGBUF_LOG, print_ringbuf_log_cb);
+
+	/* Send a message and register our interest in a reply */
+
+	if (!send_message(msg_ctx, pid, MSG_REQ_RINGBUF_LOG, NULL, 0))
+		return False;
+
+	wait_replies(ev_ctx, msg_ctx, procid_to_pid(&pid) == 0);
+
+	/* No replies were received within the timeout period */
+
+	if (num_replies == 0) {
+		printf("No replies received\n");
+	}
+
+	messaging_deregister(msg_ctx, MSG_RINGBUF_LOG, NULL);
+
+	return num_replies;
+}
+
 /* Perform a dmalloc mark */
 
 static bool do_dmalloc_mark(struct tevent_context *ev_ctx,
@@ -1385,6 +1427,7 @@ static const struct {
 	{ "lockretry", do_lockretry, "Force a blocking lock retry" },
 	{ "brl-revalidate", do_brl_revalidate, "Revalidate all brl entries" },
 	{ "pool-usage", do_poolusage, "Display talloc memory usage" },
+	{ "ringbuf-log", do_ringbuflog, "Display ringbuf log" },
 	{ "dmalloc-mark", do_dmalloc_mark, "" },
 	{ "dmalloc-log-changed", do_dmalloc_changed, "" },
 	{ "shutdown", do_shutdown, "Shut down daemon" },
-- 
2.7.4



More information about the samba-technical mailing list