]> sourceware.org Git - lvm2.git/commitdiff
Add a [--poll {y|n}] flag to vgchange and lvchange to control whether
authorMike Snitzer <snitzer@redhat.com>
Tue, 5 Jan 2010 20:56:51 +0000 (20:56 +0000)
committerMike Snitzer <snitzer@redhat.com>
Tue, 5 Jan 2010 20:56:51 +0000 (20:56 +0000)
the background polldaemon is allowed to start.  It can be used
standalone or in conjunction with --refresh or --available y.

Control over when the background polldaemon starts will be particularly
important for snapshot-merge of a root filesystem.

Dracut will be updated to activate all LVs with: --poll n

The lvm2-monitor initscript will start polling with: --poll y

NOTE: Because we currently have no way of knowing if a background
polldaemon is active for a given LV the following limitations exist and
have been deemed acceptable:
1) it is not possible to stop an active polldaemon; so the lvm2-monitor
   initscript doesn't stop running polldaemon(s)
2) redundant polldaemon instances will be started for all specified LVs
   if vgchange or lvchange are repeatedly used with '--poll y'

Signed-off-by: Mike Snitzer <snitzer@redhat.com>
WHATS_NEW
lib/config/defaults.h
lib/misc/lvm-globals.c
lib/misc/lvm-globals.h
man/lvchange.8.in
man/vgchange.8.in
scripts/lvm2_monitoring_init_red_hat.in
tools/args.h
tools/commands.h
tools/lvchange.c
tools/vgchange.c

index f89b89b7a86477a5ec61f46efbc5f9e3f143418f..886a9faf9d1dbbf44e1d028219408882c8bc0866 100644 (file)
--- a/WHATS_NEW
+++ b/WHATS_NEW
@@ -1,5 +1,6 @@
 Version 2.02.57 -
 ====================================
+  Add --poll flag to vgchange and lvchange.
   Propagate commit and revert metadata notification to other nodes in cluster.
   Use proper mask for VG lock mode in clvmd.
   Add possibility to drop precommitted metadata in lvmcache.
index a4e8d09f4e2930c819d06e50efc901353caebcb7..c6585ff267a03093e6a6549bb72a2e5cf1266981 100644 (file)
@@ -50,6 +50,7 @@
 #define DEFAULT_MIRROR_MAX_IMAGES 8 /* limited by kernel DM_KCOPYD_MAX_REGIONS */
 #define DEFAULT_DMEVENTD_MIRROR_LIB "libdevmapper-event-lvm2mirror.so"
 #define DEFAULT_DMEVENTD_MONITOR 1
+#define DEFAULT_BACKGROUND_POLLING 1
 
 #define DEFAULT_UMASK 0077
 
index a409e684d213c1255aee2d82f68cce9d4fcd3020..45a2e358ae27ec5c2c267aa09018541199685b86 100644 (file)
@@ -35,6 +35,7 @@ static int _security_level = SECURITY_LEVEL;
 static char _cmd_name[30] = "";
 static int _mirror_in_sync = 0;
 static int _dmeventd_monitor = DEFAULT_DMEVENTD_MONITOR;
+static int _background_polling = DEFAULT_BACKGROUND_POLLING;
 static int _ignore_suspended_devices = 0;
 static int _error_message_produced = 0;
 static unsigned _is_static = 0;
@@ -91,6 +92,11 @@ void init_dmeventd_monitor(int reg)
        _dmeventd_monitor = reg;
 }
 
+void init_background_polling(int polling)
+{
+       _background_polling = polling;
+}
+
 void init_ignore_suspended_devices(int ignore)
 {
        _ignore_suspended_devices = ignore;
@@ -155,6 +161,11 @@ int trust_cache()
        return _trust_cache;
 }
 
