1
0
mirror of git://sourceware.org/git/lvm2.git synced 2024-12-21 13:34:40 +03:00

vgchange autoactivation: lock vg early to avoid second label scan

Copy another optimization from pvscan -aay to vgchange -aay.
When using the optimized label scan for only one VG, acquire the
VG lock prior to the scan.  This allows vg_read to then skip the
repeated label scan that normally happens after locking the vg.
This commit is contained in:
David Teigland 2021-11-10 16:43:21 -06:00
parent 92e741eda0
commit 0e0faf30e0
3 changed files with 35 additions and 31 deletions

View File

@ -1044,10 +1044,6 @@ int label_scan_vg_online(struct cmd_context *cmd, const char *vgname,
log_debug_devs("Finding online devices to scan");
/* reads devices file, does not populate dev-cache */
if (!setup_devices_for_online_autoactivation(cmd))
return 0;
/*
* First attempt to use /run/lvm/pvs_lookup/vgname which should be
* used in cases where all PVs in a VG do not contain metadata.

View File

@ -56,13 +56,14 @@ check lv_field $vg2/$lv1 lv_active "active"
# Count io to check the pvs_online optimization
# is working to limit scanning.
if which strace; then
vgchange -an
_clear_online_files
pvscan --cache "$dev1"
pvscan --cache "$dev2"
strace -e io_submit vgchange -aay --autoactivation event $vg1 2>&1|tee trace.out
test "$(grep io_submit trace.out | wc -l)" -eq 4
test "$(grep io_submit trace.out | wc -l)" -eq 3
rm trace.out
strace -e io_submit pvscan --cache "$dev3" 2>&1|tee trace.out
@ -72,6 +73,7 @@ rm trace.out
strace -e io_submit vgchange -aay --autoactivation event $vg2 2>&1|tee trace.out
test "$(grep io_submit trace.out | wc -l)" -eq 2
rm trace.out
fi
# non-standard usage: no VG name arg, vgchange will only used pvs_online files

View File

@ -743,6 +743,7 @@ static int _vgchange_autoactivation_setup(struct cmd_context *cmd,
{
const char *aa;
char *vgname = NULL;
int vg_locked = 0;
int found_none = 0, found_all = 0, found_incomplete = 0;
if (!(aa = arg_str_value(cmd, autoactivation_ARG, NULL)))
@ -763,29 +764,35 @@ static int _vgchange_autoactivation_setup(struct cmd_context *cmd,
vp->vg_complete_to_activate = 1;
cmd->use_hints = 0;
/*
* Add an option to skip the pvs_online optimization? e.g.
* "online_skip" in --autoactivation / auto_activation_settings
*
* if (online_skip)
* return 1;
*/
/* reads devices file, does not populate dev-cache */
if (!setup_devices_for_online_autoactivation(cmd))
return_0;
get_single_vgname_cmd_arg(cmd, NULL, &vgname);
/*
* Special label scan optimized for autoactivation that is based on
* info read from /run/lvm/ files created by pvscan --cache during
* autoactivation. Add an option to disable this optimization? e.g.
* "online_skip" in --autoactivation / auto_activation_settings
*
* In some cases it might be useful to strictly follow the online
* files, and not fall back to a standard label scan when no pvs or
* incomplete pvs are found from the online files. Add option for
* that? e.g.
* "online_only" in --autoactivation / auto_activation_settings
*
* Generally the way that vgchange -aay --autoactivation event is
* currently used, it will not be called until pvscan --cache has found
* the VG is complete, so it will not generally be following the paths
* that fall back to standard label_scan.
*
* TODO: Like pvscan_aa_quick, this could do lock_vol(vgname) before
* label_scan_vg_online, then set cmd->can_use_one_scan=1 to avoid
* rescanning in _vg_read called by process_each_vg.
* Lock the VG before scanning the PVs so _vg_read can avoid the normal
* lock_vol+rescan (READ_WITHOUT_LOCK avoids the normal lock_vol and
* can_use_one_scan avoids the normal rescan.) If this early lock_vol
* fails, continue and use the normal lock_vol in _vg_read.
*/
if (vgname) {
if (!lock_vol(cmd, vgname, LCK_VG_WRITE, NULL)) {
log_debug("Failed early VG locking for autoactivation.");
} else {
*flags |= READ_WITHOUT_LOCK;
cmd->can_use_one_scan = 1;
vg_locked = 1;
}
}
/*
* Perform label_scan on PVs that are online (per /run/lvm files)
@ -819,15 +826,14 @@ static int _vgchange_autoactivation_setup(struct cmd_context *cmd,
}
/*
* Possible option to only activate from only online pvs even if they
* are not all found, and not fall back to a full label_scan.
* The online scanning optimiziation didn't work, so undo the vg
* locking optimization before falling back to normal processing.
*/
/*
if (online_only) {
log_print("PVs online %s.", found_none ? "not found" : "incomplete");
return vgname ? 0 : 1;
if (vg_locked) {
unlock_vg(cmd, NULL, vgname);
*flags &= ~READ_WITHOUT_LOCK;
cmd->can_use_one_scan = 0;
}
*/
/*
* Not expected usage, no online pvs for the vgname were found. The