mirror of
git://sourceware.org/git/lvm2.git
synced 2025-03-11 20:58:50 +03:00
When a VG has multiple PVs, and all those PVs come online at the same time, concurrent pvscans for each PV will all create the individual pvid files, and all will often see the VG is now complete. This causes each of the pvscan commands to think it should activate the VG, so there are multiple activations of the same VG. The vg lock serializes them, and only the first pvscan actually does the activation, but there is still a lot of extra overhead and time used by the other pvscans that attempt to activate the already active VG. This can lead to a backlog of pvscans and timeouts. To fix this, this adds a new /run/lvm/vgs_online/ dir that works like the existing /run/lvm/pvs_online/ dir. Each pvscan that wants to activate a VG will first try to exlusively create the file vgs_online/<vgname>. Only the first pvscan will succeed, and that one will do the VG activation. The other pvscans will find the vgname file exists and will not do the activation step. When a PV goes offline, the vgs_online file for the corresponding VG is removed. This allows the VG to be autoactivated again when the PV comes online again. This requires that the vgname be stored in the pvid files.
156 lines
3.8 KiB
Bash
156 lines
3.8 KiB
Bash
#!/usr/bin/env bash
|
|
|
|
# Copyright (C) 2012 Red Hat, Inc. All rights reserved.
|
|
#
|
|
# This copyrighted material is made available to anyone wishing to use,
|
|
# modify, copy, or redistribute it subject to the terms and conditions
|
|
# of the GNU General Public License v.2.
|
|
#
|
|
# You should have received a copy of the GNU General Public License
|
|
# along with this program; if not, write to the Free Software Foundation,
|
|
# Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
|
|
|
|
SKIP_WITH_LVMPOLLD=1
|
|
|
|
RUNDIR="/run"
|
|
test -d "$RUNDIR" || RUNDIR="/var/run"
|
|
PVS_ONLINE_DIR="$RUNDIR/lvm/pvs_online"
|
|
VGS_ONLINE_DIR="$RUNDIR/lvm/vgs_online"
|
|
|
|
# FIXME: kills logic for running system
|
|
_clear_online_files() {
|
|
# wait till udev is finished
|
|
aux udev_wait
|
|
rm -f "$PVS_ONLINE_DIR"/*
|
|
rm -f "$VGS_ONLINE_DIR"/*
|
|
}
|
|
|
|
. lib/inittest
|
|
|
|
aux prepare_pvs 2
|
|
|
|
vgcreate $vg1 "$dev1" "$dev2"
|
|
lvcreate -n $lv1 -l 4 -a n $vg1
|
|
|
|
# the first pvscan scans all devs
|
|
test -d "$PVS_ONLINE_DIR" || mkdir -p "$PVS_ONLINE_DIR"
|
|
test -d "$VGS_ONLINE_DIR" || mkdir -p "$VGS_ONLINE_DIR"
|
|
_clear_online_files
|
|
|
|
pvscan --cache -aay
|
|
check lv_field $vg1/$lv1 lv_active "active"
|
|
lvchange -an $vg1
|
|
|
|
# the first pvscan scans all devs even when
|
|
# only one device is specified
|
|
|
|
_clear_online_files
|
|
|
|
pvscan --cache -aay "$dev1"
|
|
check lv_field $vg1/$lv1 lv_active "active"
|
|
lvchange -an $vg1
|
|
|
|
# touch foo to disable first-pvscan case,
|
|
# then check pvscan with no args scans all
|
|
_clear_online_files
|
|
touch "$RUNDIR/lvm/pvs_online/foo"
|
|
|
|
pvscan --cache -aay
|
|
check lv_field $vg1/$lv1 lv_active "active"
|
|
lvchange -an $vg1
|
|
|
|
# touch foo to disable first-pvscan case,
|
|
# then check that vg is activated only after
|
|
# both devs appear separately
|
|
|
|
_clear_online_files
|
|
touch "$RUNDIR/lvm/pvs_online/foo"
|
|
|
|
pvscan --cache -aay "$dev1"
|
|
check lv_field $vg1/$lv1 lv_active ""
|
|
pvscan --cache -aay "$dev2"
|
|
check lv_field $vg1/$lv1 lv_active "active"
|
|
lvchange -an $vg1
|
|
|
|
# touch foo to disable first-pvscan case,
|
|
# then check that vg is activated when both
|
|
# devs appear together
|
|
|
|
_clear_online_files
|
|
touch "$RUNDIR/lvm/pvs_online/foo"
|
|
|
|
pvscan --cache -aay "$dev1" "$dev2"
|
|
check lv_field $vg1/$lv1 lv_active "active"
|
|
lvchange -an $vg1
|
|
|
|
# Set up tests where one dev has no metadata
|
|
|
|
vgchange -an $vg1
|
|
vgremove -ff $vg1
|
|
pvremove "$dev1"
|
|
pvremove "$dev2"
|
|
pvcreate --metadatacopies 0 "$dev1"
|
|
pvcreate --metadatacopies 1 "$dev2"
|
|
vgcreate $vg1 "$dev1" "$dev2"
|
|
lvcreate -n $lv1 -l 4 -a n $vg1
|
|
|
|
# touch foo to disable first-pvscan case,
|
|
# test case where dev with metadata appears first
|
|
|
|
_clear_online_files
|
|
touch "$RUNDIR/lvm/pvs_online/foo"
|
|
|
|
pvscan --cache -aay "$dev2"
|
|
check lv_field $vg1/$lv1 lv_active ""
|
|
pvscan --cache -aay "$dev1"
|
|
check lv_field $vg1/$lv1 lv_active "active"
|
|
lvchange -an $vg1
|
|
|
|
# touch foo to disable first-pvscan case,
|
|
# test case where dev without metadata
|
|
# appears first which triggers scanning all
|
|
|
|
_clear_online_files
|
|
touch "$RUNDIR/lvm/pvs_online/foo"
|
|
|
|
pvscan --cache -aay "$dev1"
|
|
check lv_field $vg1/$lv1 lv_active "active"
|
|
pvscan --cache -aay "$dev2"
|
|
check lv_field $vg1/$lv1 lv_active "active"
|
|
lvchange -an $vg1
|
|
|
|
# dev without metadata is scanned, but
|
|
# first-pvscan case scans all devs
|
|
|
|
_clear_online_files
|
|
|
|
pvscan --cache -aay "$dev1"
|
|
check lv_field $vg1/$lv1 lv_active "active"
|
|
lvchange -an $vg1
|
|
|
|
# use the --cache option to record a dev
|
|
# is online without the -aay option to
|
|
# activate until after they are online
|
|
|
|
_clear_online_files
|
|
touch "$RUNDIR/lvm/pvs_online/foo"
|
|
|
|
pvscan --cache "$dev1"
|
|
check lv_field $vg1/$lv1 lv_active ""
|
|
pvscan --cache "$dev2"
|
|
check lv_field $vg1/$lv1 lv_active ""
|
|
pvscan --cache -aay
|
|
check lv_field $vg1/$lv1 lv_active "active"
|
|
lvchange -an $vg1
|
|
|
|
# like previous
|
|
|
|
_clear_online_files
|
|
touch "$RUNDIR/lvm/pvs_online/foo"
|
|
|
|
pvscan --cache "$dev1"
|
|
check lv_field $vg1/$lv1 lv_active ""
|
|
pvscan --cache -aay "$dev2"
|
|
check lv_field $vg1/$lv1 lv_active "active"
|
|
lvchange -an $vg1
|