From 99a304bc175ebccf60af52911a71920c57a7f8fb Mon Sep 17 00:00:00 2001 From: Petr Rockai Date: Mon, 30 Nov 2009 17:17:11 +0000 Subject: [PATCH] Optionally abort on internal errors (and leverage this option in the testsuite). (This is showing a problem in the pvmove test for me, so I expect the tests to start failing -- this needs to be fixed separately though.) --- doc/example.conf | 4 ++++ lib/commands/toolcontext.c | 4 +++- lib/config/defaults.h | 1 + lib/log/log.c | 15 +++++++++++++++ lib/log/lvm-logging.h | 1 + test/test-utils.sh | 3 ++- 6 files changed, 26 insertions(+), 2 deletions(-) diff --git a/doc/example.conf b/doc/example.conf index 1067665da..fb0f59ad2 100644 --- a/doc/example.conf +++ b/doc/example.conf @@ -316,6 +316,10 @@ global { # The external locking library to load if locking_type is set to 2. # locking_library = "liblvm2clusterlock.so" + + # Treat any internal errors as fatal errors, aborting the process that + # encountered the internal error. Please only enable for debugging. + abort_on_internal_errors = 0 } activation { diff --git a/lib/commands/toolcontext.c b/lib/commands/toolcontext.c index 80b6f8f03..bb3e5d21d 100644 --- a/lib/commands/toolcontext.c +++ b/lib/commands/toolcontext.c @@ -147,7 +147,9 @@ static void _init_logging(struct cmd_context *cmd) /* Log message formatting */ init_indent(find_config_tree_int(cmd, "log/indent", - DEFAULT_INDENT)); + DEFAULT_INDENT)); + init_abort_on_internal_errors(find_config_tree_int(cmd, "global/abort_on_internal_errors", + DEFAULT_ABORT_ON_INTERNAL_ERRORS)); cmd->default_settings.msg_prefix = find_config_tree_str(cmd, "log/prefix", diff --git a/lib/config/defaults.h b/lib/config/defaults.h index c4a23a42f..a4e8d09f4 100644 --- a/lib/config/defaults.h +++ b/lib/config/defaults.h @@ -85,6 +85,7 @@ #define DEFAULT_VERBOSE 0 #define DEFAULT_LOGLEVEL 0 #define DEFAULT_INDENT 1 +#define DEFAULT_ABORT_ON_INTERNAL_ERRORS 0 #define DEFAULT_UNITS "h" #define DEFAULT_SUFFIX 1 #define DEFAULT_HOSTTAGS 0 diff --git a/lib/log/log.c b/lib/log/log.c index 1a7da4634..5cc83ab6b 100644 --- a/lib/log/log.c +++ b/lib/log/log.c @@ -19,6 +19,7 @@ #include "lvm-string.h" #include "lvm-file.h" #include "defaults.h" +#include "config.h" #include #include @@ -35,6 +36,7 @@ static int _indent = 1; static int _log_suppress = 0; static char _msg_prefix[30] = " "; static int _already_logging = 0; +static int _abort_on_internal_errors = 0; static lvm2_log_fn_t _lvm2_log_fn = NULL; @@ -140,6 +142,11 @@ void init_indent(int indent) _indent = indent; } +void init_abort_on_internal_errors(int fatal) +{ + _abort_on_internal_errors = fatal; +} + void reset_lvm_errno(int store_errmsg) { _lvm_errno = 0; @@ -172,9 +179,14 @@ void print_log(int level, const char *file, int line, int dm_errno, const char *trformat; /* Translated format string */ char *newbuf; int use_stderr = level & _LOG_STDERR; + int internal_error = 0; level &= ~_LOG_STDERR; + if (!strncmp(format, "Internal error:", + strlen("Internal error:"))) + internal_error = 1; + if (_log_suppress == 2) return; @@ -291,6 +303,9 @@ void print_log(int level, const char *file, int line, int dm_errno, va_end(ap); } + if (internal_error && _abort_on_internal_errors) + abort(); + if (level > debug_level()) return; diff --git a/lib/log/lvm-logging.h b/lib/log/lvm-logging.h index 560f06020..838dc1f2e 100644 --- a/lib/log/lvm-logging.h +++ b/lib/log/lvm-logging.h @@ -39,6 +39,7 @@ void init_msg_prefix(const char *prefix); void init_log_file(const char *log_file, int append); void init_log_direct(const char *log_file, int append); void init_log_while_suspended(int log_while_suspended); +void init_abort_on_internal_errors(int fatal); void fin_log(void); void release_log_memory(void); diff --git a/test/test-utils.sh b/test/test-utils.sh index fa1f2c5fb..d339a79e8 100644 --- a/test/test-utils.sh +++ b/test/test-utils.sh @@ -199,8 +199,9 @@ prepare_lvmconf() { archive = 0 } global { + abort_on_internal_errors = 1 library_dir = "$G_root_/lib" - locking_dir = "$G_root_/var/lock/lvm" + locking_dir = "$G_root_/var/lock/lvm" } EOF }