diff options
author | Zdenek Kabelac <zkabelac@redhat.com> | 2015-10-29 11:52:11 +0100 |
---|---|---|
committer | Zdenek Kabelac <zkabelac@redhat.com> | 2015-10-29 12:14:20 +0100 |
commit | 099466939e4d6bdbe4b105f6b052dee6fc99b9d4 (patch) | |
tree | 72031013def3fa4db8e5d41b2e0ba407cf06da15 | |
parent | b3c81d02c974eda1c33afd88517d899e64aea24e (diff) | |
download | lvm2-099466939e4d6bdbe4b105f6b052dee6fc99b9d4.tar.gz |
thin: dmeventd plugin check number of failures
If plugin's lvm command execution fails too often (>10 times),
there is no point to torture system more then necessary, just log
and drop monitoring in this case.
-rw-r--r-- | WHATS_NEW_DM | 1 | ||||
-rw-r--r-- | daemons/dmeventd/plugins/thin/dmeventd_thin.c | 19 |
2 files changed, 17 insertions, 3 deletions
diff --git a/WHATS_NEW_DM b/WHATS_NEW_DM index 961aec5ef..63cb2cc80 100644 --- a/WHATS_NEW_DM +++ b/WHATS_NEW_DM @@ -1,5 +1,6 @@ Version 1.02.110 - ====================================== + Disable thin monitoring plugin when it fails too often (>10 times). Fix/restore parsing of empty field '-' when processing dmeventd event. Enhance dm_tree_node_size_changed() to recognize size reduction. Support exit on idle for dmenventd (1 hour). diff --git a/daemons/dmeventd/plugins/thin/dmeventd_thin.c b/daemons/dmeventd/plugins/thin/dmeventd_thin.c index 888cc0c53..7f422a9af 100644 --- a/daemons/dmeventd/plugins/thin/dmeventd_thin.c +++ b/daemons/dmeventd/plugins/thin/dmeventd_thin.c @@ -18,6 +18,7 @@ #include <sys/wait.h> #include <stdarg.h> +#include <pthread.h> /* TODO - move this mountinfo code into library to be reusable */ #ifdef __linux__ @@ -36,6 +37,8 @@ #define UMOUNT_COMMAND "/bin/umount" +#define MAX_FAILS (10) + #define THIN_DEBUG 0 struct dso_state { @@ -44,6 +47,7 @@ struct dso_state { int data_percent_check; uint64_t known_metadata_size; uint64_t known_data_size; + unsigned fails; char cmd_str[1024]; }; @@ -157,7 +161,7 @@ static int _run(const char *cmd, ...) argv = alloca(sizeof(const char *) * (argc + 1)); argv[0] = cmd; - va_start(ap, cmd); + va_start(ap, cmd); while ((argv[++i] = va_arg(ap, const char *))); va_end(ap); @@ -245,7 +249,9 @@ static void _use_policy(struct dm_task *dmt, struct dso_state *state) log_error("Failed to extend thin pool %s.", dm_task_get_name(dmt)); _umount(dmt); - } + state->fails++; + } else + state->fails = 0; } void process_event(struct dm_task *dmt, @@ -270,7 +276,7 @@ void process_event(struct dm_task *dmt, if (event & DM_EVENT_DEVICE_ERROR) { /* Error -> no need to check and do instant resize */ _use_policy(dmt, state); - return; + goto out; } dm_get_next_target(dmt, next, &start, &length, &target_type, ¶ms); @@ -338,6 +344,13 @@ void process_event(struct dm_task *dmt, out: if (tps) dm_pool_free(state->mem, tps); + + if (state->fails >= MAX_FAILS) { + log_warn("WARNING: Dropping monitoring of %s. " + "lvm2 command fails too often (%u times in raw).", + device, state->fails); + pthread_kill(pthread_self(), SIGALRM); + } } int register_device(const char *device, |