[PATCH] New debug backend "ringbuf"
Jeremy Allison
jra at samba.org
Mon Jan 9 19:17:53 UTC 2017
On Sun, Jan 08, 2017 at 04:59:09PM +0100, Ralph Böhme wrote:
> 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?
Oh this looks *really* useful ! Thanks. I'll try and review shortly..
> 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