From d7eaafe9c11bae6f557d00e53f9921e353cc7390 Mon Sep 17 00:00:00 2001 From: Petr Rockai Date: Wed, 12 May 2010 10:08:35 +0000 Subject: [PATCH] A fairly extensive refactor of the mirror testing code. The exhaustive lvconvert testing is now in its own test, t-lvconvert-mirror-basic ... it doesn't do anything fancy but it does run lvconvert through a lot of combinations. I have also merged the remaining t-mirror-lvconvert tests into t-lvconvert-mirror and abolished the former. The latter will be split again later into more thematic divisions. (The previous split was rather arbitrary, may I even say random...) --- test/check.sh | 62 ++- test/t-lvconvert-mirror-basic.sh | 139 ++++++ test/t-lvconvert-mirror.sh | 178 ++++++- test/t-lvcreate-mirror.sh | 4 +- test/t-mirror-lvconvert.sh | 767 ------------------------------- test/t-vgcreate-usage.sh | 2 + test/test-utils.sh | 30 +- 7 files changed, 378 insertions(+), 804 deletions(-) create mode 100644 test/t-lvconvert-mirror-basic.sh delete mode 100755 test/t-mirror-lvconvert.sh diff --git a/test/check.sh b/test/check.sh index 5da4c9e1a..f87f751d2 100644 --- a/test/check.sh +++ b/test/check.sh @@ -1,5 +1,18 @@ #!/bin/bash +# check.sh: assert various things about volumes + +# USAGE +# check linear VG LV +# check lv_on VG LV PV + +# check mirror VG LV [LOGDEV|core] +# check mirror_nonredundant VG LV +# check mirror_legs VG LV N +# check mirror_images_on VG LV DEV [DEV...] + +# ... + set -e -o pipefail lvl() { @@ -15,7 +28,7 @@ mirror_images_redundant() vg=$1 lv=$vg/$2 - lvs -a $vg + lvs -a $vg -o+devices for i in `lvdevices $lv`; do echo "# $i:" lvdevices $vg/$i | sort | uniq @@ -31,23 +44,26 @@ mirror_images_redundant() } mirror_images_on() { - lv=$1 + vg=$1 + lv=$2 + + shift 2 for i in `lvdevices $lv`; do + lv_on $vg $lv $1 shift - lv_on $lv $1 done } lv_on() { - lv="$1" - lvdevices $lv | grep -F "$2" || { - echo "LV $lv expected on $2 but is not:" >&2 + lv="$1/$2" + lvdevices $lv | grep -F "$3" || { + echo "LV $lv expected on $3 but is not:" >&2 lvdevices $lv >&2 exit 1 } - test `lvdevices $lv | grep -vF "$2" | wc -l` -eq 0 || { + test `lvdevices $lv | grep -vF "$3" | wc -l` -eq 0 || { echo "LV $lv contains unexpected devices:" >&2 lvdevices $lv >&2 exit 1 @@ -56,7 +72,14 @@ lv_on() mirror_log_on() { - lv_on "${1}_mlog" "$2" + vg="$1" + lv="$2" + where="$3" + if test "$where" = "core"; then + lvl -omirror_log "$vg/$lv" | not grep mlog + else + lv_on $vg "${lv}_mlog" "$where" + fi } lv_is_contiguous() @@ -92,14 +115,18 @@ mirror_images_clung() } mirror() { + mirror_nonredundant "$@" + mirror_images_redundant "$1" "$2" +} + +mirror_nonredundant() { lv="$1/$2" - lvl -oattr "$lv" | grep "m" || { + lvs -oattr "$lv" | grep -q "^ *m.....$" || { echo "$lv expected a mirror, but is not:" - lvl -a $lv + lvs -a $lv exit 1 } - mirror_images_redundant "$1" "$2" - if test -n "$3"; then mirror_log_on "$lv" "$3"; fi + if test -n "$3"; then mirror_log_on "$1" "$2" "$3"; fi } mirror_legs() { @@ -110,6 +137,17 @@ mirror_legs() { test "$expect" = "$real" } +mirror_no_temporaries() +{ + vg=$1 + lv=$2 + lvl -oname $vg | grep $lv | not grep "tmp" || { + echo "$lv has temporary mirror images unexpectedly:" + lvl $vg | grep $lv + exit 1 + } +} + linear() { lv="$1/$2" lvl -ostripes "$lv" | grep -q "1" || { diff --git a/test/t-lvconvert-mirror-basic.sh b/test/t-lvconvert-mirror-basic.sh new file mode 100644 index 000000000..bdcc01463 --- /dev/null +++ b/test/t-lvconvert-mirror-basic.sh @@ -0,0 +1,139 @@ +. ./test-utils.sh + +log_name_to_count() +{ + if [ $1 == "mirrored" ]; then + echo 2 + elif [ $1 == "disk" ]; then + echo 1 + else + echo 0 + fi +} + +# FIXME: For test_[up|down]convert, I'd still like to be able +# to specifiy devices - especially if I can do partial PV +# specification for down-converts. It may even be wise to +# do one round through these tests without specifying the PVs +# to use and one round where we do. + +# test_lvconvert +# start_mirror_count: The '-m' argument to create with +# start_log_type: core|disk|mirrored +# final_mirror_count: The '-m' argument to convert to +# final_log_type: core|disk|mirrored +# active: Whether the LV should be active when the convert happens +# +# Exmaple: Convert 3-way disk-log mirror to +# 2-way disk-log mirror while not active +# -> test_lvconvert 2 disk 3 disk 0 + +test_lvconvert() +{ + local start_count=$1 + local start_count_p1=$(($start_count + 1)) + local start_log_type=$2 + local finish_count=$3 + local finish_count_p1=$(($finish_count + 1)) + local finish_log_type=$4 + local dev_array=($dev1 $dev2 $dev3 $dev4 $dev5) + local start_log_count + local finish_log_count + local max_log_count + local alloc="" + local active=true + local i + + if [ $start_log_type == "disk" ] && + [ $finish_log_type == "mirrored" ]; then + echo "FIXME: disk -> mirrored log conversion not yet supported by LVM" + return 0 + fi + + test "$5" = "active" && active=false + #test $finish_count -gt $start_count && up=true + + # Do we have enough devices for the mirror images? + if [ $start_count_p1 -gt ${#dev_array[@]} ]; then + echo "Action requires too many devices" + return 1 + fi + + # Do we have enough devices for the mirror images? + if [ $finish_count_p1 -gt ${#dev_array[@]} ]; then + echo "Action requires too many devices" + return 1 + fi + + start_log_count=`log_name_to_count $start_log_type` + finish_log_count=`log_name_to_count $finish_log_type` + if [ $finish_log_count -gt $start_log_count ]; then + max_log_count=$finish_log_count + else + max_log_count=$start_log_count + fi + + prepare_vg 5 + + if [ $start_count -gt 0 ]; then + # Are there extra devices for the log or do we overlap + if [ $(($start_count_p1 + $start_log_count)) -gt ${#dev_array[@]} ]; then + alloc="--alloc anywhere" + fi + + lvcreate -l2 -m $start_count --mirrorlog $start_log_type \ + -n $lv1 $vg $alloc + check mirror_legs $vg $lv1 $start_count_p1 + # FIXME: check mirror log + else + lvcreate -l2 -n $lv1 $vg + fi + + lvs -a -o name,copy_percent,devices $vg + if ! $active; then + lvchange -an $vg/$lv1 + fi + + # Are there extra devices for the log or do we overlap + if [ $(($finish_count_p1 + $finish_log_count)) -gt ${#dev_array[@]} ]; then + alloc="--alloc anywhere" + fi + + echo y | lvconvert -m $finish_count --mirrorlog $finish_log_type \ + $vg/$lv1 $alloc + + if ! $active; then + lvchange -ay $vg/$lv1 + fi + + check mirror_no_temporaries $vg $lv1 + if [ "$finish_count_p1" -eq 1 ]; then + check linear $vg $lv1 + else + if test -n "$alloc"; then + check mirror_nonredundant $vg $lv1 + else + check mirror $vg $lv1 + fi + check mirror_legs $vg $lv1 $finish_count_p1 + fi +} + +aux prepare_vg 5 + +# Test conversion combinations from linear <-> 4-way mirrors +for i in $(seq 0 4); do + for j in $(seq 0 4); do + for k in core disk mirrored; do + for l in core disk mirrored; do + if test "$i" -eq "$j" && test "$k" = "$l"; then continue; fi + : ---------------------------------------------------- + : "Testing mirror conversion -m$i/$k -> -m$j/$l" + : ---------------------------------------------------- + test_lvconvert $i $k $j $l 0 + test_lvconvert $i $k $j $l 1 + done + done + done +done + diff --git a/test/t-lvconvert-mirror.sh b/test/t-lvconvert-mirror.sh index be30a9649..3a58f3548 100644 --- a/test/t-lvconvert-mirror.sh +++ b/test/t-lvconvert-mirror.sh @@ -10,15 +10,15 @@ # Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA . ./test-utils.sh -aux prepare_vg 5 # convert from linear to 2-way mirror +aux prepare_vg 5 lvcreate -l2 -n $lv1 $vg $dev1 lvconvert -i1 -m+1 $vg/$lv1 $dev2 $dev3:0-1 check mirror $vg $lv1 $dev3 -lvremove -ff $vg # convert from 2-way mirror to linear +aux prepare_vg 5 lvcreate -l2 -m1 -n $lv1 $vg $dev1 $dev2 $dev3:0-1 lvconvert -m-1 $vg/$lv1 check linear $vg $lv1 @@ -26,16 +26,18 @@ lvremove -ff $vg # and now try removing a specific leg (bz453643) lvcreate -l2 -m1 -n $lv1 $vg $dev1 $dev2 $dev3:0-1 lvconvert -m0 $vg/$lv1 $dev2 -check lv_on $vg/$lv1 $dev1 +check lv_on $vg $lv1 $dev1 lvremove -ff $vg # convert from disklog to corelog, active +aux prepare_vg 5 lvcreate -l2 -m1 -n $lv1 $vg $dev1 $dev2 $dev3:0-1 lvconvert -f --mirrorlog core $vg/$lv1 -check mirror $vg $lv1 "" +check mirror $vg $lv1 core lvremove -ff $vg # convert from corelog to disklog, active +aux prepare_vg 5 lvcreate -l2 -m1 --mirrorlog core -n $lv1 $vg $dev1 $dev2 lvconvert --mirrorlog disk $vg/$lv1 $dev3:0-1 check mirror $vg $lv1 $dev3 @@ -43,13 +45,15 @@ lvremove -ff $vg # bz192865: lvconvert log of an inactive mirror lv # convert from disklog to corelog, inactive +aux prepare_vg 5 lvcreate -l2 -m1 -n $lv1 $vg $dev1 $dev2 $dev3:0-1 lvchange -an $vg/$lv1 echo y | lvconvert -f --mirrorlog core $vg/$lv1 -check mirror $vg $lv1 "" +check mirror $vg $lv1 core lvremove -ff $vg # convert from corelog to disklog, inactive +aux prepare_vg 5 lvcreate -l2 -m1 --mirrorlog core -n $lv1 $vg $dev1 $dev2 lvchange -an $vg/$lv1 lvconvert --mirrorlog disk $vg/$lv1 $dev3:0-1 @@ -57,6 +61,7 @@ check mirror $vg $lv1 $dev3 lvremove -ff $vg # convert linear to 2-way mirror with 1 PV +aux prepare_vg 5 lvcreate -l2 -n $lv1 $vg $dev1 not lvconvert -m+1 --mirrorlog core $vg/$lv1 $dev1 lvremove -ff $vg @@ -70,13 +75,166 @@ lvcreate -l2 -m2 -n $lv1 $vg $dev1 $dev2 $dev4 $dev3:0 # This is somewhat timing dependent - sync /could/ finish before # we get a chance to have this command fail should not lvconvert -m-1 $vg/$lv1 $dev1 -while [ `lvs --noheadings -o copy_percent $vg/$lv1` != "100.00" ]; do - sleep 1 -done -lvconvert -m2 $vg/$lv1 $dev1 $dev2 $dev4 $dev3:0 + +lvconvert $vg/$lv1 # wait +lvconvert -m2 $vg/$lv1 $dev1 $dev2 $dev4 $dev3:0 # If the above "should" failed... lvconvert -m-1 $vg/$lv1 $dev1 check mirror_images_on $lv1 $dev2 $dev4 lvconvert -m-1 $vg/$lv1 $dev2 check linear $vg $lv1 -check lv_on $vg/$lv1 $dev4 +check lv_on $vg $lv1 $dev4 + +# No parallel lvconverts on a single LV please + +aux prepare_vg 5 +lvcreate -l5 -m1 -n $lv1 $vg $dev1 $dev2 $dev3:0 +check mirror $vg $lv1 +check mirror_legs $vg $lv1 2 +lvconvert -m+1 -b $vg/$lv1 $dev4 + +# Next convert should fail b/c we can't have 2 at once +should not lvconvert -m+1 $vg/$lv1 $dev5 +lvconvert $vg/$lv1 # wait +lvconvert -m2 $vg/$lv1 # In case the above "should" actually failed + +check mirror $vg $lv1 $dev3 +check mirror_no_temporaries $vg $lv1 +check mirror_legs $vg $lv1 3 + +# add 1 mirror to core log mirror, but +# implicitly keep log as 'core' +aux prepare_vg 5 +lvcreate -l2 -m1 --mirrorlog core -n $lv1 $vg $dev1 $dev2 +lvconvert -m +1 -i1 $vg/$lv1 + +check mirror $vg $lv1 core +check mirror_no_temporaries $vg $lv1 +check mirror_legs $vg $lv1 3 + +# remove 1 mirror from corelog'ed mirror; should retain 'core' log type +aux prepare_vg 5 +lvcreate -l2 -m2 --corelog -n $lv1 $vg +lvconvert -m -1 -i1 $vg/$lv1 + +check mirror $vg $lv1 core +check mirror_no_temporaries $vg $lv1 +check mirror_legs $vg $lv1 2 + +# add 1 mirror then add 1 more mirror during conversion +# FIXME this has been explicitly forbidden? +#aux prepare_vg 5 +#lvcreate -l2 -m1 -n $lv1 $vg $dev1 $dev2 $dev3:0 +#lvconvert -m+1 -b $vg/$lv1 $dev4 +#lvconvert -m+1 $vg/$lv1 $dev5 +# +#check mirror $vg $lv1 $dev3 +#check mirror_no_temporaries $vg $lv1 +#check mirror_legs $vg $lv1 4 + +# Linear to mirror with mirrored log using --alloc anywhere +aux prepare_vg 5 +lvcreate -l2 -n $lv1 $vg $dev1 +lvconvert -m +1 --mirrorlog mirrored $vg/$lv1 $dev1 $dev2 --alloc anywhere +should check mirror $vg $lv1 + +# convert inactive mirror and start polling +aux prepare_vg 5 +lvcreate -l2 -m1 -n $lv1 $vg $dev1 $dev2 $dev3:0 +lvchange -an $vg/$lv1 +lvconvert -m+1 $vg/$lv1 $dev4 +lvchange -ay $vg/$lv1 +lvconvert $vg/$lv1 # wait +check mirror $vg $lv1 $dev3 +check mirror_no_temporaries $vg $lv1 + +# --------------------------------------------------------------------- +# removal during conversion + +# "remove newly added mirror" +aux prepare_vg 5 +lvcreate -l2 -m1 -n $lv1 $vg $dev1 $dev2 $dev3:0 +lvconvert -m+1 -b $vg/$lv1 $dev4 +lvconvert -m-1 $vg/$lv1 $dev4 +lvconvert $vg/$lv1 # wait + +check mirror $vg $lv1 $dev3 +check mirror_no_temporaries $vg $lv1 +check mirror_legs $vg $lv1 2 + +# "remove one of newly added mirrors" +aux prepare_vg 5 +lvcreate -l2 -m1 -n $lv1 $vg $dev1 $dev2 $dev3:0 +lvconvert -m+2 -b $vg/$lv1 $dev4 $dev5 +lvconvert -m-1 $vg/$lv1 $dev4 +lvconvert $vg/$lv1 # wait + +check mirror $vg $lv1 $dev3 +check mirror_no_temporaries $vg $lv1 +check mirror_legs $vg $lv1 3 + +# "remove from original mirror (the original is still mirror)" +aux prepare_vg 5 +lvcreate -l2 -m2 -n $lv1 $vg $dev1 $dev2 $dev5 $dev3:0 +lvconvert -m+1 -b $vg/$lv1 $dev4 +lvconvert -m-1 $vg/$lv1 $dev2 +lvconvert $vg/$lv1 + +check mirror $vg $lv1 $dev3 +check mirror_no_temporaries $vg $lv1 +check mirror_legs $vg $lv1 3 + +# "remove from original mirror (the original becomes linear)" +aux prepare_vg 5 +lvcreate -l2 -m1 -n $lv1 $vg $dev1 $dev2 $dev3:0 +lvconvert -m+1 -b $vg/$lv1 $dev4 +lvconvert -m-1 $vg/$lv1 $dev2 +lvconvert $vg/$lv1 + +check mirror $vg $lv1 $dev3 +check mirror_no_temporaries $vg $lv1 +check mirror_legs $vg $lv1 2 + +# --------------------------------------------------------------------- + +# "rhbz440405: lvconvert -m0 incorrectly fails if all PEs allocated" +aux prepare_vg 5 +lvcreate -l`pvs --noheadings -ope_count $dev1` -m1 -n $lv1 $vg $dev1 $dev2 $dev3:0 +while [ `lvs --noheadings -o copy_percent $vg/$lv1` != "100.00" ]; do sleep 1; done +lvconvert -m0 $vg/$lv1 $dev1 +check linear $vg $lv1 + +# "rhbz264241: lvm mirror doesn't lose it's "M" --nosync attribute after being down and the up converted" +aux prepare_vg 5 +lvcreate -l2 -m1 -n$lv1 --nosync $vg +lvconvert -m0 $vg/$lv1 +lvconvert -m1 $vg/$lv1 +lvs --noheadings -o attr $vg/$lv1 | grep '^ *m' + +# lvconvert from linear (on multiple PVs) to mirror +aux prepare_vg 5 +lvcreate -l 8 -n $lv1 $vg $dev1:0-3 $dev2:0-3 +lvconvert -m1 $vg/$lv1 + +should check mirror $vg $lv1 +check mirror_legs $vg $lv1 2 + +# BZ 463272: disk log mirror convert option is lost if downconvert option is also given +aux prepare_vg 5 +lvcreate -l1 -m2 --corelog -n $lv1 $vg $dev1 $dev2 $dev3 +lvconvert -m1 --mirrorlog disk $vg/$lv1 $dev1 +check mirror $vg $lv1 $dev1 + +# --- +# add mirror and disk log + +# "add 1 mirror and disk log" +aux prepare_vg 5 +lvcreate -l2 -m1 --mirrorlog core -n $lv1 $vg $dev1 $dev2 + +# FIXME on next line, specifying $dev3:0 $dev4 (i.e log device first) fails (!) +lvconvert -m+1 --mirrorlog disk -i1 $vg/$lv1 $dev4 $dev3:0 + +check mirror $vg $lv1 $dev3 +check mirror_no_temporaries $vg $lv1 +check mirror_legs $vg $lv1 3 diff --git a/test/t-lvcreate-mirror.sh b/test/t-lvcreate-mirror.sh index 0e3efdb91..ae3fceb33 100644 --- a/test/t-lvcreate-mirror.sh +++ b/test/t-lvcreate-mirror.sh @@ -20,13 +20,13 @@ lvremove -ff $vg # 2-way mirror with disklog, 3 PVs lvcreate -l2 -m1 -n $lv1 $vg $dev1 $dev2 $dev3:0-1 check mirror_images_redundant $vg $lv1 -check mirror_log_on $vg/$lv1 $dev3 +check mirror_log_on $vg $lv1 $dev3 lvremove -ff $vg # 3-way mirror with disklog, 4 PVs lvcreate -l2 -m2 --mirrorlog disk -n $lv1 $vg $dev1 $dev2 $dev4 $dev3:0-1 check mirror_images_redundant $vg $lv1 -check mirror_log_on $vg/$lv1 $dev3 +check mirror_log_on $vg $lv1 $dev3 lvremove -ff $vg # lvcreate --nosync is in 100% sync after creation (bz429342) diff --git a/test/t-mirror-lvconvert.sh b/test/t-mirror-lvconvert.sh deleted file mode 100755 index 1477b3d52..000000000 --- a/test/t-mirror-lvconvert.sh +++ /dev/null @@ -1,767 +0,0 @@ -# Copyright (C) 2008 Red Hat, Inc. All rights reserved. -# Copyright (C) 2007 NEC Corporation -# -# 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - -. ./test-utils.sh - -mimages_are_redundant_ () -{ - local vg=$1 - local lv=$vg/$2 - local i - - rm -f out - for i in $(lvs -odevices --noheadings $lv | sed 's/([^)]*)//g; s/,/ /g'); do - lvs -a -o+devices $vg/$i - lvs -a -odevices --noheadings $vg/$i | sed 's/([^)]*)//g; s/,/ /g' | \ - sort | uniq >> out - done - - # if any duplication is found, it's not redundant - sort out | uniq -d | grep . && return 1 - - return 0 -} - -lv_is_contiguous_ () -{ - local lv=$1 - - # if the lv has multiple segments, it's not contiguous - lvs -a --segments $lv - [ $(lvs -a --segments --noheadings $lv | wc -l) -ne 1 ] && return 1 - - return 0 -} - -mimages_are_contiguous_ () -{ - local vg=$1 - local lv=$vg/$2 - local i - - for i in $(lvs -odevices --noheadings $lv | sed 's/([^)]*)//g; s/,/ /g'); do - lv_is_contiguous_ $vg/$i || return 1 - done - - return 0 -} - -mirrorlog_is_on_() -{ - local lv="$1"_mlog - shift 1 - if ! lvs -a $lv; then return 0; fi # FIXME? - lvs -a -o+devices $lv - lvs -a -odevices --noheadings $lv | sed 's/,/\n/g' > out - for d in $*; do grep "$d(" out || return 1; done - for d in $*; do grep -v "$d(" out > out2 || true; mv out2 out; done - grep . out && return 1 - return 0 -} - -save_dev_sum_() -{ - mkfs.ext3 $1 > /dev/null && - md5sum $1 > md5.$(basename $1) -} - -check_dev_sum_() -{ - md5sum $1 > md5.tmp && cmp md5.$(basename $1) md5.tmp -} - -check_mirror_count_() -{ - local lv=$1 - local mirrors=$2 - [ "$mirrors" -eq "$(lvs --noheadings -ostripes $lv)" ] -} - -check_mirror_log_() -{ - local lv=$1 - local mlog=$(lvs --noheadings -omirror_log $lv | sed -e 's/ //g') - [ "$(basename $lv)_mlog" == "$mlog" ] -} - -wait_conversion_() -{ - local lv=$1 - while (lvs --noheadings -oattr "$lv" | grep -q '^ *c'); do sleep 1; done -} - -wait_sync_() -{ - local lv=$1 - while [ `lvs --noheadings -o copy_percent $lv` != "100.00" ]; do sleep 1; done -} - -check_no_tmplvs_() -{ - local lv=$1 - lvs -a -oname $(dirname $lv) - lvs -a --noheadings -oname $(dirname $lv) > out - ! grep tmp out -} - -aux prepare_vg 5 200 - -# --------------------------------------------------------------------- -# Common environment setup/cleanup for each sub testcases - -prepare_lvs_() -{ - lvremove -ff $vg - if dmsetup table|grep $vg; then - echo "ERROR: lvremove did leave some some mappings in DM behind!" - return 1 - fi - : -} - -check_and_cleanup_lvs_() -{ - lvs -a -o+devices $vg - lvremove -ff $vg - if dmsetup table|grep $vg; then - echo "ERROR: lvremove did leave some some mappings in DM behind!" - return 1 - fi -} - -not_sh () -{ - "$@" && exit 1 || :; -} - -# --------------------------------------------------------------------- -# Main repeating test function - -log_name_to_count() -{ - if [ $1 == "mirrored" ]; then - echo 2 - elif [ $1 == "disk" ]; then - echo 1 - else - echo 0 - fi -} - -# -# FIXME: For test_[up|down]convert, I'd still like to be able -# to specifiy devices - especially if I can do partial PV -# specification for down-converts. It may even be wise to -# do one round through these tests without specifying the PVs -# to use and one round where we do. -# - -# -# test_upconvert -# start_mirror_count: The '-m' argument to create with -# start_log_type: core|disk|mirrored -# final_mirror_count: The '-m' argument to convert to -# final_log_type: core|disk|mirrored -# active: Whether the LV should be active when the convert happens -# -# Exmaple: Convert 2-way disk-log mirror to -# 3-way disk-log mirror while not active -# -> test_upconvert 1 disk 2 disk 0 -test_upconvert() -{ - local start_count=$1 - local start_count_p1=$(($start_count + 1)) - local start_log_type=$2 - local finish_count=$3 - local finish_count_p1=$(($finish_count + 1)) - local finish_log_type=$4 - local dev_array=($dev1 $dev2 $dev3 $dev4 $dev5) - local create_devs="" - local convert_devs="" - local log_devs="" - local start_log_count - local finish_log_count - local max_log_count - local alloc="" - local active=true - local i - - if [ $start_log_type == "disk" ] && - [ $finish_log_type == "mirrored" ]; then - echo "FIXME: disk -> mirrored log conversion not yet supported by LVM" - return 0 - fi - - if [ $5 -eq 0 ]; then - active=false - fi - - # Do we have enough devices for the mirror images? - if [ $finish_count_p1 -gt ${#dev_array[@]} ]; then - echo "Action requires too many devices" - return 1 - fi - - start_log_count=`log_name_to_count $start_log_type` - finish_log_count=`log_name_to_count $finish_log_type` - if [ $finish_log_count -gt $start_log_count ]; then - max_log_count=$finish_log_count - else - max_log_count=$start_log_count - fi - - # First group of devs for create -# for i in $(seq 0 $start_count); do -# create_devs="$create_devs ${dev_array[$i]}" -# done - - # Second group of devs for convert -# for i in $(seq $start_count_p1 $finish_count); do -# convert_devs="$convert_devs ${dev_array[$i]}" -# done - - # Third (or overlapping) group of devs for log -# for i in $(seq $((${#dev_array[@]} - $max_log_count)) $((${#dev_array[@]} - 1))); do -# if [ $i -gt $finish_count ]; then -# log_devs="$log_devs ${dev_array[$i]}:0" -# else -# log_devs="$log_devs ${dev_array[$i]}" -# fi -# done - - prepare_lvs_ - if [ $start_count -gt 0 ]; then - # Are there extra devices for the log or do we overlap - if [ $(($start_count_p1 + $start_log_count)) -gt ${#dev_array[@]} ]; then - alloc="--alloc anywhere" - fi - - lvcreate -l2 -m $start_count --mirrorlog $start_log_type \ - -n $lv1 $vg $alloc $create_devs $log_devs || return 1 - check_mirror_count_ $vg/$lv1 $start_count_p1 - # FIXME: check mirror log - else - lvcreate -l15 -n $lv1 $vg $create_devs || return 1 - fi - - lvs -a -o name,copy_percent,devices $vg - if ! $active; then - lvchange -an $vg/$lv1 || return 1 - fi - - # Are there extra devices for the log or do we overlap - if [ $(($finish_count_p1 + $finish_log_count)) -gt ${#dev_array[@]} ]; then - alloc="--alloc anywhere" - fi - echo y | lvconvert -m $finish_count --mirrorlog $finish_log_type \ - $vg/$lv1 $alloc $convert_devs $log_devs || return 1 - - if ! $active; then - lvchange -ay $vg/$lv1 || return 1 - fi - - wait_conversion_ $vg/$lv1 - lvs -a -o name,copy_percent,devices $vg - check_no_tmplvs_ $vg/$lv1 - check_mirror_count_ $vg/$lv1 $finish_count_p1 - mimages_are_redundant_ $vg $lv1 - check_and_cleanup_lvs_ -} - -# -# test_downconvert -# start_mirror_count: The '-m' argument to create with -# start_log_type: core|disk|mirrored -# final_mirror_count: The '-m' argument to convert to -# final_log_type: core|disk|mirrored -# active: Whether the LV should be active when the convert happens -# -# Exmaple: Convert 3-way disk-log mirror to -# 2-way disk-log mirror while not active -# -> test_downconvert 2 disk 3 disk 0 -test_downconvert() -{ - local start_count=$1 - local start_count_p1=$(($start_count + 1)) - local start_log_type=$2 - local finish_count=$3 - local finish_count_p1=$(($finish_count + 1)) - local finish_log_type=$4 - local dev_array=($dev1 $dev2 $dev3 $dev4 $dev5) - local create_devs="" - local convert_devs="" - local log_devs="" - local start_log_count - local finish_log_count - local max_log_count - local alloc="" - local active=true - local i - - if [ $start_log_type == "disk" ] && - [ $finish_log_type == "mirrored" ]; then - echo "FIXME: disk -> mirrored log conversion not yet supported by LVM" - return 0 - fi - - if [ $5 -eq 0 ]; then - active=false - fi - - # Do we have enough devices for the mirror images? - if [ $start_count_p1 -gt ${#dev_array[@]} ]; then - echo "Action requires too many devices" - return 1 - fi - - start_log_count=`log_name_to_count $start_log_type` - finish_log_count=`log_name_to_count $finish_log_type` - if [ $finish_log_count -gt $start_log_count ]; then - max_log_count=$finish_log_count - else - max_log_count=$start_log_count - fi - - # First group of devs for create -# for i in $(seq 0 $start_count); do -# create_devs="$create_devs ${dev_array[$i]}" -# done - - # Same devices for convert (because we are down-converting) -# for i in $(seq 0 $start_count); do -# convert_devs="$convert_devs ${dev_array[$i]}" -# done - - # Third (or overlapping) group of devs for log creation -# for i in $(seq $((${#dev_array[@]} - $max_log_count)) $((${#dev_array[@]} - 1))); do -# if [ $i -gt $start_count ]; then -# log_devs="$log_devs ${dev_array[$i]}:0" -# else -# log_devs="$log_devs ${dev_array[$i]}" -# fi -# done - - prepare_lvs_ - if [ $start_count -gt 0 ]; then - # Are there extra devices for the log or do we overlap - if [ $(($start_count_p1 + $start_log_count)) -gt ${#dev_array[@]} ]; then - alloc="--alloc anywhere" - fi - - lvcreate -l2 -m $start_count --mirrorlog $start_log_type \ - -n $lv1 $vg $alloc $create_devs $log_devs || return 1 - check_mirror_count_ $vg/$lv1 $start_count_p1 - # FIXME: check mirror log - else - lvcreate -l15 -n $lv1 $vg $create_devs || return 1 - fi - - lvs -a -o name,copy_percent,devices $vg - if ! $active; then - lvchange -an $vg/$lv1 || return 1 - fi - - # Are there extra devices for the log or do we overlap - if [ $(($finish_count_p1 + $finish_log_count)) -gt ${#dev_array[@]} ]; then - alloc="--alloc anywhere" - fi - - echo y | lvconvert -m $finish_count --mirrorlog $finish_log_type \ - $vg/$lv1 $alloc $convert_devs $log_devs || return 1 - - if ! $active; then - lvchange -ay $vg/$lv1 || return 1 - fi - - wait_conversion_ $vg/$lv1 - lvs -a -o name,copy_percent,devices $vg - check_no_tmplvs_ $vg/$lv1 - check_mirror_count_ $vg/$lv1 $finish_count_p1 - mimages_are_redundant_ $vg $lv1 - check_and_cleanup_lvs_ -} - -# test_convert -# start_image_count -# start_log_type -# finish_image_count -# finish_log_type -test_convert() -{ - if [ $1 -lt $3 ]; then - test_upconvert $1 $2 $3 $4 0 || return 1 - test_upconvert $1 $2 $3 $4 1 || return 1 - else - test_downconvert $1 $2 $3 $4 0 || return 1 - test_downconvert $1 $2 $3 $4 1 || return 1 - fi -} - - -prepare_lvs_ -check_and_cleanup_lvs_ - -# --------------------------------------------------------------------- -# mirrored LV tests - -# --- -# Test conversion combinations from linear <-> 4-way mirrors -for i in $(seq 0 4); do - for j in $(seq 0 4); do - for k in core disk mirrored; do - for l in core disk mirrored; do - ############################################# - echo "Testing mirror conversion -m$i/$k -> -m$j/$l" - test_convert $i $k $j $l - ############################################# - done - done - done -done - -# --- -# add mirror to mirror -prepare_lvs_ -lvs -a -o+devices $vg -lvcreate -l15 -m1 -n $lv1 $vg $dev1 $dev2 $dev3:0 -lvs -a -o+devices $vg -check_mirror_count_ $vg/$lv1 2 -check_mirror_log_ $vg/$lv1 -lvconvert -m+1 -i 20 -b $vg/$lv1 $dev4 -# Next convert should fail b/c we can't have 2 at once -not lvconvert -m+1 -b $vg/$lv1 $dev5 -wait_conversion_ $vg/$lv1 -lvs -a -o+devices $vg -check_no_tmplvs_ $vg/$lv1 -check_mirror_count_ $vg/$lv1 3 -mimages_are_redundant_ $vg $lv1 -mirrorlog_is_on_ $vg/$lv1 $dev3 -check_and_cleanup_lvs_ - -# add 1 mirror -prepare_lvs_ -lvs -a -o+devices $vg -lvcreate -l15 -m1 -n $lv1 $vg $dev1 $dev2 $dev3:0 -lvs -a -o+devices $vg -check_mirror_count_ $vg/$lv1 2 -check_mirror_log_ $vg/$lv1 -lvconvert -m+1 -i 20 -b $vg/$lv1 $dev4 -# Next convert should fail b/c we can't have 2 at once -not lvconvert -m+1 -b $vg/$lv1 $dev5 -wait_conversion_ $vg/$lv1 -lvs -a -o+devices $vg -check_no_tmplvs_ $vg/$lv1 -check_mirror_count_ $vg/$lv1 3 -mimages_are_redundant_ $vg $lv1 -mirrorlog_is_on_ $vg/$lv1 $dev3 -check_and_cleanup_lvs_ - -# remove 1 mirror from corelog'ed mirror -# should retain 'core' log type -prepare_lvs_ -lvs -a -o+devices $vg -lvcreate -l2 -m2 --corelog -n $lv1 $vg -lvs -a -o+devices $vg -check_mirror_count_ $vg/$lv1 3 -not_sh check_mirror_log_ $vg/$lv1 -lvconvert -m -1 -i1 $vg/$lv1 -lvs -a -o+devices $vg -check_no_tmplvs_ $vg/$lv1 -check_mirror_count_ $vg/$lv1 2 -mimages_are_redundant_ $vg $lv1 -not_sh check_mirror_log_ $vg/$lv1 -check_and_cleanup_lvs_ - -# add 2 mirrors -prepare_lvs_ -lvs -a -o+devices $vg -lvcreate -l2 -m1 -n $lv1 $vg $dev1 $dev2 $dev3:0 -lvs -a -o+devices $vg -check_mirror_count_ $vg/$lv1 2 -check_mirror_log_ $vg/$lv1 -lvconvert -m+2 -i1 $vg/$lv1 $dev4 $dev5 -lvs -a -o+devices $vg -check_no_tmplvs_ $vg/$lv1 -check_mirror_count_ $vg/$lv1 4 -mimages_are_redundant_ $vg $lv1 -mirrorlog_is_on_ $vg/$lv1 $dev3 -check_and_cleanup_lvs_ - -# add 1 mirror to core log mirror, -# explicitly keep log as 'core' -prepare_lvs_ -lvs -a -o+devices $vg -lvcreate -l2 -m1 --mirrorlog core -n $lv1 $vg $dev1 $dev2 -lvs -a -o+devices $vg -check_mirror_count_ $vg/$lv1 2 -not_sh check_mirror_log_ $vg/$lv1 -lvconvert -m+1 -i1 --mirrorlog core $vg/$lv1 $dev4 -lvs -a -o+devices $vg -check_no_tmplvs_ $vg/$lv1 -check_mirror_count_ $vg/$lv1 3 -not_sh check_mirror_log_ $vg/$lv1 -mimages_are_redundant_ $vg $lv1 -check_and_cleanup_lvs_ - -# add 1 mirror to core log mirror, but -# implicitly keep log as 'core' -prepare_lvs_ -lvs -a -o+devices $vg -lvcreate -l2 -m1 --mirrorlog core -n $lv1 $vg $dev1 $dev2 -lvs -a -o+devices $vg -check_mirror_count_ $vg/$lv1 2 -not_sh check_mirror_log_ $vg/$lv1 -lvconvert -m +1 -i1 $vg/$lv1 -lvs -a -o+devices $vg -check_no_tmplvs_ $vg/$lv1 -check_mirror_count_ $vg/$lv1 3 -not_sh check_mirror_log_ $vg/$lv1 -mimages_are_redundant_ $vg $lv1 -check_and_cleanup_lvs_ - -# add 2 mirrors to core log mirror" -prepare_lvs_ -lvs -a -o+devices $vg -lvcreate -l2 -m1 --mirrorlog core -n $lv1 $vg $dev1 $dev2 -lvs -a -o+devices $vg -check_mirror_count_ $vg/$lv1 2 -not_sh check_mirror_log_ $vg/$lv1 -lvconvert -m+2 -i1 --mirrorlog core $vg/$lv1 $dev4 $dev5 -lvs -a -o+devices $vg -check_no_tmplvs_ $vg/$lv1 -check_mirror_count_ $vg/$lv1 4 -not_sh check_mirror_log_ $vg/$lv1 -mimages_are_redundant_ $vg $lv1 -check_and_cleanup_lvs_ - -# --- -# add to converting mirror - -# add 1 mirror then add 1 more mirror during conversion -prepare_lvs_ -lvs -a -o+devices $vg -lvcreate -l2 -m1 -n $lv1 $vg $dev1 $dev2 $dev3:0 -lvs -a -o+devices $vg -check_mirror_count_ $vg/$lv1 2 -check_mirror_log_ $vg/$lv1 -lvconvert -m+1 -b $vg/$lv1 $dev4 -lvs -a -o+devices $vg -lvconvert -m+1 -i3 $vg/$lv1 $dev5 -lvs -a -o+devices $vg -check_no_tmplvs_ $vg/$lv1 -check_mirror_count_ $vg/$lv1 4 -mimages_are_redundant_ $vg $lv1 -mirrorlog_is_on_ $vg/$lv1 $dev3 -check_and_cleanup_lvs_ - -# --- -# core log to mirrored log - -# change the log type from 'core' to 'mirrored' -prepare_lvs_ -lvcreate -l2 -m1 --mirrorlog core -n $lv1 $vg $dev1 $dev2 -check_mirror_count_ $vg/$lv1 2 -not_sh check_mirror_log_ $vg/$lv1 -lvconvert --mirrorlog mirrored -i1 $vg/$lv1 $dev3 $dev4 -check_no_tmplvs_ $vg/$lv1 -check_mirror_log_ $vg/$lv1 -mimages_are_redundant_ $vg $lv1 - -# --- -# mirrored log to core log - -# change the log type from 'mirrored' to 'core' -lvconvert --mirrorlog core -i1 $vg/$lv1 $dev3 $dev4 -check_no_tmplvs_ $vg/$lv1 -not_sh check_mirror_log_ $vg/$lv1 -mimages_are_redundant_ $vg $lv1 -check_and_cleanup_lvs_ - -# --- -# Linear to mirror with mirrored log using --alloc anywhere -prepare_lvs_ -lvcreate -l2 -n $lv1 $vg $dev1 -lvconvert -m +1 --mirrorlog mirrored $vg/$lv1 $dev1 $dev2 --alloc anywhere -# FIXME Disable next check: --alloc anywhere makes *no* guarantees about placement - that's the entire point of it! -#mimages_are_redundant_ $vg $lv1 -check_and_cleanup_lvs_ - - -# --- -# check polldaemon restarts - -# convert inactive mirror and start polling -prepare_lvs_ -lvs -a -o+devices $vg -lvcreate -l2 -m1 -n $lv1 $vg $dev1 $dev2 $dev3:0 -lvs -a -o+devices $vg -check_mirror_count_ $vg/$lv1 2 -lvchange -an $vg/$lv1 -lvconvert -m+1 $vg/$lv1 $dev4 -lvs -a -o+devices $vg -lvchange -ay $vg/$lv1 -wait_conversion_ $vg/$lv1 -lvs -a -o+devices $vg -check_no_tmplvs_ $vg/$lv1 -check_and_cleanup_lvs_ - -# --------------------------------------------------------------------- -# removal during conversion - -# "remove newly added mirror" -prepare_lvs_ -lvs -a -o+devices $vg -lvcreate -l2 -m1 -n $lv1 $vg $dev1 $dev2 $dev3:0 -lvs -a -o+devices $vg -check_mirror_count_ $vg/$lv1 2 -check_mirror_log_ $vg/$lv1 -lvconvert -m+1 -b $vg/$lv1 $dev4 -lvs -a -o+devices $vg -lvconvert -m-1 $vg/$lv1 $dev4 -lvs -a -o+devices $vg -wait_conversion_ $vg/$lv1 -lvs -a -o+devices $vg -check_no_tmplvs_ $vg/$lv1 -check_mirror_count_ $vg/$lv1 2 -mimages_are_redundant_ $vg $lv1 -mirrorlog_is_on_ $vg/$lv1 $dev3 -check_and_cleanup_lvs_ - -# "remove one of newly added mirrors" -prepare_lvs_ -lvs -a -o+devices $vg -lvcreate -l2 -m1 -n $lv1 $vg $dev1 $dev2 $dev3:0 -lvs -a -o+devices $vg -check_mirror_count_ $vg/$lv1 2 -check_mirror_log_ $vg/$lv1 -lvconvert -m+2 -b $vg/$lv1 $dev4 $dev5 -lvs -a -o+devices $vg -lvconvert -m-1 $vg/$lv1 $dev4 -lvs -a -o+devices $vg -lvconvert -i1 $vg/$lv1 -lvs -a -o+devices $vg -wait_conversion_ $vg/$lv1 -lvs -a -o+devices $vg -check_no_tmplvs_ $vg/$lv1 -check_mirror_count_ $vg/$lv1 3 -mimages_are_redundant_ $vg $lv1 -mirrorlog_is_on_ $vg/$lv1 $dev3 -check_and_cleanup_lvs_ - -# "remove from original mirror (the original is still mirror)" -prepare_lvs_ -lvs -a -o+devices $vg -lvcreate -l2 -m2 -n $lv1 $vg $dev1 $dev2 $dev5 $dev3:0 -lvs -a -o+devices $vg -check_mirror_count_ $vg/$lv1 3 -check_mirror_log_ $vg/$lv1 -lvconvert -m+1 -b $vg/$lv1 $dev4 -lvs -a -o+devices $vg -lvconvert -m-1 $vg/$lv1 $dev2 -lvs -a -o+devices $vg -lvconvert -i1 $vg/$lv1 -lvs -a -o+devices $vg -wait_conversion_ $vg/$lv1 -lvs -a -o+devices $vg -check_no_tmplvs_ $vg/$lv1 -check_mirror_count_ $vg/$lv1 3 -mimages_are_redundant_ $vg $lv1 -mirrorlog_is_on_ $vg/$lv1 $dev3 -check_and_cleanup_lvs_ - -# "remove from original mirror (the original becomes linear)" -prepare_lvs_ -lvs -a -o+devices $vg -lvcreate -l2 -m1 -n $lv1 $vg $dev1 $dev2 $dev3:0 -lvs -a -o+devices $vg -check_mirror_count_ $vg/$lv1 2 -check_mirror_log_ $vg/$lv1 -lvconvert -m+1 -b $vg/$lv1 $dev4 -lvs -a -o+devices $vg -lvconvert -m-1 $vg/$lv1 $dev2 -lvs -a -o+devices $vg -lvconvert -i1 $vg/$lv1 -lvs -a -o+devices $vg -wait_conversion_ $vg/$lv1 -lvs -a -o+devices $vg -check_no_tmplvs_ $vg/$lv1 -check_mirror_count_ $vg/$lv1 2 -mimages_are_redundant_ $vg $lv1 -mirrorlog_is_on_ $vg/$lv1 $dev3 -check_and_cleanup_lvs_ - -# --------------------------------------------------------------------- - -# "rhbz440405: lvconvert -m0 incorrectly fails if all PEs allocated" -prepare_lvs_ -lvs -a -o+devices $vg -lvcreate -l`pvs --noheadings -ope_count $dev1` -m1 -n $lv1 $vg $dev1 $dev2 $dev3:0 -lvs -a -o+devices $vg -check_mirror_count_ $vg/$lv1 2 -check_mirror_log_ $vg/$lv1 -wait_sync_ $vg/$lv1 # cannot pull primary unless mirror in-sync -lvconvert -m0 $vg/$lv1 $dev1 -lvs -a -o+devices $vg -check_no_tmplvs_ $vg/$lv1 -check_mirror_count_ $vg/$lv1 1 -check_and_cleanup_lvs_ - -# "rhbz264241: lvm mirror doesn't lose it's "M" --nosync attribute after being down and the up converted" -prepare_lvs_ -lvs -a -o+devices $vg -lvcreate -l2 -m1 -n$lv1 --nosync $vg -lvs -a -o+devices $vg -lvconvert -m0 $vg/$lv1 -lvs -a -o+devices $vg -lvconvert -m1 $vg/$lv1 -lvs -a -o+devices $vg -lvs --noheadings -o attr $vg/$lv1 | grep '^ *m' -check_and_cleanup_lvs_ - -# lvconvert from linear (on multiple PVs) to mirror -prepare_lvs_ -lvs -a -o+devices $vg -lvcreate -l 8 -n $lv1 $vg $dev1:0-3 $dev2:0-3 -lvs -a -o+devices $vg -lvconvert -m1 $vg/$lv1 -lvs -a -o+devices $vg -check_mirror_count_ $vg/$lv1 2 -check_mirror_log_ $vg/$lv1 -check_and_cleanup_lvs_ - -# BZ 463272: disk log mirror convert option is lost if downconvert option is also given -prepare_lvs_ -lvs -a -o+devices $vg -lvcreate -l1 -m2 --corelog -n $lv1 $vg -lvs -a -o+devices $vg -lvconvert -m1 --mirrorlog disk $vg/$lv1 -lvs -a -o+devices $vg -check_mirror_log_ $vg/$lv1 - -# --- -# add mirror and disk log - -# "add 1 mirror and disk log" -prepare_lvs_ -lvs -a -o+devices $vg -lvcreate -l2 -m1 --mirrorlog core -n $lv1 $vg $dev1 $dev2 -lvs -a -o+devices $vg -check_mirror_count_ $vg/$lv1 2 -not_sh check_mirror_log_ $vg/$lv1 -# FIXME on next line, specifying $dev3:0 $dev4 (i.e log device first) fails (!) -lvconvert -m+1 --mirrorlog disk -i1 $vg/$lv1 $dev4 $dev3:0 -lvs -a -o+devices $vg -check_no_tmplvs_ $vg/$lv1 -check_mirror_count_ $vg/$lv1 3 -check_mirror_log_ $vg/$lv1 -mimages_are_redundant_ $vg $lv1 -mirrorlog_is_on_ $vg/$lv1 $dev3 -check_and_cleanup_lvs_ diff --git a/test/t-vgcreate-usage.sh b/test/t-vgcreate-usage.sh index 533d370c8..ffdad5378 100755 --- a/test/t-vgcreate-usage.sh +++ b/test/t-vgcreate-usage.sh @@ -17,6 +17,8 @@ aux prepare_devs 3 pvcreate $dev1 $dev2 pvcreate --metadatacopies 0 $dev3 +vg=${PREFIX}vg + #COMM 'vgcreate accepts 8.00m physicalextentsize for VG' vgcreate -c n $vg --physicalextentsize 8.00m $dev1 $dev2 check_vg_field_ $vg vg_extent_size 8.00m diff --git a/test/test-utils.sh b/test/test-utils.sh index 3825137df..e85717920 100644 --- a/test/test-utils.sh +++ b/test/test-utils.sh @@ -94,7 +94,7 @@ prepare_testroot() { trap_teardown TESTDIR=$($abs_srcdir/mkdtemp ${LVM_TEST_DIR-$(pwd)} $PREFIX.XXXXXXXXXX) \ - || { echo "failed to create temporary directory in $test_dir_"; exit 1; } + || { echo "failed to create temporary directory in ${LVM_TEST_DIR-$(pwd)}"; exit 1; } export LVM_SYSTEM_DIR=$TESTDIR/etc export DM_DEV_DIR=$TESTDIR/dev @@ -131,6 +131,7 @@ teardown_devs() { test -n "$LOOPFILE" && rm -f $LOOPFILE fi unset devs # devs is set in prepare_devs() + unset LOOP } teardown() { @@ -178,7 +179,7 @@ prepare_loop() { trap_teardown for i in 0 1 2 3 4 5 6 7; do - mknod $DM_DEV_DIR/loop$i b 7 $i + test -e $DM_DEV_DIR/loop$i || mknod $DM_DEV_DIR/loop$i b 7 $i done LOOPFILE="$PWD/test.img" @@ -291,16 +292,6 @@ prepare_devs() { local name="${PREFIX}$pvname$i" dmsetup table $name done - - # set up some default names - vg=${PREFIX}vg - vg1=${PREFIX}vg1 - vg2=${PREFIX}vg2 - lv=LV - lv1=LV1 - lv2=LV2 - lv3=LV3 - lv4=LV4 } disable_dev() { @@ -346,10 +337,13 @@ restore_dev() { prepare_pvs() { prepare_devs "$@" - pvcreate $devs + pvcreate -ff $devs } prepare_vg() { + vgremove -ff $vg || true + teardown_devs + prepare_pvs "$@" vgcreate -c n $vg $devs pvs -v @@ -400,6 +394,16 @@ prepare() { prepare_testroot prepare_lvmconf prepare_clvmd + + # set up some default names + vg=${PREFIX}vg + vg1=${PREFIX}vg1 + vg2=${PREFIX}vg2 + lv=LV + lv1=LV1 + lv2=LV2 + lv3=LV3 + lv4=LV4 } LANG=C -- 2.43.5