On 03/03/2014 12:18 PM, Daniel P. Berrange wrote:
A earlier commit changed the global log buffer so that it only
records messages that are explicitly requested via the log
filters setting. This removes the performance burden, and
improves the signal/noise ratio for messages in the global
buffer. At the same time though, it is somewhat pointless, since
all the recorded log messages are already going to be sent to an
explicit log output like syslog, stderr or the journal. The
global log buffer is thus just duplicating this data on stderr
upon crash.
I still wonder if there is value on keeping the ring buffer for when
logging is not stderr. That is, if we dump to syslog by default but
ALSO dump the ring buffer to stderr, it may be easier to find what got
logged by reading stderr rather than having to hunt for the syslog. But
that's a weak argument.
If we commit to patch 1, then the logging ring really is duplicated
overhead, and I'm fine ditching it. You may want to get DV's opinion,
but I'm fine with this patch going in on the premise that patch 1 made
sense.
On the other hand, if patch 1 meets resistance, should we look at ways
to minimize printf() overhead? For example, a LOT of our overhead is
tied to the fact that we malloc() a lot when constructing the log
string. It may be possible to fine-tune things so that most (if not
all) log messages get computed into a static buffer (gnulib's asnprintf
is cool in how it avoids malloc in the common case if you provide a
large enough buffer, while still being robust to larger strings). It
won't kill as much overhead as what you killed by completely ditching
the ring buffer, but may still be enough improvement to merit keeping
the ring buffer around.
I'm not tied to the ring buffer - I still think that targetted logging
is easier to sift through than the signal-to-noise ratio of a ring
buffer dump. I'm just raising the question to make sure we think of the
issues before applying patch 1 and losing what might still be a useful
last-ditch debug aid for hard-to-reproduce crashes.
Signed-off-by: Daniel P. Berrange <berrange(a)redhat.com>
---
daemon/libvirtd-config.c | 3 -
daemon/libvirtd-config.h | 1 -
daemon/libvirtd.aug | 1 -
daemon/libvirtd.c | 2 -
daemon/libvirtd.conf | 7 -
daemon/test_libvirtd.aug.in | 1 -
docs/logging.html.in | 10 --
src/locking/lock_daemon.c | 2 -
src/locking/lock_daemon_config.c | 2 -
src/locking/lock_daemon_config.h | 1 -
src/locking/test_virtlockd.aug.in | 2 -
src/locking/virtlockd.aug | 1 -
src/locking/virtlockd.conf | 7 -
src/rpc/virnetserver.c | 45 -------
src/util/virlog.c | 264 +-------------------------------------
src/util/virlog.h | 2 -
16 files changed, 3 insertions(+), 348 deletions(-)
Wow - quite a lot tied up in the log ring buffer.
@@ -431,7 +429,6 @@ daemonConfigLoadOptions(struct daemonConfig
*data,
GET_CONF_INT(conf, filename, log_level);
GET_CONF_STR(conf, filename, log_filters);
GET_CONF_STR(conf, filename, log_outputs);
- GET_CONF_INT(conf, filename, log_buffer_size);
Does augeas gracefully handle an option that is no longer used by
current libvirtd, but which mattered to older versions? That is, I
think you still have to support the option in the .conf file, and
document that it is now ignored, but guarantee that having it in the
.conf file doesn't cause a syntax error.
+++ b/daemon/libvirtd.aug
@@ -64,7 +64,6 @@ module Libvirtd =
let logging_entry = int_entry "log_level"
| str_entry "log_filters"
| str_entry "log_outputs"
- | int_entry "log_buffer_size"
That is, I don't think you can safely delete this line.
+++ b/daemon/libvirtd.conf
@@ -345,13 +345,6 @@
#log_outputs="3:syslog:libvirtd"
#
-# Log debug buffer size: default 64
-# The daemon keeps an internal debug log buffer which will be dumped in case
-# of crash or upon receiving a SIGUSR2 signal. This setting allows to override
-# the default buffer size in kilobytes.
-# If value is 0 or less the debug log buffer is deactivated
-#log_buffer_size = 64
And that you may need to mention that this variable is present but
ignored for backward compatibility, rather than deleting it altogether.
+++ b/src/locking/virtlockd.aug
@@ -27,7 +27,6 @@ module Virtlockd =
let logging_entry = int_entry "log_level"
| str_entry "log_filters"
| str_entry "log_outputs"
- | int_entry "log_buffer_size"
| int_entry "max_clients"
Same story.
-static void
-virNetServerFatalSignal(int sig, siginfo_t *siginfo ATTRIBUTE_UNUSED,
- void *context ATTRIBUTE_UNUSED)
-{
- struct sigaction sig_action;
- int origerrno;
-
- origerrno = errno;
- virLogEmergencyDumpAll(sig);
We may not be dumping the ring buffer any more, but I _still_ think it's
worth keeping this signal handler and dumping a message that we detected
a fatal crash, as well as pointing the user to go read the contents of
the logging files (and/or rerun libvirtd with more logging enabled). In
other words, delete the ring buffer, but DON'T delete this last-ditch
message to the user.
@@ -412,23 +384,6 @@ virNetServerPtr virNetServerNew(size_t
min_workers,
sig_action.sa_handler = SIG_IGN;
sigaction(SIGPIPE, &sig_action, NULL);
- /*
- * catch fatal errors to dump a log, also hook to USR2 for dynamic
- * debugging purposes or testing
Deleting USR2 handling makes sense, though.
-/**
- * virLogEmergencyDumpAll:
- * @signum: the signal number
- *
- * Emergency function called, possibly from a signal handler.
- * It need to output the debug ring buffer through the log
- * output which are safe to use from a signal handler.
- * In case none is found it is emitted to standard error.
- */
-void
-virLogEmergencyDumpAll(int signum)
-{
Again, I still think this function is useful - not to dump the ring
buffer, but to mention that we are going down and to check the logs and
give an address where to report the bug.
--
Eric Blake eblake redhat com +1-919-301-3266
Libvirt virtualization library
http://libvirt.org