[PATCH] Add lastpanic CLI command, dumping the last panic string
Tollef Fog Heen
tfheen at varnish-software.com
Thu Mar 10 13:37:56 CET 2011
---
bin/varnishd/cache_cli.c | 1 +
bin/varnishd/mgt_child.c | 31 +++++++++++++++++++++++++++++++
bin/varnishd/mgt_cli.c | 1 +
bin/varnishd/mgt_cli.h | 1 +
include/cli.h | 6 ++++++
5 files changed, 40 insertions(+), 0 deletions(-)
diff --git a/bin/varnishd/cache_cli.c b/bin/varnishd/cache_cli.c
index dae6af5..056a63c 100644
--- a/bin/varnishd/cache_cli.c
+++ b/bin/varnishd/cache_cli.c
@@ -1,6 +1,7 @@
/*-
* Copyright (c) 2006 Verdens Gang AS
* Copyright (c) 2006-2010 Redpill Linpro AS
+ * Copyright (c) 2011 Varnish Software AS
* All rights reserved.
*
* Author: Poul-Henning Kamp <phk at phk.freebsd.dk>
diff --git a/bin/varnishd/mgt_child.c b/bin/varnishd/mgt_child.c
index d8cbc59..02d2ff5 100644
--- a/bin/varnishd/mgt_child.c
+++ b/bin/varnishd/mgt_child.c
@@ -91,6 +91,8 @@ static struct vev *ev_poker;
static struct vev *ev_listen;
static struct vlu *vlu;
+static struct vsb *child_panic = NULL;
+
/*--------------------------------------------------------------------
* Track the highest file descriptor the parent knows is being used.
*
@@ -433,6 +435,24 @@ mgt_report_panic(pid_t r)
(intmax_t)r, vsm_head->panicstr);
}
+static void
+mgt_save_panic(void)
+{
+ char time_str[30];
+ if (vsm_head->panicstr[0] == '\0')
+ return;
+
+ if (child_panic)
+ vsb_delete(child_panic);
+ child_panic = vsb_newauto();
+ XXXAN(child_panic);
+ TIM_format(TIM_real(), time_str);
+ vsb_printf(child_panic, "Last panic at: %s\n", time_str);
+ vsb_printf(child_panic, "%s", vsm_head->panicstr);
+ vsb_finish(child_panic);
+ AZ(vsb_overflowed(child_panic));
+}
+
/*--------------------------------------------------------------------*/
static int
@@ -478,6 +498,7 @@ mgt_sigchld(const struct vev *e, int what)
vsb_delete(vsb);
mgt_report_panic(r);
+ mgt_save_panic();
child_pid = -1;
@@ -614,3 +635,13 @@ mcf_server_status(struct cli *cli, const char * const *av, void *priv)
(void)priv;
cli_out(cli, "Child in state %s", ch_state[child_state]);
}
+
+void
+mcf_lastpanic(struct cli *cli, const char * const *av, void *priv)
+{
+ (void)av;
+ (void)priv;
+
+ if (child_panic)
+ cli_out(cli, "%s\n", vsb_data(child_panic));
+}
diff --git a/bin/varnishd/mgt_cli.c b/bin/varnishd/mgt_cli.c
index 7f719a0..48b7295 100644
--- a/bin/varnishd/mgt_cli.c
+++ b/bin/varnishd/mgt_cli.c
@@ -127,6 +127,7 @@ static struct cli_proto cli_proto[] = {
{ CLI_VCL_SHOW, "", mcf_config_show, NULL },
{ CLI_PARAM_SHOW, "", mcf_param_show, NULL },
{ CLI_PARAM_SET, "", mcf_param_set, NULL },
+ { CLI_LASTPANIC, "", mcf_lastpanic, NULL },
{ NULL }
};
diff --git a/bin/varnishd/mgt_cli.h b/bin/varnishd/mgt_cli.h
index c4bfd5a..e3f61cc 100644
--- a/bin/varnishd/mgt_cli.h
+++ b/bin/varnishd/mgt_cli.h
@@ -32,6 +32,7 @@
/* mgt_child.c */
cli_func_t mcf_server_startstop;
cli_func_t mcf_server_status;
+cli_func_t mcf_lastpanic;
/* mgt_param.c */
cli_func_t mcf_param_show;
diff --git a/include/cli.h b/include/cli.h
index e16ff60..5dc5e80 100644
--- a/include/cli.h
+++ b/include/cli.h
@@ -230,6 +230,12 @@
"\tAuthenticate.", \
1, 1
+#define CLI_LASTPANIC \
+ "lastpanic", \
+ "lastpanic", \
+ "\tReturn the last panic, if any.", \
+ 0, 0
+
#define CLI_HIDDEN(foo, min_arg, max_arg) \
foo, NULL, NULL, min_arg, max_arg,
--
1.7.2.3
More information about the varnish-dev
mailing list