+int background_polling()
+{
+       return _background_polling;
+}
+
 int ignorelockingfailure()
 {
        return _ignorelockingfailure;
index 8209b3ec73e00e4aee6c2a490f1e724f3b08fe65..1ce9c568ab5a117f2a6b801be840a040177f2189 100644 (file)
@@ -32,6 +32,7 @@ void init_lockingfailed(int level);
 void init_security_level(int level);
 void init_mirror_in_sync(int in_sync);
 void init_dmeventd_monitor(int reg);
+void init_background_polling(int polling);
 void init_ignore_suspended_devices(int ignore);
 void init_error_message_produced(int produced);
 void init_is_static(unsigned value);
@@ -49,6 +50,7 @@ int ignorelockingfailure(void);
 int lockingfailed(void);
 int security_level(void);
 int mirror_in_sync(void);
+int background_polling(void);
 int ignore_suspended_devices(void);
 const char *log_command_name(void);
 unsigned is_static(void);
index fc66fb2685c65f8b84ed8cb514f39a31069429d0..c18aec2ec91e83342ba0b3187ddda2e46068fd7b 100644 (file)
@@ -12,6 +12,7 @@ lvchange \- change attributes of a logical volume
 [\-\-ignorelockingfailure]
 [\-\-ignoremonitoring]
 [\-\-monitor {y|n}]
+[\-\-poll {y|n}]
 [\-\-noudevsync]
 [\-M|\-\-persistent y|n] [\-\-minor minor]
 [\-P|\-\-partial]
@@ -62,6 +63,14 @@ the failure is handled according to
 \fBmirror_image_fault_policy\fP and \fBmirror_log_fault_policy\fP
 set in \fBlvm.conf\fP.
 .TP
+.I \-\-poll y|n
+Controls whether or not a logical volume's progress is polled.  It may
+not be appropriate to immediately poll the progress of a logical
+volume's transformation when it is activated (for example, when merging
+a snapshot into the root FS).  The progress polling of an incomplete
+pvmove or lvconvert can be deferred using \fB--poll n\fP and restarted
+using \fB--poll y\fP.
+.TP
 .I \-\-noudevsync
 Disable udev synchronisation. The
 process will not wait for notification from udev.
index bacb3b48f6683015ef8d03d2a2f0d1a01f7a2df5..ad0982339aea3eead4f3026298cee679c6300ebe 100644 (file)
@@ -10,6 +10,7 @@ vgchange \- change attributes of a volume group
 .RB [ \-A | \-\-autobackup " {" y | n }]
 .RB [ \-a | \-\-available " [e|l] {" y | n }]
 .RB [ \-\-monitor " {" y | n }]
+.RB [ \-\-poll " {" y | n }]
 .RB [ \-c | \-\-clustered " {" y | n }]
 .RB [ \-u | \-\-uuid ]
 .RB [ \-d | \-\-debug]
@@ -87,6 +88,14 @@ and
 set in 
 .BR lvm.conf (5).
 .TP
+.BR \-\-poll " " { y | n }
+Controls whether or not a logical volume's progress is polled.  It may
+not be appropriate to immediately poll the progress of a logical
+volume's transformation when it is activated (for example, when merging
+a snapshot into the root FS).  The progress polling of an incomplete
+pvmove or lvconvert can be deferred using \fB--poll n\fP and restarted
+using \fB--poll y\fP.
+.TP
 .BR \-\-noudevsync
 Disable udev synchronisation. The
 process will not wait for notification from udev.
index ef5a6e4985bffc80e602ca89601736ebda7bb905..ed03f65eaa2978f443f6b93a41f2f9f440d3e439 100644 (file)
@@ -26,7 +26,7 @@
 # Required-Stop: $local_fs
 # Default-Start: 1 2 3 4 5
 # Default-Stop: 0 6
-# Short-Description: Monitoring of LVM2 mirrors, snapshots etc. using dmeventd
+# Short-Description: Monitoring of LVM2 mirrors, snapshots etc. using dmeventd or progress polling
 ### END INIT INFO
 
 . /etc/init.d/functions
@@ -50,7 +50,7 @@ start()
        VGSLIST=`$VGS --noheadings -o name 2> /dev/null`
        for vg in $VGSLIST
        do
-           action "Starting monitoring for VG $vg:" $VGCHANGE --monitor y $vg || ret=$?
+           action "Starting monitoring for VG $vg:" $VGCHANGE --monitor y --poll y $vg || ret=$?
        done
 
        return $ret
index 1f2427b6925f726893945ab0d296d2254be18212..85f6a3cff86d813e1169e9bb9269cf17f074df38 100644 (file)
@@ -64,6 +64,7 @@ arg(dataalignmentoffset_ARG, '\0', "dataalignmentoffset", size_kb_arg, 0)
 arg(virtualoriginsize_ARG, '\0', "virtualoriginsize", size_mb_arg, 0)
 arg(virtualsize_ARG, '\0', "virtualsize", size_mb_arg, 0)
 arg(noudevsync_ARG, '\0', "noudevsync", NULL, 0)
+arg(poll_ARG, '\0', "poll", yes_no_arg, 0)
 
 /* Allow some variations */
 arg(resizable_ARG, '\0', "resizable", yes_no_arg, 0)
