[lvm-devel] [PATCH] improve dmeventd monitoring option processing
Mike Snitzer
snitzer at redhat.com
Thu Mar 11 03:05:05 UTC 2010
Add "monitoring" option to "dmeventd" section of lvm.conf
Have clvmd consult the lvm.conf "dmeventd/monitoring" too.
Error out when both --monitor and --ignoremonitoring are provided.
Clarify that '--monitor' controls the start and stop of monitoring in
the {vg,lv}change man pages.
NOTE: should this identical code in {vg,lv}change.c be split out into
toollib.c?
Signed-off-by: Mike Snitzer <snitzer at redhat.com>
---
daemons/clvmd/lvm-functions.c | 8 ++++++--
doc/example.conf | 5 +++++
man/lvchange.8.in | 3 +--
man/vgchange.8.in | 3 +--
tools/lvchange.c | 21 +++++++++++++++++----
tools/vgchange.c | 21 +++++++++++++++++----
6 files changed, 47 insertions(+), 14 deletions(-)
diff --git a/daemons/clvmd/lvm-functions.c b/daemons/clvmd/lvm-functions.c
index 02d401b..5d4b867 100644
--- a/daemons/clvmd/lvm-functions.c
+++ b/daemons/clvmd/lvm-functions.c
@@ -542,8 +542,12 @@ int do_lock_lv(unsigned char command, unsigned char lock_flags, char *resource)
if (lock_flags & LCK_MIRROR_NOSYNC_MODE)
init_mirror_in_sync(0);
- if (!(lock_flags & LCK_DMEVENTD_MONITOR_MODE))
- init_dmeventd_monitor(DEFAULT_DMEVENTD_MONITOR);
+ if (!(lock_flags & LCK_DMEVENTD_MONITOR_MODE)) {
+ int dmeventd_mode =
+ find_config_tree_bool(cmd, "dmeventd/monitoring",
+ DEFAULT_DMEVENTD_MONITOR);
+ init_dmeventd_monitor(dmeventd_mode);
+ }
cmd->partial_activation = 0;
diff --git a/doc/example.conf b/doc/example.conf
index 511e20c..2f9d5ee 100644
--- a/doc/example.conf
+++ b/doc/example.conf
@@ -469,6 +469,11 @@ activation {
# Event daemon
#
dmeventd {
+ # Monitoring is enabled by default when using vgchange or
+ # lvchange. Set to 0 to disable monitoring or use the
+ # --ignoremonitoring option.
+ monitoring = 1
+
# mirror_library is the library used when monitoring a mirror device.
#
# "libdevmapper-event-lvm2mirror.so" attempts to recover from
diff --git a/man/lvchange.8.in b/man/lvchange.8.in
index 08a83c4..99f9bf3 100644
--- a/man/lvchange.8.in
+++ b/man/lvchange.8.in
@@ -56,8 +56,7 @@ of your data.
Set the minor number.
.TP
.I \-\-monitor y|n
-Controls whether or not a mirrored logical volume is monitored by
-dmeventd, if it is installed.
+Start or stop monitoring a logical volume, if dmeventd is installed.
If a device used by a monitored mirror reports an I/O error,
the failure is handled according to
\fBmirror_image_fault_policy\fP and \fBmirror_log_fault_policy\fP
diff --git a/man/vgchange.8.in b/man/vgchange.8.in
index 5013c1e..e01158a 100644
--- a/man/vgchange.8.in
+++ b/man/vgchange.8.in
@@ -78,8 +78,7 @@ are not marked as clustered.
Generate new random UUID for specified Volume Groups.
.TP
.BR \-\-monitor " " { y | n }
-Controls whether or not a mirrored logical volume is monitored by
-dmeventd, if it is installed.
+Start or stop monitoring a logical volume, if dmeventd is installed.
If a device used by a monitored mirror reports an I/O error,
the failure is handled according to
.BR mirror_image_fault_policy
diff --git a/tools/lvchange.c b/tools/lvchange.c
index 2d7955e..711217f 100644
--- a/tools/lvchange.c
+++ b/tools/lvchange.c
@@ -518,7 +518,7 @@ static int lvchange_single(struct cmd_context *cmd, struct logical_volume *lv,
void *handle __attribute((unused)))
{
int doit = 0, docmds = 0;
- int archived = 0;
+ int dmeventd_mode, archived = 0;
struct logical_volume *origin;
if (!(lv->vg->status & LVM_WRITE) &&
@@ -575,9 +575,22 @@ static int lvchange_single(struct cmd_context *cmd, struct logical_volume *lv,
return ECMD_FAILED;
}
- init_dmeventd_monitor(arg_int_value(cmd, monitor_ARG,
- (is_static() || arg_count(cmd, ignoremonitoring_ARG)) ?
- DMEVENTD_MONITOR_IGNORE : DEFAULT_DMEVENTD_MONITOR));
+ if (arg_count(cmd, monitor_ARG) &&
+ arg_count(cmd, ignoremonitoring_ARG)) {
+ log_error("Conflicting monitor and ignoremonitoring options");
+ return ECMD_FAILED;
+ }
+
+ dmeventd_mode = DEFAULT_DMEVENTD_MONITOR;
+ if (arg_count(cmd, monitor_ARG))
+ dmeventd_mode = arg_int_value(cmd, monitor_ARG,
+ DEFAULT_DMEVENTD_MONITOR);
+ else if (is_static() || arg_count(cmd, ignoremonitoring_ARG) ||
+ !find_config_tree_bool(cmd, "dmeventd/monitoring",
+ DEFAULT_DMEVENTD_MONITOR))
+ dmeventd_mode = DMEVENTD_MONITOR_IGNORE;
+
+ init_dmeventd_monitor(dmeventd_mode);
/*
* FIXME: DEFAULT_BACKGROUND_POLLING should be "unspecified".
diff --git a/tools/vgchange.c b/tools/vgchange.c
index 6d869f9..f343584 100644
--- a/tools/vgchange.c
+++ b/tools/vgchange.c
@@ -522,16 +522,29 @@ static int vgchange_single(struct cmd_context *cmd, const char *vg_name,
struct volume_group *vg,
void *handle __attribute((unused)))
{
- int r = ECMD_FAILED;
+ int dmeventd_mode, r = ECMD_FAILED;
if (vg_is_exported(vg)) {
log_error("Volume group \"%s\" is exported", vg_name);
return ECMD_FAILED;
}
- init_dmeventd_monitor(arg_int_value(cmd, monitor_ARG,
- (is_static() || arg_count(cmd, ignoremonitoring_ARG)) ?
- DMEVENTD_MONITOR_IGNORE : DEFAULT_DMEVENTD_MONITOR));
+ if (arg_count(cmd, monitor_ARG) &&
+ arg_count(cmd, ignoremonitoring_ARG)) {
+ log_error("Conflicting monitor and ignoremonitoring options");
+ return ECMD_FAILED;
+ }
+
+ dmeventd_mode = DEFAULT_DMEVENTD_MONITOR;
+ if (arg_count(cmd, monitor_ARG))
+ dmeventd_mode = arg_int_value(cmd, monitor_ARG,
+ DEFAULT_DMEVENTD_MONITOR);
+ else if (is_static() || arg_count(cmd, ignoremonitoring_ARG) ||
+ !find_config_tree_bool(cmd, "dmeventd/monitoring",
+ DEFAULT_DMEVENTD_MONITOR))
+ dmeventd_mode = DMEVENTD_MONITOR_IGNORE;
+
+ init_dmeventd_monitor(dmeventd_mode);
/*
* FIXME: DEFAULT_BACKGROUND_POLLING should be "unspecified".
More information about the lvm-devel
mailing list