index 85222e4eb9eab881a9e2bcd3a85cfe6071cd43b8..032bde64209b15d1d9a747fbb174c4d0799e742d 100644 (file)
@@ -72,6 +72,7 @@ xx(lvchange,
    "\t[--ignorelockingfailure]\n"
    "\t[--ignoremonitoring]\n"
    "\t[--monitor {y|n}]\n"
+   "\t[--poll {y|n}]\n"
    "\t[--noudevsync]\n"
    "\t[-M|--persistent y|n] [--major major] [--minor minor]\n"
    "\t[-P|--partial] " "\n"
@@ -88,8 +89,8 @@ xx(lvchange,
    alloc_ARG, autobackup_ARG, available_ARG, contiguous_ARG, force_ARG,
    ignorelockingfailure_ARG, ignoremonitoring_ARG, major_ARG, minor_ARG,
    monitor_ARG, noudevsync_ARG, partial_ARG, permission_ARG, persistent_ARG,
-   readahead_ARG, resync_ARG, refresh_ARG, addtag_ARG, deltag_ARG, test_ARG,
-   yes_ARG)
+   poll_ARG, readahead_ARG, resync_ARG, refresh_ARG, addtag_ARG, deltag_ARG,
+   test_ARG, yes_ARG)
 
 xx(lvconvert,
    "Change logical volume layout",
@@ -688,6 +689,7 @@ xx(vgchange,
    "\t[--ignorelockingfailure]\n"
    "\t[--ignoremonitoring]\n"
    "\t[--monitor {y|n}]\n"
+   "\t[--poll {y|n}]\n"
    "\t[--noudevsync]\n"
    "\t[--refresh]\n"
    "\t[-t|--test]" "\n"
@@ -707,7 +709,7 @@ xx(vgchange,
    addtag_ARG, alloc_ARG, allocation_ARG, autobackup_ARG, available_ARG,
    clustered_ARG, deltag_ARG, ignorelockingfailure_ARG, ignoremonitoring_ARG,
    logicalvolume_ARG, maxphysicalvolumes_ARG, monitor_ARG, noudevsync_ARG,
-   partial_ARG, physicalextentsize_ARG, refresh_ARG, resizeable_ARG,
+   partial_ARG, physicalextentsize_ARG, poll_ARG, refresh_ARG, resizeable_ARG,
    resizable_ARG, test_ARG, uuid_ARG)
 
 xx(vgck,
index f43b07afac1b4e0b9586227155452b489713ebcf..f01d560a7703b075162fc41a2963a060823f83a6 100644 (file)
@@ -101,6 +101,22 @@ static int lvchange_monitoring(struct cmd_context *cmd,
        return 1;
 }
 
+static int lvchange_background_polling(struct cmd_context *cmd,
+                                      struct logical_volume *lv)
+{
+       struct lvinfo info;
+
+       if (!lv_info(cmd, lv, &info, 0, 0) || !info.exists) {
+               log_error("Logical volume, %s, is not active", lv->name);
+               return 0;
+       }
+
+       if (background_polling())
+               lv_spawn_background_polling(cmd, lv);
+
+       return 1;
+}
+
 static int lvchange_availability(struct cmd_context *cmd,
                                 struct logical_volume *lv)
 {
@@ -135,7 +151,8 @@ static int lvchange_availability(struct cmd_context *cmd,
                                return_0;
                }
 
-               lv_spawn_background_polling(cmd, lv);
+               if (background_polling())
+                       lv_spawn_background_polling(cmd, lv);
        }
 
        return 1;
@@ -577,6 +594,9 @@ static int lvchange_single(struct cmd_context *cmd, struct logical_volume *lv,
                                            (is_static() || arg_count(cmd, ignoremonitoring_ARG)) ?
                                            DMEVENTD_MONITOR_IGNORE : DEFAULT_DMEVENTD_MONITOR));
 
+       init_background_polling(arg_int_value(cmd, poll_ARG,
+                                             DEFAULT_BACKGROUND_POLLING));
+
        /* access permission change */
        if (arg_count(cmd, permission_ARG)) {
                if (!archive(lv->vg)) {
@@ -679,6 +699,15 @@ static int lvchange_single(struct cmd_context *cmd, struct logical_volume *lv,
                }
        }
 
+       if (!arg_count(cmd, available_ARG) &&
+           !arg_count(cmd, refresh_ARG) &&
+           arg_count(cmd, poll_ARG)) {
+               if (!lvchange_background_polling(cmd, lv)) {
+                       stack;
+                       return ECMD_FAILED;
+               }
+       }
+
        if (doit != docmds) {
                stack;
                return ECMD_FAILED;
@@ -695,10 +724,10 @@ int lvchange(struct cmd_context *cmd, int argc, char **argv)
            && !arg_count(cmd, persistent_ARG) && !arg_count(cmd, addtag_ARG)
            && !arg_count(cmd, deltag_ARG) && !arg_count(cmd, refresh_ARG)
            && !arg_count(cmd, alloc_ARG) && !arg_count(cmd, monitor_ARG)
-           && !arg_count(cmd, resync_ARG)) {
+           && !arg_count(cmd, poll_ARG) && !arg_count(cmd, resync_ARG)) {
                log_error("Need 1 or more of -a, -C, -j, -m, -M, -p, -r, "
-                         "--resync, --refresh, --alloc, --addtag, --deltag "
-                         "or --monitor");
+                         "--resync, --refresh, --alloc, --addtag, --deltag, "
+                         "--monitor or --poll");
                return EINVALID_CMD_LINE;
        }
 
index 1c52e75fb5edbc893d0baaf4c342464fcc46fe4e..9b6b27ff9228ce12244609e52094a780bad1c6a0 100644 (file)
@@ -51,6 +51,39 @@ static int _monitor_lvs_in_vg(struct cmd_context *cmd,
        return count;
 }
 
+static int _poll_lvs_in_vg(struct cmd_context *cmd,
+                          struct volume_group *vg)
+{
+       struct lv_list *lvl;
+       struct logical_volume *lv;
+       struct lvinfo info;
+       int lv_active;
+       int count = 0;
+
+       dm_list_iterate_items(lvl, &vg->lvs) {
+               lv = lvl->lv;
+
+               if (!lv_info(cmd, lv, &info, 0, 0))
+                       lv_active = 0;
+               else
+                       lv_active = info.exists;
+
+               if (!lv_active ||
+                   !(lv->status & (PVMOVE|CONVERTING)))
+                       continue;
+
+               lv_spawn_background_polling(cmd, lv);
+               count++;
+       }
+
+       /*
+        * returns the number of polled devices
+        * - there is no way to know if lv is already being polled
+        */
+
+       return count;
+}
+
 static int _activate_lvs_in_vg(struct cmd_context *cmd,
                               struct volume_group *vg, int activate)
 {
@@ -95,7 +128,8 @@ static int _activate_lvs_in_vg(struct cmd_context *cmd,
                } else if (!activate_lv(cmd, lv))
                        continue;
 
-               if (activate != CHANGE_AN && activate != CHANGE_ALN &&
+               if (background_polling() &&
+                   activate != CHANGE_AN && activate != CHANGE_ALN &&
                    (lv->status & (PVMOVE|CONVERTING)))
                        lv_spawn_background_polling(cmd, lv);
 
@@ -125,6 +159,20 @@ static int _vgchange_monitoring(struct cmd_context *cmd, struct volume_group *vg
        return ECMD_PROCESSED;
 }
 
+static int _vgchange_background_polling(struct cmd_context *cmd, struct volume_group *vg)
+{
+       int polled;
+
+       if (lvs_in_vg_activated(vg) && background_polling()) {
+               polled = _poll_lvs_in_vg(cmd, vg);
+               log_print("Background polling started for %d logical volume(s) "
+                         "in volume group \"%s\"",
+                         polled, vg->name);
+       }
+
+       return ECMD_PROCESSED;
+}
+
 static int _vgchange_available(struct cmd_context *cmd, struct volume_group *vg)
 {
        int lv_open, active, monitored;
@@ -490,12 +538,18 @@ static int vgchange_single(struct cmd_context *cmd, const char *vg_name,
                                            (is_static() || arg_count(cmd, ignoremonitoring_ARG)) ?
                                            DMEVENTD_MONITOR_IGNORE : DEFAULT_DMEVENTD_MONITOR));
 
+       init_background_polling(arg_int_value(cmd, poll_ARG,
+                                             DEFAULT_BACKGROUND_POLLING));
+
        if (arg_count(cmd, available_ARG))
                r = _vgchange_available(cmd, vg);
 
        else if (arg_count(cmd, monitor_ARG))
                r = _vgchange_monitoring(cmd, vg);
 
+       else if (arg_count(cmd, poll_ARG))
+               r = _vgchange_background_polling(cmd, vg);
+
        else if (arg_count(cmd, resizeable_ARG))
                r = _vgchange_resizeable(cmd, vg);
 
@@ -538,9 +592,11 @@ int vgchange(struct cmd_context *cmd, int argc, char **argv)
             arg_count(cmd, addtag_ARG) + arg_count(cmd, uuid_ARG) +
             arg_count(cmd, physicalextentsize_ARG) +
             arg_count(cmd, clustered_ARG) + arg_count(cmd, alloc_ARG) +
-            arg_count(cmd, monitor_ARG) + arg_count(cmd, refresh_ARG))) {
-               log_error("One of -a, -c, -l, -p, -s, -x, --refresh, "
-                               "--uuid, --alloc, --addtag or --deltag required");
+            arg_count(cmd, monitor_ARG) + arg_count(cmd, poll_ARG) +
+            arg_count(cmd, refresh_ARG))) {
+               log_error("Need 1 or more of -a, -c, -l, -p, -s, -x, "
+                         "--refresh, --uuid, --alloc, --addtag, --deltag, "
+                         "--monitor or --poll");
                return EINVALID_CMD_LINE;
        }
 
This page took 0.056243 seconds and 5 git commands to generate.