diff options
author | Petr Rockai <prockai@redhat.com> | 2011-11-21 00:15:42 +0000 |
---|---|---|
committer | Petr Rockai <prockai@redhat.com> | 2011-11-21 00:15:42 +0000 |
commit | f2a3f0fe3dfb34b9d7344fae51083c392cfba8a8 (patch) | |
tree | 9009837b943364a498499117934d47c9439db3d6 /test/shell | |
parent | cfe1ec8d1faa249fa86d0be27b41ac2b26736fe8 (diff) | |
download | lvm2-f2a3f0fe3dfb34b9d7344fae51083c392cfba8a8.tar.gz lvm2-f2a3f0fe3dfb34b9d7344fae51083c392cfba8a8.tar.xz lvm2-f2a3f0fe3dfb34b9d7344fae51083c392cfba8a8.zip |
Tidy the shell tests into their own subdir. We now have:
- test/lib -- infrastructure and helper code
- test/api -- liblvm2app API tests
- test/unit -- C-based unit tests
- test/shell -- shell-based functional tests
Diffstat (limited to 'test/shell')
87 files changed, 6982 insertions, 0 deletions
diff --git a/test/shell/000-basic.sh b/test/shell/000-basic.sh new file mode 100644 index 00000000..0b54d952 --- /dev/null +++ b/test/shell/000-basic.sh @@ -0,0 +1,28 @@ +# Copyright (C) 2009-2011 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + +. lib/test + +lvm version + +v=$abs_top_srcdir/lib/misc/lvm-version.h +sed -n "/#define LVM_VERSION ./s///p" "$v" | sed "s/ .*//" > expected + +lvm pvmove --version|sed -n "1s/.*: *\([0-9][^ ]*\) .*/\1/p" > actual + +# ensure they are the same +diff -u actual expected + +# ensure we can create devices (uses dmsetup, etc) +aux prepare_devs 5 + +# ensure we do not crash on a bug in config file +aux lvmconf 'log/prefix = 1""' +not lvs diff --git a/test/shell/activate-missing.sh b/test/shell/activate-missing.sh new file mode 100644 index 00000000..1a85a348 --- /dev/null +++ b/test/shell/activate-missing.sh @@ -0,0 +1,87 @@ +#!/bin/bash + +# Copyright (C) 2010 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + +# Test activation behaviour with devices missing. +# - snapshots and their origins are only activated together; if one fails, both +# fail +# - partial mirrors are not activated (but maybe they should? maybe we should +# instead lvconvert --repair them?) +# - linear LVs with bits missing are not activated + +. lib/test + +aux prepare_vg 4 + +lvcreate -l1 -n linear1 $vg $dev1 +lvcreate -l1 -n linear2 $vg $dev2 +lvcreate -l2 -n linear12 $vg $dev1:4 $dev2:4 + +lvcreate -l1 -n origin1 $vg $dev1 +lvcreate -s $vg/origin1 -l1 -n s_napshot2 $dev2 + +lvcreate -l1 -m1 -n mirror12 --mirrorlog core $vg $dev1 $dev2 +lvcreate -l1 -m1 -n mirror123 $vg $dev1 $dev2 $dev3 + +vgchange -a n $vg +aux disable_dev $dev1 +not vgchange -a y $vg +not vgck $vg + +check inactive $vg linear1 +check active $vg linear2 +check inactive $vg origin1 +check inactive $vg s_napshot2 +check inactive $vg linear12 +check inactive $vg mirror12 +check inactive $vg mirror123 + +vgchange -a n $vg +aux enable_dev $dev1 +aux disable_dev $dev2 +not vgchange -a y $vg +not vgck $vg + +check active $vg linear1 +check inactive $vg linear2 +check inactive $vg linear12 +check inactive $vg origin1 +check inactive $vg s_napshot2 +check inactive $vg mirror12 +check inactive $vg mirror123 + +vgchange -a n $vg +aux enable_dev $dev2 +aux disable_dev $dev3 +not vgchange -a y $vg +not vgck $vg + +check active $vg origin1 +check active $vg s_napshot2 +check active $vg linear1 +check active $vg linear2 +check active $vg linear12 +check inactive $vg mirror123 +check active $vg mirror12 + +vgchange -a n $vg +aux enable_dev $dev3 +aux disable_dev $dev4 +vgchange -a y $vg +not vgck $vg + +check active $vg origin1 +check active $vg s_napshot2 +check active $vg linear1 +check active $vg linear2 +check active $vg linear12 +check active $vg mirror12 +check active $vg mirror123 diff --git a/test/shell/activate-partial.sh b/test/shell/activate-partial.sh new file mode 100644 index 00000000..204e68f4 --- /dev/null +++ b/test/shell/activate-partial.sh @@ -0,0 +1,30 @@ +# Copyright (C) 2010 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + +. lib/test + +aux prepare_vg 3 + +lvcreate -m 1 -l 1 -n mirror $vg +lvchange -a n $vg/mirror +aux disable_dev $dev1 + +not vgreduce --removemissing $vg +not lvchange -v -a y $vg/mirror +lvchange -v --partial -a y $vg/mirror +not lvchange -v --refresh $vg/mirror +lvchange -v --refresh --partial $vg/mirror + +# also check that vgchange works +vgchange -a n --partial $vg +vgchange -a y --partial $vg + +# check vgremove +vgremove -f $vg diff --git a/test/shell/clvmd-restart.sh b/test/shell/clvmd-restart.sh new file mode 100644 index 00000000..2b341e57 --- /dev/null +++ b/test/shell/clvmd-restart.sh @@ -0,0 +1,53 @@ +#!/bin/sh +# Copyright (C) 2011 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + +# set before test's clvmd is started, so it's passed in environ +export LVM_CLVMD_BINARY=clvmd +export LVM_BINARY=lvm + +. lib/test + +# only clvmd based test, skip otherwise +test -e LOCAL_CLVMD || skip +read LOCAL_CLVMD < LOCAL_CLVMD + +aux prepare_pvs 1 + +vgcreate --clustered y $vg $(cat DEVICES) + +lvcreate -an --zero n -n $lv1 -l1 $vg +lvcreate -an --zero n -n $lv2 -l1 $vg +lvcreate -l1 $vg + +lvchange -aey $vg/$lv1 +lvchange -aey $vg/$lv2 + +"$LVM_CLVMD_BINARY" -S +sleep .2 +# restarted clvmd has the same PID (no fork, only execvp) +NEW_LOCAL_CLVMD=$(pgrep clvmd) +test "$LOCAL_CLVMD" -eq "$NEW_LOCAL_CLVMD" + +# try restart once more + +"$LVM_CLVMD_BINARY" -S +sleep .2 +# restarted clvmd has the same PID (no fork, only execvp) +NEW_LOCAL_CLVMD=$(pgrep clvmd) +test "$LOCAL_CLVMD" -eq "$NEW_LOCAL_CLVMD" + +# FIXME: Hmm - how could we test exclusivity is preserved in singlenode ? +lvchange -an $vg/$lv1 +lvchange -ay $vg/$lv1 + +"$LVM_CLVMD_BINARY" -R + +vgremove -ff $vg diff --git a/test/shell/covercmd.sh b/test/shell/covercmd.sh new file mode 100644 index 00000000..7843798b --- /dev/null +++ b/test/shell/covercmd.sh @@ -0,0 +1,82 @@ +# Copyright (C) 2008 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + +# +# tests basic functionality of read-ahead and ra regressions +# + +. lib/test + +TEST_UUID="aaaaaa-aaaa-aaaa-aaaa-aaaa-aaaa-aaaaaa" + +get_lvs_() +{ + case $(lvs --units s --nosuffix --noheadings -o $1_read_ahead "$vg"/"$lv") in + *$2) true ;; + *) false ;; + esac +} + +aux prepare_devs 5 + +pvcreate $dev1 +pvcreate --metadatacopies 0 $dev2 +pvcreate --metadatacopies 0 $dev3 +pvcreate $dev4 +pvcreate --norestorefile -u $TEST_UUID --metadatacopies 0 $dev5 +vgcreate -c n $vg $(cat DEVICES) +lvcreate -n $lv -l 5 -i5 -I256 $vg + +# test *scan and *display tools +pvscan +vgscan +lvscan +lvmdiskscan +vgdisplay --units k +lvdisplay --units g +for i in h b s k m g t p e H B S K M G T P E ; do + pvdisplay --units "$i" "$dev1" +done + +# test vgexport vgimport tools +vgchange -an $vg +vgexport $vg +vgimport $vg +vgchange -ay $vg + +# "-persistent y --major 254 --minor 20" +# "-persistent n" +# test various lvm utils +for i in dumpconfig formats segtypes; do + lvm "$i" +done + +for i in pr "p rw" an ay "-monitor y" "-monitor n" \ + -resync -refresh "-addtag MYTAG" "-deltag MYETAG"; do + lvchange -$i "$vg"/"$lv" +done + +pvck "$dev1" +vgck "$vg" +lvrename "$vg" "$lv" "$lv-rename" +vgcfgbackup -f "$(pwd)/backup.$$" "$vg" +vgchange -an "$vg" +vgcfgrestore -f "$(pwd)/backup.$$" "$vg" +pvremove -y -ff $dev5 +not vgcfgrestore -f "$(pwd)/backup.$$" "$vg" +pvcreate -u $TEST_UUID --restorefile "$(pwd)/backup.$$" $dev5 +vgremove -f "$vg" +pvresize --setphysicalvolumesize 10M "$dev1" + +# test various errors and obsoleted tools +not lvmchange +not lvrename "$vg" +not lvrename "$vg-xxx" +not lvrename "$vg" "$vg"/"$lv-rename" "$vg"/"$lv" diff --git a/test/shell/dmeventd-restart.sh b/test/shell/dmeventd-restart.sh new file mode 100644 index 00000000..716ded91 --- /dev/null +++ b/test/shell/dmeventd-restart.sh @@ -0,0 +1,42 @@ +#!/bin/bash +# Copyright (C) 2008 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + +. lib/test + +aux prepare_vg 5 +aux prepare_dmeventd + +which mkfs.ext2 || exit 200 + +lvcreate -m 3 --ig -L 1 -n 4way $vg +lvchange --monitor y $vg/4way +lvcreate -m 2 --ig -L 1 -n 3way $vg +lvchange --monitor y $vg/3way + +dmeventd -R -f & +echo "$!" > LOCAL_DMEVENTD + +sleep 1 # wait a bit, so we talk to the new dmeventd later + +lvchange --monitor y --verbose $vg/3way 2>&1 | tee lvchange.out +grep 'already monitored' lvchange.out +lvchange --monitor y --verbose $vg/4way 2>&1 | tee lvchange.out +grep 'already monitored' lvchange.out + +# now try what happens if no dmeventd is running +kill -9 `cat LOCAL_DMEVENTD` +dmeventd -R -f & +echo "$!" > LOCAL_DMEVENTD +sleep 3 +lvchange --monitor y --verbose $vg/3way 2>&1 | tee lvchange.out +not grep 'already monitored' lvchange.out + +vgremove -ff $vg diff --git a/test/shell/fsadm.sh b/test/shell/fsadm.sh new file mode 100644 index 00000000..a881f2bb --- /dev/null +++ b/test/shell/fsadm.sh @@ -0,0 +1,128 @@ +#!/bin/bash +# Copyright (C) 2008-2011 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + +test_description='Exercise fsadm filesystem resize' + +. lib/test + +aux prepare_vg 1 100 + +# set to "skip" to avoid testing given fs and test warning result +# i.e. check_reiserfs=skip +check_ext3= +check_xfs= +check_reiserfs= + +which mkfs.ext3 || check_ext3=${check_ext3:=mkfs.ext3} +which fsck.ext3 || check_ext3=${check_ext3:=fsck.ext3} +which mkfs.xfs || check_xfs=${check_xfs:=mkfs.xfs} +which xfs_check || check_xfs=${check_xfs:=xfs_check} +which mkfs.reiserfs || check_reiserfs=${check_reiserfs:=mkfs.reiserfs} +which reiserfsck || check_reiserfs=${check_reiserfs:=reiserfsck} + +vg_lv="$vg/$lv1" +dev_vg_lv="$DM_DEV_DIR/$vg_lv" +mount_dir="$TESTDIR/mnt" +# for recursive call +export LVM_BINARY=$(which lvm) + +test ! -d $mount_dir && mkdir $mount_dir + +cleanup_mounted_and_teardown() +{ + umount $mount_dir || true + aux teardown +} + +fscheck_ext3() +{ + fsck.ext3 -p -F -f $dev_vg_lv +} + +fscheck_xfs() +{ + xfs_check $dev_vg_lv +} + +fscheck_reiserfs() +{ + reiserfsck --check -p -f $dev_vg_lv </dev/null +} + +check_missing() +{ + eval local t=$\check_$1 + test -z "$t" && return 0 + test "$t" = skip && return 1 + # trick for warning test + echo "TEST ""WARNING: fsadm skips $1 tests, $t tool is missing" + return 1 +} + +# Test for block sizes != 1024 (rhbz #480022) +lvcreate -n $lv1 -L20M $vg +trap 'cleanup_mounted_and_teardown' EXIT + +if check_missing ext3; then + mkfs.ext3 -b4096 -j $dev_vg_lv + + fsadm --lvresize resize $vg_lv 30M + # Fails - not enough space for 4M fs + not fsadm -y --lvresize resize $dev_vg_lv 4M + lvresize -L+10M -r $vg_lv + lvreduce -L10M -r $vg_lv + + fscheck_ext3 + mount $dev_vg_lv $mount_dir + not fsadm -y --lvresize resize $vg_lv 4M + echo n | not lvresize -L4M -r -n $vg_lv + lvresize -L+20M -r -n $vg_lv + umount $mount_dir + fscheck_ext3 + + lvresize -f -L20M $vg_lv +fi + +if check_missing xfs; then + mkfs.xfs -l internal,size=1000b -f $dev_vg_lv + + fsadm --lvresize resize $vg_lv 30M + # Fails - not enough space for 4M fs + lvresize -L+10M -r $vg_lv + not lvreduce -L10M -r $vg_lv + + fscheck_xfs + mount $dev_vg_lv $mount_dir + lvresize -L+10M -r -n $vg_lv + umount $mount_dir + fscheck_xfs + + lvresize -f -L20M $vg_lv +fi + +if check_missing reiserfs; then + mkfs.reiserfs -s 513 -f $dev_vg_lv + + fsadm --lvresize resize $vg_lv 30M + lvresize -L+10M -r $vg_lv + fsadm --lvresize -y resize $vg_lv 10M + + fscheck_reiserfs + mount $dev_vg_lv $mount_dir + + fsadm -y --lvresize resize $vg_lv 30M + umount $mount_dir + fscheck_reiserfs + + lvresize -f -L20M $vg_lv +fi + +vgremove -ff $vg diff --git a/test/shell/inconsistent-metadata.sh b/test/shell/inconsistent-metadata.sh new file mode 100644 index 00000000..ce920be0 --- /dev/null +++ b/test/shell/inconsistent-metadata.sh @@ -0,0 +1,75 @@ +#!/bin/bash +# Copyright (C) 2008 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + +. lib/test + +aux prepare_vg 3 12 + +lvcreate -m 1 -l 1 -n mirror $vg +lvcreate -l 1 -n resized $vg +lvchange -a n $vg/mirror + +aux backup_dev $(cat DEVICES) + +init() { + aux restore_dev $(cat DEVICES) + lvs -o lv_name,lv_size --units k $vg | tee lvs.out + grep resized lvs.out | not grep 8192 + lvresize -L 8192K $vg/resized + aux restore_dev $dev1 +} + +check() { + lvs -o lv_name,lv_size --units k $vg | tee lvs.out + grep resized lvs.out | grep 8192 +} + +# vgscan fixes up metadata +init +vgscan 2>&1 | tee cmd.out +grep "Inconsistent metadata found for VG $vg" cmd.out +vgscan 2>&1 | tee cmd.out +not grep "Inconsistent metadata found for VG $vg" cmd.out +check + +# vgdisplay fixes +init +vgdisplay 2>&1 | tee cmd.out +grep "Inconsistent metadata found for VG $vg" cmd.out +vgdisplay 2>&1 | tee cmd.out +not grep "Inconsistent metadata found for VG $vg" cmd.out +check + +# lvs fixes up +init +lvs 2>&1 | tee cmd.out +grep "Inconsistent metadata found for VG $vg" cmd.out +vgdisplay 2>&1 | tee cmd.out +not grep "Inconsistent metadata found for VG $vg" cmd.out +check + +# vgs fixes up as well +init +vgs 2>&1 | tee cmd.out +grep "Inconsistent metadata found for VG $vg" cmd.out +vgs 2>&1 | tee cmd.out +not grep "Inconsistent metadata found for VG $vg" cmd.out +check + +echo Check auto-repair of failed vgextend - metadata written to original pv but not new pv +vgremove -f $vg +pvremove -ff $(cat DEVICES) +pvcreate $(cat DEVICES) +aux backup_dev $dev2 +vgcreate $vg $dev1 +vgextend $vg $dev2 +aux restore_dev $dev2 +should check compare_fields vgs $vg vg_mda_count pvs $dev2 vg_mda_count diff --git a/test/shell/listings.sh b/test/shell/listings.sh new file mode 100644 index 00000000..efccb62a --- /dev/null +++ b/test/shell/listings.sh @@ -0,0 +1,83 @@ +# Copyright (C) 2008 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + +# +# tests functionality of lvs, pvs, vgs, *display tools +# + +. lib/test + +get_lvs_() +{ + case $(lvs --units s --nosuffix --noheadings -o $1_read_ahead "$vg"/"$lv") in + *$2) true ;; + *) false ;; + esac +} + +aux prepare_devs 5 + +pvcreate $dev1 +pvcreate --metadatacopies 0 $dev2 +pvcreate --metadatacopies 0 $dev3 +pvcreate $dev4 +pvcreate --metadatacopies 0 $dev5 + +#COMM bz195276 -- pvs doesn't show PVs until a VG is created +pvs --noheadings|tee out +test $(wc -l <out) -eq 5 + +#COMM pvs with segment attributes works even for orphans +pvs --noheadings -o seg_all,pv_all,lv_all,vg_all | tee out +test $(wc -l <out) -eq 5 + +vgcreate -c n $vg $(cat DEVICES) + +#COMM pvs and vgs report mda_count, mda_free (bz202886, bz247444) +pvs -o +pv_mda_count,pv_mda_free $(cat DEVICES) +for I in $dev2 $dev3 $dev5; do + check pv_field $I pv_mda_count 0 + check pv_field $I pv_mda_free 0 +done +vgs -o +vg_mda_count,vg_mda_free $vg +check vg_field $vg vg_mda_count 2 + +#COMM pvs doesn't display --metadatacopies 0 PVs as orphans (bz409061) +pvdisplay $dev2|grep "VG Name.*$vg" +test $(pvs -o vg_name --noheadings $dev2) = $vg + +#COMM lvs displays snapshots (bz171215) +lvcreate -l4 -n $lv1 $vg +lvcreate -l4 -s -n $lv2 $vg/$lv1 +lvs $vg --noheadings|tee out +test $(wc -l <out) -eq 2 +lvs -a --noheadings|tee out +# should lvs -a display cow && real devices? (it doesn't) +test $(wc -l <out) -eq 2 +dmsetup ls|grep $PREFIX|grep -v "LVMTEST.*pv." +lvremove -f $vg/$lv2 + +#COMM lvs -a displays mirror legs and log +lvcreate -l4 -m2 -n$lv3 $vg +lvs $vg --noheadings|tee out +test $(wc -l <out) -eq 2 +lvs -a --noheadings|tee out +test $(wc -l <out) -eq 6 +dmsetup ls|grep $PREFIX|grep -v "LVMTEST.*pv." + +#COMM vgs with options from pvs still treats arguments as VGs (bz193543) +vgs -o pv_name,vg_name $vg +# would complain if not + +#COMM pvdisplay --maps feature (bz149814) +pvdisplay $(cat DEVICES) >out +pvdisplay --maps $(cat DEVICES) >out2 +not diff out out2 + diff --git a/test/shell/lock-blocking.sh b/test/shell/lock-blocking.sh new file mode 100644 index 00000000..2bdd7f3c --- /dev/null +++ b/test/shell/lock-blocking.sh @@ -0,0 +1,41 @@ +#!/bin/sh +# Copyright (C) 2008 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + +test_description='test some blocking / non-blocking multi-vg operations' + +. lib/test + +aux prepare_devs 3 +test -e LOCAL_CLVMD && exit 200 +pvcreate $dev1 $dev2 +vgcreate $vg $dev1 $dev2 + +# if wait_for_locks set, vgremove should wait for orphan lock +# flock process should have exited by the time first vgremove completes +flock -w 5 $TESTDIR/var/lock/lvm/P_orphans -c "sleep 10" & +while ! test -f $TESTDIR/var/lock/lvm/P_orphans ; do sleep .1 ; done + +vgremove --config 'global { wait_for_locks = 1 }' $vg +not vgremove --config 'global { wait_for_locks = 1 }' $vg + +test ! -f $TESTDIR/var/lock/lvm/P_orphans + +# if wait_for_locks not set, vgremove should fail on non-blocking lock +# we must wait for flock process at the end - vgremove won't wait +vgcreate $vg $dev1 $dev2 +flock -w 5 $TESTDIR/var/lock/lvm/P_orphans -c "sleep 10" & + +while ! test -f $TESTDIR/var/lock/lvm/P_orphans ; do sleep .1 ; done +flock_pid=`jobs -p` + +not vgremove --config 'global { wait_for_locks = 0 }' $vg +test -f $TESTDIR/var/lock/lvm/P_orphans # still running +kill $flock_pid diff --git a/test/shell/lvchange-mirror.sh b/test/shell/lvchange-mirror.sh new file mode 100644 index 00000000..95a8a82b --- /dev/null +++ b/test/shell/lvchange-mirror.sh @@ -0,0 +1,28 @@ +#!/bin/sh +# Copyright (C) 2010 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + +. lib/test +aux prepare_vg 3 + +# force resync 2-way active mirror +lvcreate -l2 -m1 -n $lv1 $vg $dev1 $dev2 $dev3:0-1 +check mirror $vg $lv1 $dev3 +echo y | lvchange --resync $vg/$lv1 +check mirror $vg $lv1 $dev3 +lvremove -ff $vg + +# force resync 2-way inactive mirror +lvcreate -l2 -m1 -n $lv1 $vg $dev1 $dev2 $dev3:0-1 +lvchange -an $vg/$lv1 +check mirror $vg $lv1 $dev3 +lvchange --resync $vg/$lv1 +check mirror $vg $lv1 $dev3 +lvremove -ff $vg diff --git a/test/shell/lvconvert-mirror-basic-0.sh b/test/shell/lvconvert-mirror-basic-0.sh new file mode 100644 index 00000000..eec6d5c1 --- /dev/null +++ b/test/shell/lvconvert-mirror-basic-0.sh @@ -0,0 +1,12 @@ +# Copyright (C) 2010 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + +. ./t-lvconvert-mirror-basic.sh +test_many 0 diff --git a/test/shell/lvconvert-mirror-basic-1.sh b/test/shell/lvconvert-mirror-basic-1.sh new file mode 100644 index 00000000..7019dbb3 --- /dev/null +++ b/test/shell/lvconvert-mirror-basic-1.sh @@ -0,0 +1,12 @@ +# Copyright (C) 2010 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + +. ./t-lvconvert-mirror-basic.sh +test_many 1 diff --git a/test/shell/lvconvert-mirror-basic-2.sh b/test/shell/lvconvert-mirror-basic-2.sh new file mode 100644 index 00000000..85d54c99 --- /dev/null +++ b/test/shell/lvconvert-mirror-basic-2.sh @@ -0,0 +1,12 @@ +# Copyright (C) 2010 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + +. ./t-lvconvert-mirror-basic.sh +test_many 2 diff --git a/test/shell/lvconvert-mirror-basic-3.sh b/test/shell/lvconvert-mirror-basic-3.sh new file mode 100644 index 00000000..0c575807 --- /dev/null +++ b/test/shell/lvconvert-mirror-basic-3.sh @@ -0,0 +1,12 @@ +# Copyright (C) 2010 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + +. ./t-lvconvert-mirror-basic.sh +test_many 3 diff --git a/test/shell/lvconvert-mirror-basic.sh b/test/shell/lvconvert-mirror-basic.sh new file mode 100644 index 00000000..09621733 --- /dev/null +++ b/test/shell/lvconvert-mirror-basic.sh @@ -0,0 +1,142 @@ +# Copyright (C) 2010 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + +. lib/test + +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 + + 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 + + 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 + + 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 16 + +test_many() { + i=$1 + for j in $(seq 0 3); 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 + lvremove -ff $vg + test_lvconvert $i $k $j $l 1 + lvremove -ff $vg + done + done + done +} diff --git a/test/shell/lvconvert-mirror.sh b/test/shell/lvconvert-mirror.sh new file mode 100644 index 00000000..ee986e48 --- /dev/null +++ b/test/shell/lvconvert-mirror.sh @@ -0,0 +1,255 @@ +#!/bin/sh +# Copyright (C) 2010 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + +. lib/test + +# 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 + +# 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 +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 +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 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 +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 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 +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 + +# Start w/ 3-way mirror +# Test pulling primary image before mirror in-sync (should fail) +# Test pulling primary image after mirror in-sync (should work) +# Test that the correct devices remain in the mirror +lvcreate -l2 -m2 -n $lv1 $vg $dev1 $dev2 $dev4 $dev3:0 +# FIXME: +# 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 + +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 + +# 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 +while [ `lvs --noheadings -o copy_percent $vg/$lv1` != "100.00" ]; do sleep 1; done +lvconvert -m1 --mirrorlog disk $vg/$lv1 +check mirror $vg $lv1 +not check mirror $vg $lv1 core + +# --- +# 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 + +# simple mirrored stripe +aux prepare_vg 5 +lvcreate -i2 -l10 -n $lv1 $vg +lvconvert -m1 -i1 $vg/$lv1 +lvreduce -f -l1 $vg/$lv1 +lvextend -f -l10 $vg/$lv1 +lvremove -ff $vg/$lv1 + +# extents must be divisible +lvcreate -l15 -n $lv1 $vg +not lvconvert -m1 --corelog --stripes 2 $vg/$lv1 +lvremove -ff $vg/$lv1 diff --git a/test/shell/lvconvert-raid.sh b/test/shell/lvconvert-raid.sh new file mode 100644 index 00000000..66f533c3 --- /dev/null +++ b/test/shell/lvconvert-raid.sh @@ -0,0 +1,197 @@ +#!/bin/bash + +# Copyright (C) 2011 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + +. lib/test + +# is_in_sync <VG/LV> +function is_in_sync() +{ + local dm_name + local a + local b + local idx + + dm_name=`echo $1 | sed s:-:--: | sed s:/:-:` + + if ! a=(`dmsetup status $dm_name`); then + echo "Unable to get sync status of $1" + exit 1 + fi + + # 6th argument is the sync ratio for RAID and mirror + echo ${a[@]} + if [ ${a[2]} = "raid" ]; then + # Last argument is the sync ratio for RAID + idx=$((${#a[@]} - 1)) + elif [ ${a[2]} = "mirror" ]; then + # 4th Arg tells us how far to the sync ratio + idx=$((${a[3]} + 4)) + else + echo "Unable to get sync ratio for target type '${a[2]}'" + exit 1 + fi + b=(`echo ${a[$idx]} | sed s:/:' ':`) + + if [ ${b[0]} != ${b[1]} ]; then + echo "$dm_name (${a[3]}) is not in-sync" + return 1 + fi + + if [[ ${a[$(($idx - 1))]} =~ a ]]; then + echo "$dm_name in-sync, but 'a' characters in health status" + exit 1 + fi + + if [ ${a[2]} = "raid" ]; then + echo "$dm_name (${a[3]}) is in-sync" + else + echo "$dm_name (${a[2]}) is in-sync" + fi + + return 0 +} + +# wait_for_sync <VG/LV> +function wait_for_sync() +{ + local i=0 + + while ! is_in_sync $1; do + sleep 2 + i=$(($i + 1)) + if [ $i -gt 500 ]; then + echo "Sync is taking too long - assume stuck" + exit 1 + fi + done +} + +function is_raid_available() +{ + local a + + modprobe dm-raid + a=(`dmsetup targets | grep raid`) + if [ -z $a ]; then + echo "RAID target not available" + return 1 + fi + if [ ${a[1]} != "v1.1.0" ]; then + echo "Bad RAID version" + return 1 + fi + + return 0 +} + +######################################################## +# MAIN +######################################################## +is_raid_available || exit 200 + +aux prepare_vg 5 80 + +########################################### +# RAID1 convert tests +########################################### +for i in 1 2 3 4; do + for j in 1 2 3 4; do + if [ $i -eq 1 ]; then + from="linear" + else + from="$i-way" + fi + if [ $j -eq 1 ]; then + to="linear" + else + to="$j-way" + fi + echo "Converting from $from to $to" + if [ $i -eq 1 ]; then + # Shouldn't be able to create with just 1 image + not lvcreate --type raid1 -m 0 -l 2 -n $lv1 $vg + + lvcreate -l 2 -n $lv1 $vg + else + lvcreate --type raid1 -m $(($i - 1)) -l 2 -n $lv1 $vg + wait_for_sync $vg/$lv1 + fi + lvconvert -m $((j - 1)) $vg/$lv1 + + # FIXME: ensure no residual devices + + if [ $j -eq 1 ]; then + check linear $vg $lv1 + fi + lvremove -ff $vg + done +done + +# +# FIXME: Add tests that specify particular devices to be removed +# + +########################################### +# RAID1 split tests +########################################### +# 3-way to 2-way/linear +lvcreate --type raid1 -m 2 -l 2 -n $lv1 $vg +wait_for_sync $vg/$lv1 +lvconvert --splitmirrors 1 -n $lv2 $vg/$lv1 +check lv_exists $vg $lv1 +check linear $vg $lv2 +# FIXME: ensure no residual devices +lvremove -ff $vg + +# 2-way to linear/linear +lvcreate --type raid1 -m 1 -l 2 -n $lv1 $vg +wait_for_sync $vg/$lv1 +lvconvert --splitmirrors 1 -n $lv2 $vg/$lv1 +check linear $vg $lv1 +check linear $vg $lv2 +# FIXME: ensure no residual devices +lvremove -ff $vg + +# 3-way to linear/2-way +lvcreate --type raid1 -m 2 -l 2 -n $lv1 $vg +wait_for_sync $vg/$lv1 +# FIXME: Can't split off a RAID1 from a RAID1 yet +should lvconvert --splitmirrors 2 -n $lv2 $vg/$lv1 +#check linear $vg $lv1 +#check lv_exists $vg $lv2 +# FIXME: ensure no residual devices +lvremove -ff $vg + +########################################### +# RAID1 split + trackchanges / merge +########################################### +# 3-way to 2-way/linear +lvcreate --type raid1 -m 2 -l 2 -n $lv1 $vg +wait_for_sync $vg/$lv1 +lvconvert --splitmirrors 1 --trackchanges $vg/$lv1 +check lv_exists $vg $lv1 +check linear $vg ${lv1}_rimage_2 +lvconvert --merge $vg/${lv1}_rimage_2 +# FIXME: ensure no residual devices +lvremove -ff $vg + +########################################### +# Mirror to RAID1 conversion +########################################### +for i in 1 2 3 ; do + lvcreate --type mirror -m $i -l 2 -n $lv1 $vg + wait_for_sync $vg/$lv1 + lvconvert --type raid1 $vg/$lv1 + lvremove -ff $vg +done + +exit 0 diff --git a/test/shell/lvconvert-repair-dmeventd.sh b/test/shell/lvconvert-repair-dmeventd.sh new file mode 100644 index 00000000..903192f6 --- /dev/null +++ b/test/shell/lvconvert-repair-dmeventd.sh @@ -0,0 +1,26 @@ +#!/bin/bash +# Copyright (C) 2008 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + +. lib/test + +aux prepare_vg 5 +aux prepare_dmeventd + +which mkfs.ext2 || exit 200 + +lvcreate -m 3 --ig -L 1 -n 4way $vg +lvchange --monitor y $vg/4way +aux disable_dev $dev2 $dev4 +mkfs.ext2 $DM_DEV_DIR/$vg/4way +sleep 10 # FIXME: need a "poll" utility, akin to "check" +aux enable_dev $dev2 $dev4 +check mirror $vg 4way +check mirror_legs $vg 4way 2 diff --git a/test/shell/lvconvert-repair-policy.sh b/test/shell/lvconvert-repair-policy.sh new file mode 100644 index 00000000..debd8d1a --- /dev/null +++ b/test/shell/lvconvert-repair-policy.sh @@ -0,0 +1,91 @@ +#!/bin/bash +# Copyright (C) 2008 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + +. lib/test + +aux prepare_vg 4 +aux lvmconf 'allocation/maximise_cling = 0' +aux lvmconf 'allocation/mirror_logs_require_separate_pvs = 1' + +# Clean-up and create a 2-way mirror, where the the +# leg devices are always on $dev[12] and the log +# is always on $dev3. ($dev4 behaves as a spare) +cleanup() { + vgreduce --removemissing $vg + for d in "$@"; do aux enable_dev $d; done + for d in "$@"; do vgextend $vg $d; done + lvremove -ff $vg/mirror + lvcreate -m 1 --ig -l 2 -n mirror $vg $dev1 $dev2 $dev3:0 +} + +repair() { + lvconvert --repair --use-policies --config "$1" $vg/mirror +} + +lvcreate -m 1 -L 1 -n mirror $vg +lvchange -a n $vg/mirror + +# Fail a leg of a mirror. +aux disable_dev $dev1 +lvchange --partial -a y $vg/mirror +repair 'activation { mirror_image_fault_policy = "remove" }' +check linear $vg mirror +cleanup $dev1 + +# Fail a leg of a mirror. +# Expected result: Mirror (leg replaced, should retain log) +aux disable_dev $dev1 +repair 'activation { mirror_image_fault_policy = "replace" mirror_log_fault_policy = "remove" }' +check mirror $vg mirror +check active $vg mirror_mlog +cleanup $dev1 + +# Fail a leg of a mirror. +# Expected result: Mirror (leg replaced) +aux disable_dev $dev1 +repair 'activation { mirror_image_fault_policy = "replace" }' +check mirror $vg mirror +check active $vg mirror_mlog +cleanup $dev1 + +# Fail a leg of a mirror (use old name for policy specification) +# Expected result: Mirror (leg replaced) +aux disable_dev $dev1 +repair 'activation { mirror_image_fault_policy = "replace" }' +check mirror $vg mirror +check active $vg mirror_mlog +cleanup $dev1 + +# Fail a leg of a mirror w/ no available spare +# Expected result: linear +# (or 2-way with leg/log overlap if alloc anywhere) +aux disable_dev $dev2 $dev4 +repair 'activation { mirror_image_fault_policy = "replace" }' +check mirror $vg mirror +not check lv_exists $vg mirror_mlog +cleanup $dev2 $dev4 + +# Fail the log device of a mirror w/ no available spare +# Expected result: mirror w/ corelog +aux disable_dev $dev3 $dev4 +repair 'activation { mirror_image_fault_policy = "replace" }' $vg/mirror +check mirror $vg mirror +not check lv_exists $vg mirror_mlog +cleanup $dev3 $dev4 + +# Fail the log device with a remove policy +# Expected result: mirror w/ corelog +lvchange -a y $vg/mirror +aux disable_dev $dev3 $dev4 +repair 'activation { mirror_log_fault_policy = "remove" }' +check mirror $vg mirror core +not check lv_exists $vg mirror_mlog +cleanup $dev3 $dev4 diff --git a/test/shell/lvconvert-repair-replace.sh b/test/shell/lvconvert-repair-replace.sh new file mode 100644 index 00000000..27a7f04b --- /dev/null +++ b/test/shell/lvconvert-repair-replace.sh @@ -0,0 +1,93 @@ +#!/bin/bash +# Copyright (C) 2008 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + +. lib/test + +aux prepare_vg 6 +aux lvmconf 'allocation/maximise_cling = 0' +aux lvmconf 'allocation/mirror_logs_require_separate_pvs = 1' + +# 3-way, disk log +# multiple failures, full replace +lvcreate --mirrorlog disk -m 2 --ig -L 1 -n 3way $vg $dev1 $dev2 $dev3 $dev4:0-1 +aux disable_dev $dev1 $dev2 +echo y | lvconvert --repair $vg/3way 2>&1 | tee 3way.out +lvs -a -o +devices | not grep unknown +not grep "WARNING: Failed" 3way.out +vgreduce --removemissing $vg +check mirror $vg 3way +aux enable_dev $dev1 $dev2 + +vgremove -ff $vg; vgcreate -c n $vg $dev1 $dev2 $dev3 $dev4 $dev5 $dev6 + +# 2-way, mirrored log +# Double log failure, full replace +lvcreate --mirrorlog mirrored -m 1 --ig -L 1 -n 2way $vg \ + $dev1 $dev2 $dev3:0 $dev4:0 +aux disable_dev $dev3 $dev4 +echo y | lvconvert --repair $vg/2way 2>&1 | tee 2way.out +lvs -a -o +devices | not grep unknown +not grep "WARNING: Failed" 2way.out +vgreduce --removemissing $vg +check mirror $vg 2way +aux enable_dev $dev3 $dev4 + +vgremove -ff $vg; vgcreate -c n $vg $dev1 $dev2 $dev3 $dev4 $dev5 $dev6 + +# 3-way, mirrored log +# Single log failure, replace +lvcreate --mirrorlog mirrored -m 2 --ig -L 1 -n 3way $vg \ + $dev1 $dev2 $dev3 $dev4:0 $dev5:0 +aux disable_dev $dev4 +echo y | lvconvert --repair $vg/3way 2>&1 | tee 3way.out +lvs -a -o +devices | not grep unknown +not grep "WARNING: Failed" 3way.out +vgreduce --removemissing $vg +check mirror $vg 3way +aux enable_dev $dev4 + +vgremove -ff $vg; vgcreate -c n $vg $dev1 $dev2 $dev3 $dev4 $dev5 + +# 3-way, disk log +# multiple failures, partial replace +lvcreate --mirrorlog disk -m 2 --ig -L 1 -n 3way $vg $dev1 $dev2 $dev3 $dev4 +aux disable_dev $dev1 $dev2 +echo y | lvconvert --repair $vg/3way 2>&1 | tee 3way.out +grep "WARNING: Failed" 3way.out +lvs -a -o +devices | not grep unknown +vgreduce --removemissing $vg +check mirror $vg 3way +aux enable_dev $dev1 $dev2 +lvchange -a n $vg/3way + +vgremove -ff $vg; vgcreate -c n $vg $dev1 $dev2 $dev3 + +lvcreate --mirrorlog disk -m 1 --ig -L 1 -n 2way $vg $dev1 $dev2 $dev3 +aux disable_dev $dev1 +echo y | lvconvert --repair $vg/2way 2>&1 | tee 2way.out +grep "WARNING: Failed" 2way.out +lvs -a -o +devices | not grep unknown +vgreduce --removemissing $vg +check mirror $vg 2way +aux enable_dev $dev1 $dev2 +lvchange -a n $vg/2way + +vgremove -ff $vg; vgcreate -c n $vg $dev1 $dev2 $dev3 $dev4 + +# Test repair of inactive mirror with log failure +# Replacement should fail, but covert should succeed (switch to corelog) +lvcreate -m 2 --ig -l 2 -n mirror2 $vg $dev1 $dev2 $dev3 $dev4:0 +vgchange -a n $vg +pvremove -ff -y $dev4 +echo 'y' | lvconvert -y --repair $vg/mirror2 +check mirror $vg mirror2 +vgs + diff --git a/test/shell/lvconvert-repair-snapshot.sh b/test/shell/lvconvert-repair-snapshot.sh new file mode 100644 index 00000000..baca87dd --- /dev/null +++ b/test/shell/lvconvert-repair-snapshot.sh @@ -0,0 +1,27 @@ +# Copyright (C) 2011 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + +. lib/test + +aux prepare_vg 5 +aux lvmconf 'allocation/maximise_cling = 0' +aux lvmconf 'allocation/mirror_logs_require_separate_pvs = 1' + +lvcreate -m 3 --ig -L 2M -n 4way $vg $dev1 $dev2 $dev3 $dev4 $dev5:0 +lvcreate -s $vg/4way -L 2M -n snap + +aux disable_dev $dev2 $dev4 +echo n | lvconvert --repair $vg/4way 2>&1 | tee 4way.out +lvs -a -o +devices | not grep unknown +vgreduce --removemissing $vg +aux enable_dev $dev2 $dev4 +lvs -a -o +devices +check mirror $vg 4way $dev5 + diff --git a/test/shell/lvconvert-repair-transient-dmeventd.sh b/test/shell/lvconvert-repair-transient-dmeventd.sh new file mode 100644 index 00000000..0cb87281 --- /dev/null +++ b/test/shell/lvconvert-repair-transient-dmeventd.sh @@ -0,0 +1,27 @@ +#!/bin/bash +# Copyright (C) 2011 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + +. lib/test + +aux prepare_vg 5 +aux prepare_dmeventd + +lvcreate -m 3 --ig -L 1 -n 4way $vg +lvchange --monitor y $vg/4way +aux disable_dev $dev2 $dev4 +mkfs.ext3 $DM_DEV_DIR/$vg/4way +aux enable_dev $dev2 $dev4 +sleep 3 +lvs -a -o +devices | not grep unknown +check mirror $vg 4way +check mirror_legs $vg 4way 2 +lvs -a -o +devices | not grep mimage_1 +lvs -a -o +devices | not grep mimage_3 diff --git a/test/shell/lvconvert-repair-transient.sh b/test/shell/lvconvert-repair-transient.sh new file mode 100644 index 00000000..804b150c --- /dev/null +++ b/test/shell/lvconvert-repair-transient.sh @@ -0,0 +1,26 @@ +#!/bin/bash +# Copyright (C) 2008 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + +. lib/test + +aux prepare_vg 5 + +lvcreate -m 3 --ig -L 1 -n 4way $vg +aux disable_dev $dev2 $dev4 +mkfs.ext3 $DM_DEV_DIR/$vg/4way & +sleep 1 +aux enable_dev $dev2 $dev4 +echo n | lvconvert --repair $vg/4way 2>&1 | tee 4way.out +lvs -a -o +devices | not grep unknown +vgreduce --removemissing $vg +check mirror $vg 4way +lvchange -a n $vg/4way +wait diff --git a/test/shell/lvconvert-repair.sh b/test/shell/lvconvert-repair.sh new file mode 100644 index 00000000..6a6b88e9 --- /dev/null +++ b/test/shell/lvconvert-repair.sh @@ -0,0 +1,108 @@ +#!/bin/bash +# Copyright (C) 2008 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + +. lib/test + +aux lvmconf 'allocation/maximise_cling = 0' +aux lvmconf 'allocation/mirror_logs_require_separate_pvs = 1' + +# fail multiple devices + +# 4-way, disk log => 2-way, disk log +aux prepare_vg 5 +lvcreate -m 3 --ig -L 1 -n 4way $vg $dev1 $dev2 $dev3 $dev4 $dev5:0 +aux disable_dev $dev2 $dev4 +echo n | lvconvert --repair $vg/4way 2>&1 | tee 4way.out +lvs -a -o +devices | not grep unknown +vgreduce --removemissing $vg +aux enable_dev $dev2 $dev4 +check mirror $vg 4way $dev5 + +# 3-way, disk log => linear +aux prepare_vg 5 +lvcreate -m 2 --ig -L 1 -n 3way $vg +aux disable_dev $dev1 $dev2 +echo n | lvconvert --repair $vg/3way +check linear $vg 3way +lvs -a -o +devices | not grep unknown +lvs -a -o +devices | not grep mlog +dmsetup ls | grep $PREFIX | not grep mlog +vgreduce --removemissing $vg +aux enable_dev $dev1 $dev2 +check linear $vg 3way + +# fail just log and get it removed + +# 3-way, disk log => 3-way, core log +aux prepare_vg 5 +lvcreate -m 2 --ig -L 1 -n 3way $vg $dev1 $dev2 $dev3 $dev4:0 +aux disable_dev $dev4 +echo n | lvconvert --repair $vg/3way +check mirror $vg 3way core +lvs -a -o +devices | not grep unknown +lvs -a -o +devices | not grep mlog +dmsetup ls | grep $PREFIX | not grep mlog +vgreduce --removemissing $vg +aux enable_dev $dev4 + +# 3-way, mirrored log => 3-way, core log +aux prepare_vg 5 +lvcreate -m 2 --mirrorlog mirrored --ig -L 1 -n 3way $vg \ + $dev1 $dev2 $dev3 $dev4:0 $dev5:0 +aux disable_dev $dev4 $dev5 +echo n | lvconvert --repair $vg/3way +check mirror $vg 3way core +lvs -a -o +devices | not grep unknown +lvs -a -o +devices | not grep mlog +dmsetup ls | grep $PREFIX | not grep mlog +vgreduce --removemissing $vg +aux enable_dev $dev4 $dev5 + +# 2-way, disk log => 2-way, core log +aux prepare_vg 5 +lvcreate -m 1 --ig -L 1 -n 2way $vg $dev1 $dev2 $dev3:0 +aux disable_dev $dev3 +echo n | lvconvert --repair $vg/2way +check mirror $vg 2way core +lvs -a -o +devices | not grep unknown +lvs -a -o +devices | not grep mlog +vgreduce --removemissing $vg +aux enable_dev $dev3 + +# fail single devices + +aux prepare_vg 5 +vgreduce $vg $dev4 + +lvcreate -m 1 --ig -L 1 -n mirror $vg +lvchange -a n $vg/mirror +vgextend $vg $dev4 +aux disable_dev $dev1 +lvchange --partial -a y $vg/mirror + +not vgreduce -v --removemissing $vg +lvconvert -y --repair $vg/mirror +vgreduce --removemissing $vg + +aux enable_dev $dev1 +vgextend $vg $dev1 +aux disable_dev $dev2 +lvconvert -y --repair $vg/mirror +vgreduce --removemissing $vg + +aux enable_dev $dev2 +vgextend $vg $dev2 +aux disable_dev $dev3 +lvconvert -y --repair $vg/mirror +vgreduce --removemissing $vg +aux enable_dev $dev3 +vgextend $vg $dev3 +lvremove -ff $vg diff --git a/test/shell/lvconvert-twostep.sh b/test/shell/lvconvert-twostep.sh new file mode 100644 index 00000000..7e65ff9f --- /dev/null +++ b/test/shell/lvconvert-twostep.sh @@ -0,0 +1,26 @@ +#!/bin/bash +# Copyright (C) 2010 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + +. lib/test + +aux prepare_vg 4 + +lvcreate -m 1 --mirrorlog disk --ig -L 1 -n mirror $vg +not lvconvert -m 2 --mirrorlog core $vg/mirror $dev3 2>&1 | tee errs +grep "two steps" errs + +lvconvert -m 2 $vg/mirror $dev3 +lvconvert --mirrorlog core $vg/mirror +not lvconvert -m 1 --mirrorlog disk $vg/mirror $dev3 2>&1 | tee errs +grep "two steps" errs + +not lvconvert -m 1 --mirrorlog mirrored $vg/mirror $dev3 $dev4 2>&1 | tee errs +grep "two steps" errs diff --git a/test/shell/lvcreate-large.sh b/test/shell/lvcreate-large.sh new file mode 100644 index 00000000..b61cccae --- /dev/null +++ b/test/shell/lvcreate-large.sh @@ -0,0 +1,40 @@ +#!/bin/sh +# Copyright (C) 2011 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + +# 'Exercise some lvcreate diagnostics' + +. lib/test + +aux prepare_vg 4 + +lvcreate -s -l 100%FREE -n $lv $vg --virtualsize 1024T + +#FIXME this should be 1024T +#check lv_field $vg/$lv size "128.00m" + +aux lvmconf 'devices/filter = [ "a/dev\/mapper\/.*$/", "a/dev\/LVMTEST/", "r/.*/" ]' + +pvcreate $DM_DEV_DIR/$vg/$lv +vgcreate -c n $vg1 $DM_DEV_DIR/$vg/$lv + +lvcreate -l 100%FREE -n $lv1 $vg1 +check lv_field $vg1/$lv1 size "1024.00t" +lvresize -f -l 72%VG $vg1/$lv1 +check lv_field $vg1/$lv1 size "737.28t" +lvremove -ff $vg1/$lv1 + +lvcreate -l 100%VG -n $lv1 $vg1 +check lv_field $vg1/$lv1 size "1024.00t" +lvresize -f -l 72%VG $vg1/$lv1 +check lv_field $vg1/$lv1 size "737.28t" +lvremove -ff $vg1/$lv1 + +lvremove -ff $vg/$lv diff --git a/test/shell/lvcreate-mirror.sh b/test/shell/lvcreate-mirror.sh new file mode 100644 index 00000000..ae3984cf --- /dev/null +++ b/test/shell/lvcreate-mirror.sh @@ -0,0 +1,41 @@ +#!/bin/sh +# Copyright (C) 2010 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + +. lib/test +aux prepare_vg 5 80 +aux lvmconf 'allocation/maximise_cling = 0' +aux lvmconf 'allocation/mirror_logs_require_separate_pvs = 1' + +# 2-way mirror with corelog, 2 PVs +lvcreate -l2 -m1 --mirrorlog core -n $lv1 $vg $dev1 $dev2 +check mirror_images_redundant $vg $lv1 +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 +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 +lvremove -ff $vg + +# lvcreate --nosync is in 100% sync after creation (bz429342) +lvcreate -l2 -m1 --nosync -n $lv1 $vg $dev1 $dev2 $dev3:0-1 2>out +grep "New mirror won't be synchronised." out +lvs -o copy_percent --noheadings $vg/$lv1 | grep 100.00 +lvremove -ff $vg + +# creating 2-way mirror with disklog from 2 PVs fails +not lvcreate -l2 -m1 -n $lv1 $vg $dev1 $dev2 diff --git a/test/shell/lvcreate-operation.sh b/test/shell/lvcreate-operation.sh new file mode 100644 index 00000000..cb56b65a --- /dev/null +++ b/test/shell/lvcreate-operation.sh @@ -0,0 +1,43 @@ +#!/bin/sh +# Copyright (C) 2008 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + +# 'Exercise some lvcreate diagnostics' + +. lib/test + +cleanup_lvs() { + lvremove -ff $vg + if dmsetup table|grep $vg; then + echo "ERROR: lvremove did leave some some mappings in DM behind!" + return 1 + fi +} + +aux prepare_pvs 2 +aux pvcreate --metadatacopies 0 $dev1 +aux vgcreate -c n $vg $(cat DEVICES) + +# --- +# Create snapshots of LVs on --metadatacopies 0 PV (bz450651) +lvcreate -n$lv1 -l4 $vg $dev1 +lvcreate -n$lv2 -l4 -s $vg/$lv1 +lvcreate -n$lv3 -l4 --permission r -s $vg/$lv1 +cleanup_lvs + +# --- +# Create mirror on two devices with mirrored log using --alloc anywhere +lvcreate -m 1 -l4 -n $lv1 --mirrorlog mirrored $vg --alloc anywhere $dev1 $dev2 +cleanup_lvs + +# -- +# Create mirror on one dev with mirrored log using --alloc anywhere, should fail +not lvcreate -m 1 -l4 -n $lv1 --mirrorlog mirrored $vg --alloc anywhere $dev1 +cleanup_lvs diff --git a/test/shell/lvcreate-pvtags.sh b/test/shell/lvcreate-pvtags.sh new file mode 100644 index 00000000..3e460628 --- /dev/null +++ b/test/shell/lvcreate-pvtags.sh @@ -0,0 +1,47 @@ +# Copyright (C) 2008 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + +. lib/test + +aux prepare_pvs 3 +aux lvmconf 'allocation/maximise_cling = 0' +aux lvmconf 'allocation/mirror_logs_require_separate_pvs = 1' + +# not required, just testing +aux pvcreate --metadatacopies 0 $dev1 + +vgcreate -c n $vg $(cat DEVICES) +pvchange --addtag fast $(cat DEVICES) + +# 3 stripes with 3 PVs (selected by tag, @fast) is fine +lvcreate -l3 -i3 $vg @fast + +# too many stripes(4) for 3 PVs +not lvcreate -l4 -i4 $vg @fast + +# 2 stripes is too many with just one PV +not lvcreate -l2 -i2 $vg $DM_DEV_DIR/mapper/pv1 + +# lvcreate mirror +lvcreate -l1 -m1 $vg @fast + +# lvcreate mirror w/corelog +lvcreate -l1 -m2 --corelog $vg @fast + +# lvcreate mirror w/no free PVs +not lvcreate -l1 -m2 $vg @fast + +# lvcreate mirror (corelog, w/no free PVs) +not lvcreate -l1 -m3 --corelog $vg @fast + +# lvcreate mirror with a single PV arg +not lvcreate -l1 -m1 --corelog $vg $dev1 + +vgremove -ff $vg diff --git a/test/shell/lvcreate-raid.sh b/test/shell/lvcreate-raid.sh new file mode 100644 index 00000000..5c687b44 --- /dev/null +++ b/test/shell/lvcreate-raid.sh @@ -0,0 +1,113 @@ +#!/bin/bash + +# Copyright (C) 2011 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + +. lib/test + +# is_raid_in_sync <VG/LV> +function is_raid_in_sync() +{ + local dm_name + local a + local b + local idx + + dm_name=`echo $1 | sed s:-:--: | sed s:/:-:` + + if ! a=(`dmsetup status $dm_name`); then + echo "Unable to get sync status of $1" + exit 1 + fi + idx=$((${#a[@]} - 1)) + b=(`echo ${a[$idx]} | sed s:/:' ':`) + + if [ ${b[0]} != ${b[1]} ]; then + echo "$dm_name (${a[3]}) is not in-sync" + return 1 + fi + + echo "$dm_name (${a[3]}) is in-sync" + return 0 +} + +# wait_for_raid_sync <VG/LV> +function wait_for_raid_sync() +{ + local i=0 + + while ! is_raid_in_sync $1; do + sleep 2 + i=$(($i + 1)) + if [ $i -gt 500 ]; then + echo "Sync is taking too long - assume stuck" + exit 1 + fi + done +} + +function is_raid_available() +{ + local a + + modprobe dm-raid + a=(`dmsetup targets | grep raid`) + if [ -z $a ]; then + echo "RAID target not available" + return 1 + fi + if [ ${a[1]} != "v1.1.0" ]; then + echo "Bad RAID version" + return 1 + fi + + return 0 +} + +######################################################## +# MAIN +######################################################## +is_raid_available || exit 200 + +aux prepare_vg 5 80 + + +########################################### +# Create, wait for sync, remove tests +########################################### + +# Create RAID1 (implicit 2-way) +lvcreate --type raid1 -l 2 -n $lv1 $vg +wait_for_raid_sync $vg/$lv1 +lvremove -ff $vg + +# Create RAID1 (explicit 2-way) +lvcreate --type raid1 -m 1 -l 2 -n $lv1 $vg +wait_for_raid_sync $vg/$lv1 +lvremove -ff $vg + +# Create RAID1 (explicit 3-way) +lvcreate --type raid1 -m 2 -l 2 -n $lv1 $vg +wait_for_raid_sync $vg/$lv1 +lvremove -ff $vg + +# Create RAID 4/5/6 (explicit 3-stripe + parity devs) +for i in raid4 \ + raid5 raid5_ls raid5_la raid5_rs raid5_ra \ + raid6 raid6_zr raid6_nr raid6_nc; do + + lvcreate --type $i -l 3 -i 3 -n $lv1 $vg + wait_for_raid_sync $vg/$lv1 + lvremove -ff $vg +done + +# +# FIXME: Add tests that specify particular PVs to use for creation +# diff --git a/test/shell/lvcreate-repair.sh b/test/shell/lvcreate-repair.sh new file mode 100644 index 00000000..5844fb94 --- /dev/null +++ b/test/shell/lvcreate-repair.sh @@ -0,0 +1,97 @@ +#!/bin/bash +# Copyright (C) 2011 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + +. lib/test + +aux prepare_vg 3 + +# fail multiple devices +for i in pv1 pv2 pv3 ; do + for j in pv2 pv3 ; do + + if test $i = $j ; then continue ; fi + + vgremove -ff $vg + vgcreate $vg $dev1 $dev2 $dev3 + + lvcreate -l1 -n $lv1 $vg $dev1 + + aux lvmconf "devices/filter = [ \"r/.*$i$/\", \"r/.*$j$/\", \"a/dev\/mapper\/.*pv[0-9_]*$/\", \"r/.*/\" ]" + + vgreduce --removemissing --force $vg + + # check if reduced device was removed + test $i = pv1 && dmsetup table | not egrep "$vg-$lv1: *[^ ]+" >/dev/null + + lvcreate -l1 -n $lv2 $vg + + test $i != pv1 && check lv_exists $vg $lv1 + check lv_exists $vg $lv2 + + aux lvmconf 'devices/filter = [ "a/dev\/mapper\/.*pv[0-9_]*$/", "r/.*/" ]' + + test $i != pv1 && check lv_exists $vg $lv1 + check lv_exists $vg $lv2 + done +done + +vgremove -ff $vg +vgcreate $vg $dev1 $dev2 $dev3 + +# use tricky 'dd' +for i in "$dev1" "$dev2" "$dev3" ; do + for j in "$dev2" "$dev3" ; do + + if test "$i" = "$j" ; then continue ; fi + + dd if="$i" of=backup_i bs=256K count=1 + dd if="$j" of=backup_j bs=256K count=1 + + lvcreate -l1 -n $lv1 $vg $dev1 + + dd if=backup_j of="$j" bs=256K count=1 + dd if=backup_i of="$i" bs=256K count=1 + + check lv_exists $vg $lv1 + # mda should be now consistent + lvremove -f $vg/$lv1 + done +done + + +# confuse lvm with active LV left behind +dd if="$dev1" of=backup_i bs=256K count=1 +dd if="$dev2" of=backup_j bs=256K count=1 + +lvcreate -l1 $vg $dev1 + +dd if=backup_j of="$dev2" bs=256K count=1 +dd if=backup_i of="$dev1" bs=256K count=1 + +# CHECKME: following command writes here: +# vgreduce --removemissing --force $vg +# +# WARNING: Inconsistent metadata found for VG LVMTESTvg - updating to use version 2 +# Volume group "LVMTESTvg" is already consistent + +# dirty game +dd if=/dev/zero of="$dev3" bs=256K count=1 + +vgreduce --removemissing --force $vg + +# FIXME: here is LV1 left active - but metadata does not know about it +# and lvcreate does not check whether such device exists in the table +# so it ends with: +# +# device-mapper: create ioctl failed: Device or resource busy +# Failed to activate new LV. + +should lvcreate -l1 $vg $dev1 diff --git a/test/shell/lvcreate-small-snap.sh b/test/shell/lvcreate-small-snap.sh new file mode 100644 index 00000000..7fca21ab --- /dev/null +++ b/test/shell/lvcreate-small-snap.sh @@ -0,0 +1,30 @@ +#!/bin/bash +# Copyright (C) 2010 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + +. lib/test + +aux prepare_pvs 3 + +vgcreate -c n -s 1k $vg $(cat DEVICES) + +lvcreate -n one -l 10 $vg +lvcreate -s -l 8 -n snapA $vg/one +lvcreate -s -c 4k -l 8 -n snapX1 $vg/one +lvcreate -s -c 8k -l 16 -n snapX2 $vg/one + +# Check that snapshots that are too small are caught with correct error. +not lvcreate -s -c 8k -l 8 -n snapX3 $vg/one 2>&1 | tee lvcreate.out +not grep "suspend origin one" lvcreate.out +grep "Unable to create a snapshot" lvcreate.out + +not lvcreate -s -l 4 -n snapB $vg/one 2>&1 | tee lvcreate.out +not grep "suspend origin one" lvcreate.out +grep "Unable to create a snapshot" lvcreate.out diff --git a/test/shell/lvcreate-striped-mirror.sh b/test/shell/lvcreate-striped-mirror.sh new file mode 100644 index 00000000..9a55a97e --- /dev/null +++ b/test/shell/lvcreate-striped-mirror.sh @@ -0,0 +1,65 @@ +#!/bin/sh +# Copyright (C) 2010 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + +. lib/test +aux prepare_vg 9 + +lvcreate -i2 -l2 -m1 --mirrorlog core -n $lv1 $vg 2>&1 | tee log +not grep "Rounding" log +check mirror_images_redundant $vg $lv1 +lvremove -ff $vg + +lvcreate -i2 -l4 -m1 --mirrorlog core -n $lv1 $vg 2>&1 | tee log +not grep "Rounding" log +check mirror_images_redundant $vg $lv1 +lvremove -ff $vg + +lvcreate -i3 -l3 -m1 --mirrorlog core -n $lv1 $vg 2>&1 | tee log +not grep "Rounding" log +check mirror_images_redundant $vg $lv1 +lvremove -ff $vg + +lvcreate -i4 -l4 -m1 --mirrorlog core -n $lv1 $vg 2>&1 | tee log +not grep "Rounding" log +check mirror_images_redundant $vg $lv1 +lvremove -ff $vg + + +lvcreate -i2 -l2 -m2 --mirrorlog core -n $lv1 $vg 2>&1 | tee log +not grep "Rounding" log +check mirror_images_redundant $vg $lv1 +lvremove -ff $vg + +lvcreate -i3 -l3 -m2 --mirrorlog core -n $lv1 $vg 2>&1 | tee log +not grep "Rounding" log +check mirror_images_redundant $vg $lv1 +lvremove -ff $vg + +lvcreate -i2 -l2 -m3 --mirrorlog core -n $lv1 $vg 2>&1 | tee log +not grep "Rounding" log +check mirror_images_redundant $vg $lv1 +lvremove -ff $vg + +lvcreate -i3 -l2 -m2 --mirrorlog core -n $lv1 $vg 2>&1 | tee log +grep "Rounding size (2 extents) up to .* (3 extents)" log +lvremove -ff $vg + +lvcreate -i3 -l4 -m2 --mirrorlog core -n $lv1 $vg 2>&1 | tee log +grep "Rounding size (4 extents) up to .* (6 extents)" log +lvremove -ff $vg + +lvcreate -i3 -l4 -m1 --mirrorlog core -n $lv1 $vg 2>&1 | tee log +grep "Rounding size (4 extents) up to .* (6 extents)" log +lvremove -ff $vg + +lvcreate -i4 -l4 -m1 --mirrorlog core -n $lv1 $vg 2>&1 | tee log +not grep "Rounding" log +lvremove -ff $vg diff --git a/test/shell/lvcreate-thin.sh b/test/shell/lvcreate-thin.sh new file mode 100644 index 00000000..57a5988b --- /dev/null +++ b/test/shell/lvcreate-thin.sh @@ -0,0 +1,186 @@ +#!/bin/sh + +# Copyright (C) 2011 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + +# test currently needs to drop +# 'return NULL' in _lv_create_an_lv after log_error("Can't create %s without using " + +. lib/test + +check_lv_exists_() +{ + for d in $*; do + check lv_exists $vg $d + done +} + +check_lv_field_modules_() +{ + mod=$1 + shift + + for d in $*; do + check lv_field $vg/$d modules $mod + done +} + + +# +# Main +# +aux target_at_least dm-thin-pool 1 0 0 || skip + +aux prepare_devs 2 64 + +pvcreate $dev1 $dev2 + +clustered= +test -e LOCAL_CLVMD && clustered="--clustered y" + +vgcreate $clustered $vg -s 64K $dev1 $dev2 + +# Create named pool only +lvcreate -l1 -T $vg/pool1 +lvcreate -l1 -T --thinpool $vg/pool2 +lvcreate -l1 -T --thinpool pool3 $vg +lvcreate -l1 --type thin $vg/pool4 +lvcreate -l1 --type thin --thinpool $vg/pool5 +lvcreate -l1 --type thin --thinpool pool6 $vg +lvcreate -l1 --type thin_pool $vg/pool7 +lvcreate -l1 --type thin_pool --thinpool $vg/pool8 +lvcreate -l1 --type thin_pool --thinpool pool9 $vg + +lvremove -ff $vg/pool1 $vg/pool2 $vg/pool3 $vg/pool4 $vg/pool5 $vg/pool6 $vg/pool7 $vg/pool8 $vg/pool9 +check vg_field $vg lv_count 0 + + +# Create default pool name +lvcreate -l1 -T $vg +lvcreate -l1 --type thin $vg +lvcreate -l1 --type thin_pool $vg + +lvremove -ff $vg/lvol0 $vg/lvol1 $vg/lvol2 +check vg_field $vg lv_count 0 + + +# Create default pool and default thin LV +lvcreate -l1 -V2G -T $vg +lvcreate -l1 -V2G --type thin $vg + +lvremove -ff $vg + + +# Create named pool and default thin LV +lvcreate -L4M -V2G -T $vg/pool1 +lvcreate -L4M -V2G -T --thinpool $vg/pool2 +lvcreate -L4M -V2G -T --thinpool pool3 $vg +lvcreate -L4M -V2G --type thin $vg/pool4 +lvcreate -L4M -V2G --type thin --thinpool $vg/pool5 +lvcreate -L4M -V2G --type thin --thinpool pool6 $vg + +check_lv_exists_ lvol0 lvol1 lvol2 lvol3 lvol4 lvol5 +lvremove -ff $vg + + +# Create named pool and named thin LV +lvcreate -L4M -V2G -T $vg/pool1 --name lv1 +lvcreate -L4M -V2G -T $vg/pool2 --name $vg/lv2 +lvcreate -L4M -V2G -T --thinpool $vg/pool3 --name lv3 +lvcreate -L4M -V2G -T --thinpool $vg/pool4 --name $vg/lv4 +lvcreate -L4M -V2G -T --thinpool pool5 --name lv5 $vg +lvcreate -L4M -V2G -T --thinpool pool6 --name $vg/lv6 $vg + +check_lv_exists_ lv1 lv2 lv3 lv4 lv5 lv6 +lvremove -ff $vg + + +lvcreate -L4M -V2G --type thin $vg/pool1 --name lv1 +lvcreate -L4M -V2G --type thin $vg/pool2 --name $vg/lv2 +lvcreate -L4M -V2G --type thin --thinpool $vg/pool3 --name lv3 +lvcreate -L4M -V2G --type thin --thinpool $vg/pool4 --name $vg/lv4 +lvcreate -L4M -V2G --type thin --thinpool pool5 --name lv5 $vg +lvcreate -L4M -V2G --type thin --thinpool pool6 --name $vg/lv6 $vg + +check_lv_exists_ lv1 lv2 lv3 lv4 lv5 lv6 +lvremove -ff $vg + + +# Create default thin LV in existing pool +lvcreate -L4M -T $vg/pool +lvcreate -V2G -T $vg/pool +lvcreate -V2G -T --thinpool $vg/pool +lvcreate -V2G -T --thinpool pool $vg +lvcreate -V2G --type thin $vg/pool +lvcreate -V2G --type thin --thinpool $vg/pool +lvcreate -V2G --type thin --thinpool pool $vg + +check_lv_exists_ lvol0 lvol1 lvol2 lvol3 lvol4 lvol5 + + +# Create named thin LV in existing pool +lvcreate -V2G -T $vg/pool --name lv1 +lvcreate -V2G -T $vg/pool --name $vg/lv2 +lvcreate -V2G -T --thinpool $vg/pool --name lv3 +lvcreate -V2G -T --thinpool $vg/pool --name $vg/lv4 +lvcreate -V2G -T --thinpool pool --name lv5 $vg +lvcreate -V2G -T --thinpool pool --name $vg/lv6 $vg +lvcreate -V2G --type thin $vg/pool --name lv7 +lvcreate -V2G --type thin $vg/pool --name $vg/lv8 +lvcreate -V2G --type thin --thinpool $vg/pool --name lv9 +lvcreate -V2G --type thin --thinpool $vg/pool --name $vg/lv10 +lvcreate -V2G --type thin --thinpool pool --name lv11 $vg +lvcreate -V2G --type thin --thinpool pool --name $vg/lv12 $vg + +check_lv_exists_ lv1 lv2 lv3 lv4 lv5 lv6 lv7 lv8 lv9 lv10 lv11 lv12 +check vg_field $vg lv_count 19 + +lvremove -ff $vg +check vg_field $vg lv_count 0 + +# Create thin snapshot of thinLV +lvcreate -L10M -V10M -T $vg/pool --name lv1 +mkfs.ext4 $DM_DEV_DIR/$vg/lv1 +lvcreate -s $vg/lv1 +fsck -p $DM_DEV_DIR/$vg/lvol0 +lvcreate -s $vg/lv1 --name lv2 +lvcreate -s $vg/lv1 --name $vg/lv3 +lvcreate --type snapshot $vg/lv1 +lvcreate --type snapshot $vg/lv1 --name lv4 +lvcreate --type snapshot $vg/lv1 --name $vg/lv5 + +check_lv_field_modules_ thin-pool lv1 lvol0 lv2 lv3 lvol1 lv4 lv5 +check vg_field $vg lv_count 8 +lvremove -ff $vg + + +# Normal Snapshots of thinLV +lvcreate -L4M -V2G -T $vg/pool --name lv1 +lvcreate -s $vg/lv1 -l1 +lvcreate -s $vg/lv1 -l1 --name lv2 +lvcreate -s $vg/lv1 -l1 --name $vg/lv3 +lvcreate -s lv1 -L4M --name $vg/lv4 + +check_lv_field_modules_ snapshot lvol0 lv2 lv3 lv4 +check vg_field $vg lv_count 6 + +lvremove -ff $vg +check vg_field $vg lv_count 0 + + +# Fail cases +# Too small pool size (1 extent 64KB) for given chunk size +not lvcreate --chunksize 256 -l1 -T $vg/pool1 +# Too small chunk size (min is 64KB - 128 sectors) +not lvcreate --chunksize 32 -l1 -T $vg/pool1 + +lvcreate -L4M -V2G --name lv1 -T $vg/pool1 +# Origin name is not accepted +not lvcreate -s $vg/lv1 -L4M -V2G --name $vg/lv4 diff --git a/test/shell/lvcreate-usage.sh b/test/shell/lvcreate-usage.sh new file mode 100644 index 00000000..b8e6967d --- /dev/null +++ b/test/shell/lvcreate-usage.sh @@ -0,0 +1,152 @@ +#!/bin/sh +# Copyright (C) 2008 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + +# 'Exercise some lvcreate diagnostics' + +. lib/test + +aux prepare_pvs 4 +aux pvcreate --metadatacopies 0 $dev1 +vgcreate -cn $vg $(cat DEVICES) + +# "lvcreate rejects repeated invocation (run 2 times) (bz178216)" +lvcreate -n $lv -l 4 $vg +not lvcreate -n $lv -l 4 $vg +lvremove -ff $vg/$lv +# try to remove it again - should fail (but not segfault) +not lvremove -ff $vg/$lv + +# "lvcreate rejects a negative stripe_size" +not lvcreate -L 64m -n $lv -i2 --stripesize -4 $vg 2>err; +grep "^ Negative stripesize is invalid\$" err + +# 'lvcreate rejects a too-large stripesize' +not lvcreate -L 64m -n $lv -i2 --stripesize 4294967291 $vg 2>err +grep "^ Stripe size cannot be larger than" err + +# 'lvcreate w/single stripe succeeds with diagnostics to stdout' +lvcreate -L 64m -n $lv -i1 --stripesize 4 $vg 2> err | tee out +grep "^ Ignoring stripesize argument with single stripe\$" out +lvdisplay $vg +lvremove -ff $vg + +# 'lvcreate w/default (64KB) stripe size succeeds with diagnostics to stdout' +lvcreate -L 64m -n $lv -i2 $vg > out +grep "^ Using default stripesize" out +lvdisplay $vg +check lv_field $vg/$lv stripesize "64.00k" +lvremove -ff $vg + +# 'lvcreate rejects an invalid number of stripes' +not lvcreate -L 64m -n $lv -i129 $vg 2>err +grep "^ Number of stripes (129) must be between 1 and 128\$" err + +# The case on lvdisplay output is to verify that the LV was not created. +# 'lvcreate rejects an invalid stripe size' +not lvcreate -L 64m -n $lv -i2 --stripesize 3 $vg 2>err +grep "^ Invalid stripe size" err +case $(lvdisplay $vg) in "") true ;; *) false ;; esac + +# Setting max_lv works. (bz490298) +lvremove -ff $vg +vgchange -l 3 $vg +lvcreate -l1 -n $lv1 $vg +lvcreate -l1 -s -n $lv2 $vg/$lv1 +lvcreate -l1 -n $lv3 $vg +not lvcreate -l1 -n $lv4 $vg + +lvremove -ff $vg/$lv3 +lvcreate -l1 -s -n $lv3 $vg/$lv1 +not lvcreate -l1 -n $lv4 $vg +not lvcreate -l1 -m1 -n $lv4 $vg + +lvremove -ff $vg/$lv3 +lvcreate -l1 -m1 -n $lv3 $vg +lvs +vgs -o +max_lv +not lvcreate -l1 -n $lv4 $vg +not lvcreate -l1 -m1 -n $lv4 $vg + +lvconvert -m0 $vg/$lv3 +lvconvert -m2 -i 1 $vg/$lv3 +lvconvert -m1 $vg/$lv3 + +not vgchange -l 2 +vgchange -l 4 +vgs $vg + +lvremove -ff $vg +vgchange -l 0 $vg + +# lvcreate rejects invalid chunksize, accepts between 4K and 512K +# validate origin_size +vgremove -ff $vg +vgcreate -cn $vg $(cat DEVICES) +lvcreate -L 32m -n $lv1 $vg +not lvcreate -L 8m -n $lv2 -s --chunksize 3k $vg/$lv1 +not lvcreate -L 8m -n $lv2 -s --chunksize 1024k $vg/$lv1 +lvcreate -L 8m -n $lv2 -s --chunksize 4k $vg/$lv1 +check lv_field $vg/$lv2 chunk_size 4.00k +check lv_field $vg/$lv2 origin_size 32.00m +lvcreate -L 8m -n $lv3 -s --chunksize 512k $vg/$lv1 +check lv_field $vg/$lv3 chunk_size 512.00k +check lv_field $vg/$lv3 origin_size 32.00m +lvremove -ff $vg +vgchange -l 0 $vg + +# regionsize must be +# - nonzero (bz186013) +# - a power of 2 and a multiple of page size +# - <= size of LV +not lvcreate -L 32m -n $lv -R0 $vg 2>err +grep "Non-zero region size must be supplied." err +not lvcreate -L 32m -n $lv -R 11k $vg +not lvcreate -L 32m -n $lv -R 1k $vg +lvcreate -L 32m -n $lv --regionsize 128m -m 1 $vg +check lv_field $vg/$lv regionsize "32.00m" +lvremove -ff $vg +lvcreate -L 32m -n $lv --regionsize 4m -m 1 $vg +check lv_field $vg/$lv regionsize "4.00m" +lvremove -ff $vg + +# snapshot with virtual origin works +lvcreate -s --virtualoriginsize 64m -L 32m -n $lv1 $vg +lvrename $vg/$lv1 $vg/$lv2 +lvcreate -s --virtualoriginsize 64m -L 32m -n $lv1 $vg +lvchange -a n $vg/$lv1 +lvremove -ff $vg/$lv1 +lvremove -ff $vg + +# readahead default (auto), none, #, auto +lvcreate -L 32m -n $lv $vg +check lv_field $vg/$lv lv_read_ahead "auto" +lvremove -ff $vg +lvcreate -L 32m -n $lv --readahead none $vg +check lv_field $vg/$lv lv_read_ahead "0" +check lv_field $vg/$lv lv_kernel_read_ahead "0" +lvremove -ff $vg +lvcreate -L 32m -n $lv --readahead 8k $vg +check lv_field $vg/$lv lv_read_ahead "8.00k" +check lv_field $vg/$lv lv_kernel_read_ahead "8.00k" +lvremove -ff $vg +lvcreate -L 32m -n $lv --readahead auto $vg +check lv_field $vg/$lv lv_read_ahead "auto" +check lv_field $vg/$lv lv_kernel_read_ahead "128.00k" +lvremove -ff $vg +lvcreate -L 32m -n $lv -i2 --stripesize 16k --readahead auto $vg +check lv_field $vg/$lv lv_read_ahead "auto" +check lv_field $vg/$lv lv_kernel_read_ahead "128.00k" +lvremove -ff $vg +lvcreate -L 32m -n $lv -i2 --stripesize 128k --readahead auto $vg +check lv_field $vg/$lv lv_read_ahead "auto" +check lv_field $vg/$lv lv_kernel_read_ahead "512.00k" +lvremove -ff $vg + diff --git a/test/shell/lvextend-percent-extents.sh b/test/shell/lvextend-percent-extents.sh new file mode 100644 index 00000000..ecd5a1b2 --- /dev/null +++ b/test/shell/lvextend-percent-extents.sh @@ -0,0 +1,106 @@ +#!/bin/sh +# Copyright (C) 2008 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + +# 'Check extents percentage arguments' + +. lib/test + +aux prepare_vg 2 128 + +lvcreate -L 64m -n $lv $vg + +# 'lvextend rejects both size and extents without PVs' +not lvextend -l 10 -L 64m $vg/$lv 2>err +grep "^ Please specify either size or extents but not both.\$" err + +# 'lvextend rejects both size and extents with PVs' +not lvextend -l 10 -L 64m $vg/$lv $dev1 2>err +grep "^ Please specify either size or extents but not both.\$" err + +# 'lvextend accepts no size or extents but one PV - bz154691' +lvextend $vg/$lv $dev1 >out +grep "^ Logical volume $lv successfully resized\$" out +check pv_field $dev1 pv_free "0" + +lvremove -f $vg/$lv + +# 'lvextend computes necessary free space correctly - bz213552' +vgsize=$(vgs -o vg_extent_count --noheadings) +lvcreate -l $vgsize -n $lv $vg +lvreduce -f -l $(( $vgsize / 2 )) $vg/$lv +lvextend -l $vgsize $vg/$lv + +# 'Reset LV to original size' +lvremove -f $vg/$lv +lvcreate -L 64m -n $lv $vg + +# 'lvextend accepts no size but extents 100%PVS and two PVs - bz154691' +lvextend -l +100%PVS $vg/$lv $dev1 $dev2 >out +grep "^ Logical volume $lv successfully resized\$" out +check pv_field $dev1 pv_free "0" +check pv_field $dev2 pv_free "0" + +# Exercise the range overlap code. Allocate every 2 extents. +# +# Physical Extents +# 1 2 +#012345678901234567890123 +# +#aaXXaaXXaaXXaaXXaaXXaaXX - (a)llocated +#rrrXXXrrrXXXrrrXXXrrrXXX - (r)ange on cmdline +#ooXXXXXXoXXXooXXXXXXoXXX - (o)verlap of range and allocated +# +# Key: a - allocated +# F - free +# r - part of a range on the cmdline +# N - not on cmdline +# +# Create the LV with 12 extents, allocated every other 2 extents. +# Then extend it, with a range of PVs on the cmdline of every other 3 extents. +# Total number of extents should be 12 + overlap = 12 + 6 = 18. +# Thus, total size for the LV should be 18 * 4M = 72M +# +# 'Reset LV to 12 extents, allocate every other 2 extents' +create_pvs=`for i in $(seq 0 4 20); do echo -n "\$dev1:$i-$(($i + 1)) "; done` +lvremove -f $vg/$lv +lvcreate -l 12 -n $lv $vg $create_pvs +check lv_field $vg/$lv lv_size "48.00m" + +# 'lvextend with partially allocated PVs and extents 100%PVS with PE ranges' +extend_pvs=`for i in $(seq 0 6 18); do echo -n "\$dev1:$i-$(($i + 2)) "; done` +lvextend -l +100%PVS $vg/$lv $extend_pvs >out +grep "^ Logical volume $lv successfully resized\$" out +check lv_field $vg/$lv lv_size "72.00m" + +# Simple seg_count validation; initially create the LV with half the # of +# extents (should be 1 lv segment), extend it (should go to 2 segments), +# then reduce (should be back to 1) +# FIXME: test other segment fields such as seg_size, pvseg_start, pvseg_size +lvremove -f $vg/$lv +pe_count=$(pvs -o pv_pe_count --noheadings $dev1) +pe1=$(( $pe_count / 2 )) +lvcreate -l $pe1 -n $lv $vg +pesize=$(lvs -ovg_extent_size --units b --nosuffix --noheadings $vg/$lv) +segsize=$(( $pe1 * $pesize / 1024 / 1024 ))m +check lv_field $vg/$lv seg_count 1 +check lv_field $vg/$lv seg_start 0 +check lv_field $vg/$lv seg_start_pe 0 +#check lv_field $vg/$lv seg_size $segsize +lvextend -l +$(( $pe_count * 1 )) $vg/$lv +check lv_field $vg/$lv seg_count 2 +lvreduce -f -l -$(( $pe_count * 1 )) $vg/$lv +check lv_field $vg/$lv seg_count 1 + +# do not reduce to 0 extents +lvremove -f $vg/$lv +lvcreate -i2 -I 64k -l10 -n $lv $vg +lvreduce -f -l1 $vg/$lv +check lv_field $vg/$lv lv_size "8.00m" diff --git a/test/shell/lvextend-snapshot-dmeventd.sh b/test/shell/lvextend-snapshot-dmeventd.sh new file mode 100644 index 00000000..44b5a291 --- /dev/null +++ b/test/shell/lvextend-snapshot-dmeventd.sh @@ -0,0 +1,51 @@ +#!/bin/bash +# Copyright (C) 2010 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + +. lib/test + +extend() { + lvextend --use-policies --config "activation { snapshot_extend_threshold = $1 }" $vg/snap +} + +write() { + mount $DM_DEV_DIR/$vg/snap mnt + dd if=/dev/zero of=mnt/file$1 bs=1k count=$2 + umount mnt +} + +percent() { + lvs $vg/snap -o snap_percent --noheadings | cut -c4- | cut -d. -f1 +} + +which mkfs.ext2 || exit 200 + +aux prepare_vg 2 +aux prepare_dmeventd + +lvcreate -l 8 -n base $vg +mkfs.ext2 $DM_DEV_DIR/$vg/base + +lvcreate -s -l 4 -n snap $vg/base +lvchange --monitor y $vg/snap + +mkdir mnt + +write 1 4096 +pre=`percent` +sleep 10 # dmeventd only checks every 10 seconds :( +post=`percent` + +test $pre = $post +write 2 5000 +pre=`percent` +sleep 10 # dmeventd only checks every 10 seconds :( +post=`percent` +test $pre -gt $post diff --git a/test/shell/lvextend-snapshot-policy.sh b/test/shell/lvextend-snapshot-policy.sh new file mode 100644 index 00000000..2760cfc2 --- /dev/null +++ b/test/shell/lvextend-snapshot-policy.sh @@ -0,0 +1,47 @@ +#!/bin/bash +# Copyright (C) 2010 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + +. lib/test + +extend() { + lvextend --use-policies --config "activation { snapshot_extend_threshold = $1 }" $vg/snap +} + +write() { + mount $DM_DEV_DIR/$vg/snap mnt + dd if=/dev/zero of=mnt/file$1 bs=1k count=$2 + umount mnt +} + +percent() { + lvs $vg/snap -o snap_percent --noheadings | cut -c4- | cut -d. -f1 +} + +which mkfs.ext2 || exit 200 + +aux prepare_vg 2 +lvcreate -l 8 -n base $vg +mkfs.ext2 $DM_DEV_DIR/$vg/base + +lvcreate -s -l 4 -n snap $vg/base +mkdir mnt + +write 1 4096 +pre=`percent` +extend 50 +post=`percent` + +test $pre = $post +write 2 4096 +pre=`percent` +extend 50 +post=`percent` +test $pre -gt $post diff --git a/test/shell/lvm-init.sh b/test/shell/lvm-init.sh new file mode 100644 index 00000000..a9a66f9c --- /dev/null +++ b/test/shell/lvm-init.sh @@ -0,0 +1,21 @@ +# Copyright (C) 2008 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + +# +# tests lvm initialization, and especially negative tests of error paths +# + +. lib/test + +aux prepare_devs 5 + +# invalid units +not pvs --config 'global { units = "<" }' + diff --git a/test/shell/lvmcache-exercise.sh b/test/shell/lvmcache-exercise.sh new file mode 100644 index 00000000..4adee1f4 --- /dev/null +++ b/test/shell/lvmcache-exercise.sh @@ -0,0 +1,23 @@ +# Copyright (C) 2008 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + +. lib/test + +aux prepare_pvs 5 + +vgcreate $vg1 $dev1 +vgcreate $vg2 $dev3 + +aux disable_dev $dev1 +pvscan +vgcreate $vg1 $dev2 +aux enable_dev $dev1 +pvs +pvs diff --git a/test/shell/lvresize-mirror.sh b/test/shell/lvresize-mirror.sh new file mode 100644 index 00000000..ecf3148b --- /dev/null +++ b/test/shell/lvresize-mirror.sh @@ -0,0 +1,38 @@ +#!/bin/sh +# Copyright (C) 2010 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + +. lib/test +aux prepare_vg 5 80 + +# extend 2-way mirror +lvcreate -l2 -m1 -n $lv1 $vg $dev1 $dev2 $dev3:0-1 +lvchange -an $vg/$lv1 +lvextend -l+2 $vg/$lv1 +check mirror $vg $lv1 $dev3 +check mirror_images_contiguous $vg $lv1 +lvremove -ff $vg + +# reduce 2-way mirror +lvcreate -l4 -m1 -n $lv1 $vg $dev1 $dev2 $dev3:0-1 +lvchange -an $vg/$lv1 +lvreduce -l-2 $vg/$lv1 +check mirror $vg $lv1 $dev3 +lvremove -ff $vg + +# extend 2-way mirror (cling if not contiguous) +lvcreate -l2 -m1 -n $lv1 $vg $dev1 $dev2 $dev3:0-1 +lvcreate -l1 -n $lv2 $vg $dev1 +lvcreate -l1 -n $lv3 $vg $dev2 +lvchange -an $vg/$lv1 +lvextend -l+2 $vg/$lv1 +check mirror $vg $lv1 $dev3 +check mirror_images_clung $vg $lv1 +lvremove -ff $vg diff --git a/test/shell/lvresize-rounding.sh b/test/shell/lvresize-rounding.sh new file mode 100644 index 00000000..e5d64192 --- /dev/null +++ b/test/shell/lvresize-rounding.sh @@ -0,0 +1,25 @@ +# Copyright (C) 2007-2008 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + +. lib/test + +aux prepare_vg 2 + +lvcreate -l 10 -n lv -i2 $vg + +lvextend -l +1 $vg/lv 2>&1 | tee log +grep 'down to stripe' log +lvresize -l +1 $vg/lv 2>&1 | tee log +grep 'down to stripe' log + +lvreduce -f -l -1 $vg/lv 2>&1 | tee log +grep 'up to stripe' log +lvresize -f -l -1 $vg/lv 2>&1 | tee log +grep 'up to stripe' log diff --git a/test/shell/lvresize-usage.sh b/test/shell/lvresize-usage.sh new file mode 100644 index 00000000..37df0b20 --- /dev/null +++ b/test/shell/lvresize-usage.sh @@ -0,0 +1,20 @@ +# Copyright (C) 2007-2008 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + +. lib/test + +aux prepare_vg 2 + +lvcreate -L 10M -n lv -i2 $vg +lvresize -l +4 $vg/lv +lvremove -ff $vg + +lvcreate -L 64M -n $lv -i2 $vg +not lvresize -v -l +4 xxx/$lv diff --git a/test/shell/mdata-strings.sh b/test/shell/mdata-strings.sh new file mode 100644 index 00000000..e5bea886 --- /dev/null +++ b/test/shell/mdata-strings.sh @@ -0,0 +1,39 @@ +#!/bin/sh +# Copyright (C) 2008-2011 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + +# 'Test for proper escaping of strings in metadata (bz431474)' + +. lib/test + +aux prepare_devs 2 + +# for udev impossible to create +pv_ugly="__\"!@#\$%^&*,()|@||'\\\"__pv1" + +# 'set up temp files, loopback devices' +name=$(basename "$dev1") +dmsetup rename "$name" "$PREFIX$pv_ugly" +dev1=$(dirname "$dev1")/$PREFIX$pv_ugly + +dmsetup table | grep -F "$pv_ugly" + +# 'pvcreate, vgcreate on filename with backslashed chars' +created=$dev1 +# when used with real udev without fallback, it will fail here +pvcreate "$dev1" || created=$dev2 +pvdisplay | should grep -F "$pv_ugly" +should check pv_field "$dev1" pv_name "$dev1" +vgcreate $vg "$created" +# 'no parse errors and VG really exists' +vgs 2>err +not grep "Parse error" err; +vgs $vg + diff --git a/test/shell/metadata-balance.sh b/test/shell/metadata-balance.sh new file mode 100644 index 00000000..476489ca --- /dev/null +++ b/test/shell/metadata-balance.sh @@ -0,0 +1,232 @@ +# Copyright (C) 2008 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + +. lib/test + +aux prepare_devs 6 + +echo Make sure we can ignore / un-ignore mdas on a per-PV basis +for pv_in_vg in 1 0; do +for mdacp in 1 2; do + pvcreate --metadatacopies $mdacp $dev1 $dev2 + pvcreate --metadatacopies 0 $dev3 + if [ $pv_in_vg = 1 ]; then + vgcreate -c n "$vg" $dev1 $dev2 $dev3 + fi + pvchange --metadataignore y $dev1 + check pv_field $dev1 pv_mda_count $mdacp + check pv_field $dev1 pv_mda_used_count 0 + check pv_field $dev2 pv_mda_count $mdacp + check pv_field $dev2 pv_mda_used_count $mdacp + if [ $pv_in_vg = 1 ]; then + check vg_field $vg vg_mda_count $(($mdacp * 2)) + check vg_field $vg vg_mda_used_count $mdacp + check vg_field $vg vg_mda_copies unmanaged + fi + pvchange --metadataignore n $dev1 + check pv_field $dev1 pv_mda_count $mdacp + check pv_field $dev1 pv_mda_used_count $mdacp + if [ $pv_in_vg = 1 ]; then + check vg_field $vg vg_mda_count $(($mdacp * 2)) + check vg_field $vg vg_mda_used_count $(($mdacp * 2)) + check vg_field $vg vg_mda_copies unmanaged + vgremove -f $vg + fi +done +done + +# Check if a PV has unignored (used) mdas, and if so, ignore +pvignore_ () { + pv_mda_used_count=$(get pv_field "$1" pv_mda_used_count) + if [ $pv_mda_used_count -ne 0 ]; then + pvchange --metadataignore y $1 + fi +} + +# Check if a PV has ignored mdas, and if so, unignore (make used) +pvunignore_ () { + pv_mda_count=$(get pv_field "$1" pv_mda_count) + pv_mda_used_count=$(get pv_field "$1" pv_mda_used_count) + if [ $pv_mda_count -gt $pv_mda_used_count ]; then + pvchange --metadataignore n $1 + fi +} + +echo Test of vgmetadatacopies with vgcreate and vgchange +for mdacp in 1 2; do + pvcreate --metadatacopies $mdacp $dev1 $dev2 $dev4 $dev5 + check pv_field $dev1 pv_mda_used_count $mdacp + check pv_field $dev2 pv_mda_used_count $mdacp + check pv_field $dev4 pv_mda_used_count $mdacp + check pv_field $dev5 pv_mda_used_count $mdacp + pvcreate --metadatacopies 0 $dev3 + vgcreate -c n "$vg" $dev1 $dev2 $dev3 + check vg_field $vg vg_mda_copies unmanaged + echo ensure both --vgmetadatacopies and --metadatacopies accepted + vgchange --metadatacopies $(($mdacp * 1)) $vg + echo --vgmetadatacopies is persistent on disk + echo --vgmetadatacopies affects underlying pv mda ignore + check vg_field $vg vg_mda_copies $(($mdacp * 1)) + check vg_field $vg vg_mda_used_count $(($mdacp * 1)) + vgchange --vgmetadatacopies $(($mdacp * 2)) $vg + check vg_field $vg vg_mda_copies $(($mdacp * 2)) + check vg_field $vg vg_mda_used_count $(($mdacp * 2)) + echo allow setting metadatacopies larger than number of PVs + vgchange --vgmetadatacopies $(($mdacp * 5)) $vg + check vg_field $vg vg_mda_copies $(($mdacp * 5)) + check vg_field $vg vg_mda_used_count $(($mdacp * 2)) + echo setting to 0 disables automatic balancing + vgchange --vgmetadatacopies unmanaged $vg + check vg_field $vg vg_mda_copies unmanaged + vgremove -f $vg + echo vgcreate succeeds even when creating a VG w/all ignored mdas + pvchange --metadataignore y $dev1 $dev2 + check pv_field $dev1 pv_mda_count $mdacp + check pv_field $dev2 pv_mda_used_count 0 + vgcreate -c n "$vg" $dev1 $dev2 + check vg_field $vg vg_mda_copies unmanaged + vgremove -f $vg + echo vgcreate succeeds with a specific number of metadata copies + vgcreate -c n --vgmetadatacopies $(($mdacp * 2)) "$vg" $dev1 $dev2 + check vg_field $vg vg_mda_copies $(($mdacp * 2)) + vgremove -f $vg + vgcreate -c n --vgmetadatacopies $(($mdacp * 1)) "$vg" $dev1 $dev2 + check vg_field $vg vg_mda_copies $(($mdacp * 1)) + vgremove -f $vg + echo vgcreate succeeds with a larger value than total metadatacopies + vgcreate -c n --vgmetadatacopies $(($mdacp * 5)) "$vg" $dev1 $dev2 + check vg_field $vg vg_mda_copies $(($mdacp * 5)) + vgremove -f $vg + echo vgcreate succeeds with --vgmetadatacopies unmanaged + vgcreate -c n --vgmetadatacopies unmanaged "$vg" $dev1 $dev2 + check vg_field $vg vg_mda_copies unmanaged + vgremove -f $vg + pvunignore_ $dev1 + pvunignore_ $dev2 + pvunignore_ $dev4 + pvunignore_ $dev5 + echo vgcreate succeds with small value of --metadatacopies, ignores mdas + vgcreate -c n --vgmetadatacopies 1 "$vg" $dev1 $dev2 $dev4 $dev5 + check vg_field $vg vg_mda_copies 1 + check vg_field $vg vg_mda_count $(($mdacp * 4)) + check vg_field $vg vg_mda_used_count 1 + echo Setting a larger value should trigger non-ignore of mdas + vgchange --metadatacopies 3 $vg + check vg_field $vg vg_mda_copies 3 + check vg_field $vg vg_mda_used_count 3 + echo Setting all should trigger unignore of all mdas + vgchange --vgmetadatacopies all $vg + check vg_field $vg vg_mda_count $(($mdacp * 4)) + check vg_field $vg vg_mda_copies unmanaged + check vg_field $vg vg_mda_used_count $(($mdacp * 4)) + echo --vgmetadatacopies 0 should be unmanaged for vgchange and vgcreate + vgchange --vgmetadatacopies 0 $vg + check vg_field $vg vg_mda_copies unmanaged + vgremove -f $vg + vgcreate -c n --vgmetadatacopies 0 "$vg" $dev1 $dev2 $dev4 $dev5 + check vg_field $vg vg_mda_copies unmanaged + vgremove -f $vg +done + +echo Test vgextend / vgreduce with vgmetadatacopies +for mdacp in 1 2; do + pvcreate --metadatacopies $mdacp $dev1 $dev2 $dev4 $dev5 + pvcreate --metadatacopies 0 $dev3 + echo Set a large value of vgmetadatacopies + vgcreate -c n --vgmetadatacopies $(($mdacp * 5)) "$vg" $dev1 $dev2 $dev3 + check vg_field $vg vg_mda_copies $(($mdacp * 5)) + echo Ignore mdas on devices to be used for vgextend + echo Large value of vgetadatacopies should automatically un-ignore mdas + pvchange --metadataignore y $dev4 $dev5 + check pv_field $dev4 pv_mda_used_count 0 + vgextend $vg $dev4 $dev5 + check pv_field $dev4 pv_mda_used_count $mdacp + check pv_field $dev5 pv_mda_used_count $mdacp + vgremove -f $vg + echo Set a small value of vgmetadatacopies + vgcreate -c n --vgmetadatacopies $(($mdacp * 1)) "$vg" $dev1 $dev2 $dev3 + check vg_field $vg vg_mda_copies $(($mdacp * 1)) + echo Ignore mdas on devices to be used for vgextend + echo Small value of vgetadatacopies should leave mdas as ignored + pvchange --metadataignore y $dev4 $dev5 + check pv_field $dev4 pv_mda_used_count 0 + vgextend $vg $dev4 $dev5 + check pv_field $dev4 pv_mda_used_count 0 + check pv_field $dev5 pv_mda_used_count 0 + echo vgreduce of ignored pv w/mda should not trigger any change to ignore bits + vgreduce $vg $dev4 + check pv_field $dev4 pv_mda_used_count 0 + check pv_field $dev5 pv_mda_used_count 0 + echo vgreduce of un-ignored pv w/mda should trigger un-ignore on an mda + vgreduce $vg $dev1 $dev2 $dev3 + check pv_field $dev5 pv_mda_used_count $mdacp + check vg_field $vg vg_mda_copies $(($mdacp * 1)) + pvunignore_ $dev1 + pvunignore_ $dev2 + echo setting vgmetadatacopies to unmanaged should allow vgextend to add w/out balancing + vgchange --vgmetadatacopies unmanaged $vg + vgextend $vg $dev1 $dev2 + check vg_field $vg vg_mda_copies unmanaged + check vg_field $vg vg_mda_count $(($mdacp * 3)) + check vg_field $vg vg_mda_used_count $((mdacp * 3)) + check pv_field $dev1 pv_mda_used_count $mdacp + check pv_field $dev2 pv_mda_used_count $mdacp + vgremove -f $vg +done + +echo Test special situations, vgsplit, vgmerge, etc +for mdacp in 1 2; do + pvcreate --metadatacopies $mdacp $dev1 $dev2 $dev3 $dev4 $dev5 + vgcreate -c n --vgmetadatacopies 2 $vg1 $dev1 $dev2 $dev3 + vgcreate -c n --vgmetadatacopies $(($mdacp * 1)) $vg2 $dev4 $dev5 + echo vgsplit/vgmerge preserves value of metadata copies + check vg_field $vg1 vg_mda_copies 2 + check vg_field $vg2 vg_mda_copies $(($mdacp * 1)) + vgsplit $vg1 $vg2 $dev1 + check vg_field $vg2 vg_mda_copies $(($mdacp * 1)) + vgmerge $vg1 $vg2 + check vg_field $vg1 vg_mda_copies 2 + check vg_field $vg1 vg_mda_count $(($mdacp * 5)) + echo vgsplit into new vg sets proper value of vgmetadatacopies + vgsplit --vgmetadatacopies $(($mdacp * 2)) $vg1 $vg2 $dev1 $dev2 + check vg_field $vg2 vg_mda_copies $(($mdacp * 2)) + echo vgchange fails if given both vgmetadatacopies and metadatacopies + not vgchange --vgmetadatacopies 5 --metadatacopies 7 $vg2 + vgremove -f $vg1 + vgremove -f $vg2 +done + +echo Test combination of --vgmetadatacopies and pvchange --metadataignore +for mdacp in 1 2; do + pvcreate --metadatacopies $mdacp $dev1 $dev2 $dev3 $dev4 $dev5 + vgcreate -c n --vgmetadatacopies $(($mdacp * 1)) $vg1 $dev1 $dev2 + check vg_field $vg1 vg_mda_copies $(($mdacp * 1)) + check vg_field $vg1 vg_mda_used_count $(($mdacp * 1)) + pvignore_ $dev3 + echo Ensure vgextend of PVs with ignored MDAs does not add to vg_mda_used_count + vgextend $vg1 $dev3 + check vg_field $vg1 vg_mda_used_count $(($mdacp * 1)) + echo Using pvchange to unignore should update vg_mda_used_count + pvchange -f --metadataignore n $dev3 + check pv_field $dev3 pv_mda_used_count $mdacp + check vg_field $vg1 vg_mda_used_count $(($mdacp * 2)) + echo Set unmanaged on the vg should keep ignore bits the same during vgextend + vgchange --vgmetadatacopies unmanaged $vg1 + check vg_field $vg1 vg_mda_used_count $(($mdacp * 2)) + pvunignore_ $dev4 + vgextend $vg1 $dev4 + check pv_field $dev4 pv_mda_used_count $mdacp + check vg_field $vg1 vg_mda_used_count $(($mdacp * 3)) + echo Using pvchange to ignore should update vg_mda_used_count + pvchange -f --metadataignore y $dev4 + check pv_field $dev4 pv_mda_used_count 0 + check vg_field $vg1 vg_mda_used_count $(($mdacp * 2)) + vgremove -f $vg1 +done diff --git a/test/shell/metadata-dirs.sh b/test/shell/metadata-dirs.sh new file mode 100644 index 00000000..aaa80dee --- /dev/null +++ b/test/shell/metadata-dirs.sh @@ -0,0 +1,43 @@ +#!/bin/sh +# Copyright (C) 2011 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + +. lib/test + +aux prepare_devs 3 +pvcreate --metadatacopies 0 $(cat DEVICES) + +not vgcreate $vg $(cat DEVICES) + +aux lvmconf "metadata/dirs = [ \"$TESTDIR/mda\" ]" + +vgcreate $vg $dev1 +check vg_field $vg vg_mda_count 1 +vgremove -ff $vg + +vgcreate $vg $(cat DEVICES) +check vg_field $vg vg_mda_count 1 + +vgremove -ff $vg +pvcreate --metadatacopies 1 --metadataignore y $dev1 +vgcreate $vg $(cat DEVICES) +check vg_field $vg vg_mda_count 2 + +vgremove -ff $vg +pvcreate --metadatacopies 1 --metadataignore n $dev1 +vgcreate $vg $(cat DEVICES) +check vg_field $vg vg_mda_count 2 + +vgremove -ff $vg +pvcreate --metadatacopies 0 $dev1 + +aux lvmconf "metadata/dirs = [ \"$TESTDIR/mda\", \"$TESTDIR/mda2\" ]" +vgcreate $vg $(cat DEVICES) +check vg_field $vg vg_mda_count 2 diff --git a/test/shell/metadata.sh b/test/shell/metadata.sh new file mode 100644 index 00000000..23e24ef7 --- /dev/null +++ b/test/shell/metadata.sh @@ -0,0 +1,80 @@ +# Copyright (C) 2008 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + +. lib/test + +aux prepare_devs 5 + +pvcreate $dev1 +pvcreate --metadatacopies 0 $dev2 +pvcreate --metadatacopies 0 $dev3 +pvcreate $dev4 +pvcreate --metadatacopies 0 $dev5 + +vgcreate -c n "$vg" $(cat DEVICES) +lvcreate -n $lv -l 1 -i5 -I256 $vg + +pvchange -x n $dev1 +pvchange -x y $dev1 +vgchange -a n $vg +pvchange --uuid $dev1 +pvchange --uuid $dev2 +vgremove -f $vg + +# check that PVs without metadata don't cause too many full device rescans (bz452606) +for mdacp in 1 0; do + pvcreate --metadatacopies $mdacp $(cat DEVICES) + pvcreate $dev1 + vgcreate -c n $vg $(cat DEVICES) + lvcreate -n $lv1 -l 2 -i5 -I256 $vg + lvcreate -n $lv2 -m2 -l 2 $vg + #lvchange -an $vg + lvchange -an $vg/$lv1 + lvchange -an $vg/$lv2 + vgchange -ay $vg + lvchange -vvvv -an $vg/$lv1 >out$mdacp 2>&1 + lvchange -vvvv -an $vg/$lv2 >>out$mdacp 2>&1 + vgremove -f $vg +done +not grep "Cached VG .* incorrect PV list" out0 + +# some M1 metadata tests +pvcreate -M1 $dev1 +pvcreate -M1 $dev2 +pvcreate -M1 $dev3 +pv3_uuid=$(pvs --noheadings -o pv_uuid $dev3) +vgcreate -M1 -c n $vg $dev1 $dev2 $dev3 +pvchange --uuid $dev1 + +# verify pe_start of all M1 PVs +pv_align="128.00k" +check pv_field $dev1 pe_start $pv_align +check pv_field $dev2 pe_start $pv_align +check pv_field $dev3 pe_start $pv_align + +pvs --units k -o name,pe_start,vg_mda_size,vg_name + +# upgrade from v1 to v2 metadata +vgconvert -M2 $vg + +# verify pe_start of all M2 PVs +check pv_field $dev1 pe_start $pv_align +check pv_field $dev2 pe_start $pv_align +check pv_field $dev3 pe_start $pv_align + +pvs --units k -o name,pe_start,vg_mda_size,vg_name + +# create backup and then restore $dev3 +vgcfgbackup -f $TESTDIR/bak-%s $vg +pvcreate -ff -y --restorefile $TESTDIR/bak-$vg --uuid $pv3_uuid $dev3 +vgcfgrestore -f $TESTDIR/bak-$vg $vg + +# verify pe_start of $dev3 +check pv_field $dev3 pe_start $pv_align diff --git a/test/shell/mirror-names.sh b/test/shell/mirror-names.sh new file mode 100644 index 00000000..df935a12 --- /dev/null +++ b/test/shell/mirror-names.sh @@ -0,0 +1,156 @@ +#!/bin/sh +# Copyright (C) 2007-2008 Red Hat, Inc. All rights reserved. +# Copyright (C) 2007-2008 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_description="check namings of mirrored LV" + +. lib/test + +# --------------------------------------------------------------------- +# Utilities + +lv_devices_() { + local d + local lv=$1 + shift + local devices=$* + + local devs=$(lvs -a -odevices --noheadings $lv | sed 's/([0-9]*)//g' | + sed 's/ //g' | sed 's/,/ /g') + + for d in $devs; do + (echo $devices | grep $d >/dev/null) || return 1 + devices=$(echo $devices | sed "s/$d//") + done + + [ "$(echo $devices | sed 's/ //g')" = "" ] +} + +lv_mirror_log_() { + local lv=$1 + + echo $(lvs -a -omirror_log --noheadings $lv | sed 's/ //g') +} + +lv_convert_lv_() { + local lv=$1 + + echo $(lvs -a -oconvert_lv --noheadings $lv | sed 's/ //g') +} + +# --------------------------------------------------------------------- +# Initialize PVs and VGs + +aux prepare_vg 5 80 + +# --------------------------------------------------------------------- +# 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 +} + +prepare_lvs_ +check_and_cleanup_lvs_ + +# --------------------------------------------------------------------- +# basic + +#COMM "init: lvcreate" +prepare_lvs_ + +#COMM "mirror images are ${lv1}_mimage_x" +lvcreate -l2 -m1 -n $lv1 $vg +lv_devices_ $vg/$lv1 "$lv1"_mimage_0 "$lv1"_mimage_1 + +#COMM "mirror log is ${lv1}_mlog" +lv_mirror_log_ $vg/$lv1 "$lv1"_mlog + +# "cleanup" +check_and_cleanup_lvs_ + +#COMM "mirror with name longer than 22 characters (bz221322)" +name="LVwithanamelogerthan22characters_butidontwonttocounthem" +lvcreate -m1 -l2 -n"$name" $vg +lvs $vg/"$name" +check_and_cleanup_lvs_ + +# --------------------------------------------------------------------- +# lvrename + +#COMM "init: lvrename" +prepare_lvs_ + +#COMM "renamed mirror names: $lv1 to $lv2" +lvcreate -l2 -m1 -n $lv1 $vg +lvrename $vg/$lv1 $vg/$lv2 +lv_devices_ $vg/$lv2 "$lv2"_mimage_0 "$lv2"_mimage_1 +lv_mirror_log_ $vg/$lv2 "$lv2"_mlog + +#COMM "cleanup" +check_and_cleanup_lvs_ + +# --------------------------------------------------------------------- +# lvconvert + +#COMM "init: lvconvert" +prepare_lvs_ + +#COMM "converting mirror names is ${lv1}_mimagetmp_2" +lvcreate -l2 -m1 -n $lv1 $vg +lvconvert -m+1 -i+40 -b $vg/$lv1 +convlv=$(lv_convert_lv_ "$vg/$lv1") +test "$convlv" = "$lv1"_mimagetmp_2 +lv_devices_ $vg/$lv1 "$convlv" "$lv1"_mimage_2 +lv_devices_ "$vg/$convlv" "$lv1"_mimage_0 "$lv1"_mimage_1 +loglv=$(lv_mirror_log_ "$vg/$convlv") +test "$loglv" = "$lv1"_mlog + +#COMM "mirror log name after re-adding is ${lv1}_mlog" \ +lvconvert --mirrorlog core $vg/$lv1 +lvconvert --mirrorlog disk $vg/$lv1 +convlv=$(lv_convert_lv_ "$vg/$lv1") +lv_devices_ $vg/$lv1 "$convlv" "$lv1"_mimage_2 +lv_devices_ "$vg/$convlv" "$lv1"_mimage_0 "$lv1"_mimage_1 +loglv=$(lv_mirror_log_ "$vg/$convlv") +test "$loglv" = "$lv1"_mlog + +#COMM "renamed converting mirror names: $lv1 to $lv2" \ +lvrename $vg/$lv1 $vg/$lv2 +convlv=$(lv_convert_lv_ "$vg/$lv2") +lv_devices_ $vg/$lv2 "$convlv" "$lv2"_mimage_2 +lv_devices_ "$vg/$convlv" "$lv2"_mimage_0 "$lv2"_mimage_1 +loglv=$(lv_mirror_log_ "$vg/$convlv") +test "$loglv" = "$lv2"_mlog + +#COMM "cleanup" +check_and_cleanup_lvs_ + +# Temporary mirror log should have "_mlogtmp_<n>" suffix +# but currently lvconvert doesn't have an option to add the log. +# If such feature is added in future, a test for that should +# be added. + +# --------------------------------------------------------------------- diff --git a/test/shell/mirror-vgreduce-removemissing.sh b/test/shell/mirror-vgreduce-removemissing.sh new file mode 100644 index 00000000..2475b103 --- /dev/null +++ b/test/shell/mirror-vgreduce-removemissing.sh @@ -0,0 +1,424 @@ +# 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_description="ensure that 'vgreduce --removemissing' works on mirrored LV" + +. lib/test + +lv_is_on_ () +{ + local lv=$vg/$1 + shift + local pvs=$* + + echo "Check if $lv is exactly on PVs $pvs" + rm -f out1 out2 + echo $pvs | sed 's/ /\n/g' | sort | uniq > out1 + + lvs -a -o+devices $lv + lvs -a -odevices --noheadings $lv > lvs_log + sed 's/([^)]*)//g; s/[ ,]/\n/g' lvs_log | sort | uniq > out2 || true + + diff --ignore-blank-lines out1 out2 +} + +mimages_are_on_ () +{ + local lv=$1 + shift + local pvs="$*" + local mimages + local i + + echo "Check if mirror images of $lv are on PVs $pvs" + rm -f out1 out2 + echo $pvs | sed 's/ /\n/g' | sort | uniq > out1 + lvs --noheadings -a -o lv_name $vg > lvs_log + mimages=$(grep "${lv}_mimage_" lvs_log | \ + sed 's/\[//g; s/\]//g' || true) + + for i in $mimages; do + echo "Checking $vg/$i" + lvs -a -o+devices $vg/$i + lvs -a -odevices --noheadings $vg/$i > lvs_log + sed 's/([^)]*)//g; s/ //g; s/,/ /g' lvs_log | sort | uniq >> out2 || true + done + + diff --ignore-blank-lines out1 out2 +} + +mirrorlog_is_on_() +{ + local lv="$1"_mlog + shift + lv_is_on_ $lv $* +} + +lv_is_linear_() +{ + echo "Check if $1 is linear LV (i.e. not a mirror)" + lvs -o stripes,attr --noheadings $vg/$1 | sed 's/ //g' + lvs -o stripes,attr --noheadings $vg/$1 | sed 's/ //g' | grep '^1-' >/dev/null +} + +rest_pvs_() +{ + local index=$1 + local num=$2 + local rem="" + local n + + for n in $(seq 1 $(($index - 1))) $(seq $(($index + 1)) $num); do + eval local dev=$\dev$n + rem="$rem $dev" + done + + echo "$rem" +} + +# --------------------------------------------------------------------- +# Initialize PVs and VGs + +aux prepare_vg 5 + +# --------------------------------------------------------------------- +# Common environment setup/cleanup for each sub testcases + +prepare_lvs_() +{ + lvremove -ff $vg; + if dmsetup table|grep -v -- "-missing_"|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 +} + +recover_vg_() +{ + aux enable_dev $* + pvcreate -ff $* + vgextend $vg $* + check_and_cleanup_lvs_ +} + +#COMM "check environment setup/cleanup" +prepare_lvs_ +check_and_cleanup_lvs_ + +# --------------------------------------------------------------------- +# one of mirror images has failed + +#COMM "basic: fail the 2nd mirror image of 2-way mirrored LV" +prepare_lvs_ +lvcreate -l2 -m1 -n $lv1 $vg $dev1 $dev2 $dev3:0 +lvchange -an $vg/$lv1 +mimages_are_on_ $lv1 $dev1 $dev2 +mirrorlog_is_on_ $lv1 $dev3 +aux disable_dev $dev2 +vgreduce --removemissing --force $vg +lv_is_linear_ $lv1 +lv_is_on_ $lv1 $dev1 + +# "cleanup" +recover_vg_ $dev2 + +# --------------------------------------------------------------------- +# LV has 3 images in flat, +# 1 out of 3 images fails + +#COMM test_3way_mirror_fail_1_ <PV# to fail> +test_3way_mirror_fail_1_() +{ + local index=$1 + + lvcreate -l2 -m2 -n $lv1 $vg $dev1 $dev2 $dev3 $dev4:0 + lvchange -an $vg/$lv1 + mimages_are_on_ $lv1 $dev1 $dev2 $dev3 + mirrorlog_is_on_ $lv1 $dev4 + eval aux disable_dev \$dev$index + vgreduce --removemissing --force $vg + lvs -a -o+devices $vg + mimages_are_on_ $lv1 $(rest_pvs_ $index 3) + mirrorlog_is_on_ $lv1 $dev4 +} + +for n in $(seq 1 3); do + #COMM fail mirror image $(($n - 1)) of 3-way mirrored LV" + prepare_lvs_ + test_3way_mirror_fail_1_ $n + eval recover_vg_ \$dev$n +done + +# --------------------------------------------------------------------- +# LV has 3 images in flat, +# 2 out of 3 images fail + +#COMM test_3way_mirror_fail_2_ <PV# NOT to fail> +test_3way_mirror_fail_2_() +{ + local index=$1 + + lvcreate -l2 -m2 -n $lv1 $vg $dev1 $dev2 $dev3 $dev4:0 + lvchange -an $vg/$lv1 + mimages_are_on_ $lv1 $dev1 $dev2 $dev3 + mirrorlog_is_on_ $lv1 $dev4 + rest_pvs_ $index 3 + aux disable_dev $(rest_pvs_ $index 3) + vgreduce --force --removemissing $vg + lvs -a -o+devices $vg + lv_is_linear_ $lv1 + eval lv_is_on_ $lv1 \$dev$n +} + +for n in $(seq 1 3); do + #COMM fail mirror images other than mirror image $(($n - 1)) of 3-way mirrored LV + prepare_lvs_ + test_3way_mirror_fail_2_ $n + recover_vg_ $(rest_pvs_ $n 3) +done + +# --------------------------------------------------------------------- +# LV has 4 images, 1 of them is in the temporary mirror for syncing. +# 1 out of 4 images fails + +#COMM test_3way_mirror_plus_1_fail_1_ <PV# to fail> +test_3way_mirror_plus_1_fail_1_() +{ + local index=$1 + + lvcreate -l2 -m2 -n $lv1 $vg $dev1 $dev2 $dev3 $dev5:0 + lvchange -an $vg/$lv1 + lvconvert -m+1 $vg/$lv1 $dev4 + check mirror_images_on $vg $lv1 $dev1 $dev2 $dev3 $dev4 + check mirror_log_on $vg $lv1 $dev5 + eval aux disable_dev \$dev$index + lvs -a -o +devices + vgreduce --removemissing --force $vg + lvs -a -o+devices # $vg + check mirror_images_on $vg $lv1 $dev5 # $(rest_pvs_ $index 4) + check mirror_log_on $vg $lv1 $dev5 +} + +for n in $(seq 1 4); do + #COMM "fail mirror image $(($n - 1)) of 4-way (1 converting) mirrored LV" + prepare_lvs_ + test_3way_mirror_plus_1_fail_1_ $n + eval recover_vg_ \$dev$n +done + +# --------------------------------------------------------------------- +# LV has 4 images, 1 of them is in the temporary mirror for syncing. +# 3 out of 4 images fail + +#COMM test_3way_mirror_plus_1_fail_3_ <PV# NOT to fail> +test_3way_mirror_plus_1_fail_3_() +{ + local index=$1 + + lvcreate -l2 -m2 -n $lv1 $vg $dev1 $dev2 $dev3 $dev5:0 + lvchange -an $vg/$lv1 + lvconvert -m+1 $vg/$lv1 $dev4 + check mirror_images_on $vg $lv1 $dev1 $dev2 $dev3 $dev4 + check mirror_log_on $vg $lv1 $dev5 + lvs -a -o+devices $vg + aux disable_dev $(rest_pvs_ $index 4) + vgreduce --removemissing --force $vg + lvs -a -o+devices $vg + eval local dev=\$dev$n + check linear $vg $lv1 + check lv_on $vg $lv1 $dev +} + +for n in $(seq 1 4); do + #COMM "fail mirror images other than mirror image $(($n - 1)) of 4-way (1 converting) mirrored LV" + prepare_lvs_ + test_3way_mirror_plus_1_fail_3_ $n + recover_vg_ $(rest_pvs_ $n 4) +done + +# --------------------------------------------------------------------- +# LV has 4 images, 2 of them are in the temporary mirror for syncing. +# 1 out of 4 images fail + +# test_2way_mirror_plus_2_fail_1_ <PV# to fail> +test_2way_mirror_plus_2_fail_1_() +{ + local index=$1 + + lvcreate -l2 -m1 -n $lv1 $vg $dev1 $dev2 $dev5:0 + lvchange -an $vg/$lv1 + lvconvert -m+2 $vg/$lv1 $dev3 $dev4 + mimages_are_on_ $lv1 $dev1 $dev2 $dev3 $dev4 + mirrorlog_is_on_ $lv1 $dev5 + eval aux disable_dev \$dev$n + vgreduce --removemissing --force $vg + lvs -a -o+devices $vg + mimages_are_on_ $lv1 $(rest_pvs_ $index 4) + mirrorlog_is_on_ $lv1 $dev5 +} + +for n in $(seq 1 4); do + #COMM "fail mirror image $(($n - 1)) of 4-way (2 converting) mirrored LV" + prepare_lvs_ + test_2way_mirror_plus_2_fail_1_ $n + eval recover_vg_ \$dev$n +done + +# --------------------------------------------------------------------- +# LV has 4 images, 2 of them are in the temporary mirror for syncing. +# 3 out of 4 images fail + +# test_2way_mirror_plus_2_fail_3_ <PV# NOT to fail> +test_2way_mirror_plus_2_fail_3_() +{ + local index=$1 + + lvcreate -l2 -m1 -n $lv1 $vg $dev1 $dev2 $dev5:0 + lvchange -an $vg/$lv1 + lvconvert -m+2 $vg/$lv1 $dev3 $dev4 + mimages_are_on_ $lv1 $dev1 $dev2 $dev3 $dev4 + mirrorlog_is_on_ $lv1 $dev5 + aux disable_dev $(rest_pvs_ $index 4) + vgreduce --removemissing --force $vg + lvs -a -o+devices $vg + eval local dev=\$dev$n + mimages_are_on_ $lv1 $dev || lv_is_on_ $lv1 $dev + not mirrorlog_is_on_ $lv1 $dev5 +} + +for n in $(seq 1 4); do + #COMM "fail mirror images other than mirror image $(($n - 1)) of 4-way (2 converting) mirrored LV" + prepare_lvs_ + test_2way_mirror_plus_2_fail_3_ $n + recover_vg_ $(rest_pvs_ $n 4) +done + +# --------------------------------------------------------------------- +# log device is gone (flat mirror and stacked mirror) + +#COMM "fail mirror log of 2-way mirrored LV" +prepare_lvs_ +lvcreate -l2 -m1 -n $lv1 $vg $dev1 $dev2 $dev5:0 +lvchange -an $vg/$lv1 +mimages_are_on_ $lv1 $dev1 $dev2 +mirrorlog_is_on_ $lv1 $dev5 +aux disable_dev $dev5 +vgreduce --removemissing --force $vg +mimages_are_on_ $lv1 $dev1 $dev2 +not mirrorlog_is_on_ $lv1 $dev5 +recover_vg_ $dev5 + +#COMM "fail mirror log of 3-way (1 converting) mirrored LV" +prepare_lvs_ +lvcreate -l2 -m1 -n $lv1 $vg $dev1 $dev2 $dev5:0 +lvchange -an $vg/$lv1 +lvconvert -m+1 $vg/$lv1 $dev3 +mimages_are_on_ $lv1 $dev1 $dev2 $dev3 +mirrorlog_is_on_ $lv1 $dev5 +aux disable_dev $dev5 +vgreduce --removemissing --force $vg +mimages_are_on_ $lv1 $dev1 $dev2 $dev3 +not mirrorlog_is_on_ $lv1 $dev5 +recover_vg_ $dev5 + +# --------------------------------------------------------------------- +# all images are gone (flat mirror and stacked mirror) + +#COMM "fail all mirror images of 2-way mirrored LV" +prepare_lvs_ +lvcreate -l2 -m1 -n $lv1 $vg $dev1 $dev2 $dev5:0 +lvchange -an $vg/$lv1 +mimages_are_on_ $lv1 $dev1 $dev2 +mirrorlog_is_on_ $lv1 $dev5 +aux disable_dev $dev1 $dev2 +vgreduce --removemissing --force $vg +not lvs $vg/$lv1 +recover_vg_ $dev1 $dev2 + +#COMM "fail all mirror images of 3-way (1 converting) mirrored LV" +prepare_lvs_ +lvcreate -l2 -m1 -n $lv1 $vg $dev1 $dev2 $dev5:0 +lvchange -an $vg/$lv1 +lvconvert -m+1 $vg/$lv1 $dev3 +mimages_are_on_ $lv1 $dev1 $dev2 $dev3 +mirrorlog_is_on_ $lv1 $dev5 +aux disable_dev $dev1 $dev2 $dev3 +vgreduce --removemissing --force $vg +not lvs $vg/$lv1 +recover_vg_ $dev1 $dev2 $dev3 + +# --------------------------------------------------------------------- +# Multiple LVs + +#COMM "fail a mirror image of one of mirrored LV" +prepare_lvs_ +lvcreate -l2 -m1 -n $lv1 $vg $dev1 $dev2 $dev5:0 +lvchange -an $vg/$lv1 +lvcreate -l2 -m1 -n $lv2 $vg $dev3 $dev4 $dev5:1 +lvchange -an $vg/$lv2 +mimages_are_on_ $lv1 $dev1 $dev2 +mimages_are_on_ $lv2 $dev3 $dev4 +mirrorlog_is_on_ $lv1 $dev5 +mirrorlog_is_on_ $lv2 $dev5 +aux disable_dev $dev2 +vgreduce --removemissing --force $vg +mimages_are_on_ $lv2 $dev3 $dev4 +mirrorlog_is_on_ $lv2 $dev5 +lv_is_linear_ $lv1 +lv_is_on_ $lv1 $dev1 +recover_vg_ $dev2 + +#COMM "fail mirror images, one for each mirrored LV" +prepare_lvs_ +lvcreate -l2 -m1 -n $lv1 $vg $dev1 $dev2 $dev5:0 +lvchange -an $vg/$lv1 +lvcreate -l2 -m1 -n $lv2 $vg $dev3 $dev4 $dev5:1 +lvchange -an $vg/$lv2 +mimages_are_on_ $lv1 $dev1 $dev2 +mimages_are_on_ $lv2 $dev3 $dev4 +mirrorlog_is_on_ $lv1 $dev5 +mirrorlog_is_on_ $lv2 $dev5 +aux disable_dev $dev2 +aux disable_dev $dev4 +vgreduce --removemissing --force $vg +lv_is_linear_ $lv1 +lv_is_on_ $lv1 $dev1 +lv_is_linear_ $lv2 +lv_is_on_ $lv2 $dev3 +recover_vg_ $dev2 $dev4 + +# --------------------------------------------------------------------- +# no failure + +#COMM "no failures" +prepare_lvs_ +lvcreate -l2 -m1 -n $lv1 $vg $dev1 $dev2 $dev5:0 +lvchange -an $vg/$lv1 +mimages_are_on_ $lv1 $dev1 $dev2 +mirrorlog_is_on_ $lv1 $dev5 +vgreduce --removemissing --force $vg +mimages_are_on_ $lv1 $dev1 $dev2 +mirrorlog_is_on_ $lv1 $dev5 +check_and_cleanup_lvs_ + +# --------------------------------------------------------------------- + diff --git a/test/shell/nomda-missing.sh b/test/shell/nomda-missing.sh new file mode 100644 index 00000000..f177adcd --- /dev/null +++ b/test/shell/nomda-missing.sh @@ -0,0 +1,83 @@ +#!/bin/bash + +# Copyright (C) 2010 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + +. lib/test + +aux prepare_devs 4 +pvcreate $dev1 $dev2 +pvcreate --metadatacopies 0 $dev3 $dev4 +vgcreate -c n $vg $dev1 $dev2 $dev3 $dev4 + +lvcreate -l1 -n linear1 $vg $dev1 +lvcreate -l1 -n linear2 $vg $dev2 +lvcreate -l2 -n linear12 $vg $dev1:4 $dev2:4 + +lvcreate -l1 -n origin1 $vg $dev1 +lvcreate -s $vg/origin1 -l1 -n s_napshot2 $dev2 + +lvcreate -l1 -m1 -n mirror12 --mirrorlog core $vg $dev1 $dev2 +lvcreate -l1 -m1 -n mirror123 $vg $dev1 $dev2 $dev3 + +vgchange -a n $vg +aux disable_dev $dev1 +not vgchange -a y $vg +not vgck $vg + +check inactive $vg linear1 +check active $vg linear2 +check inactive $vg origin1 +check inactive $vg s_napshot2 +check inactive $vg linear12 +check inactive $vg mirror12 +check inactive $vg mirror123 + +vgchange -a n $vg +aux enable_dev $dev1 +aux disable_dev $dev2 +not vgchange -a y $vg +not vgck $vg + +check active $vg linear1 +check inactive $vg linear2 +check inactive $vg linear12 +check inactive $vg origin1 +check inactive $vg s_napshot2 +check inactive $vg mirror12 +check inactive $vg mirror123 + +vgchange -a n $vg +aux enable_dev $dev2 +aux disable_dev $dev3 +not vgchange -a y $vg +not vgck $vg + +check active $vg origin1 +check active $vg s_napshot2 +check active $vg linear1 +check active $vg linear2 +check active $vg linear12 +check inactive $vg mirror123 +check active $vg mirror12 + +vgchange -a n $vg +aux enable_dev $dev3 +aux disable_dev $dev4 +vgchange -a y $vg +not vgck $vg + +check active $vg origin1 +check active $vg s_napshot2 +check active $vg linear1 +check active $vg linear2 +check active $vg linear12 +check active $vg mirror12 +check active $vg mirror123 diff --git a/test/shell/pool-labels.sh b/test/shell/pool-labels.sh new file mode 100644 index 00000000..dc1f3741 --- /dev/null +++ b/test/shell/pool-labels.sh @@ -0,0 +1,39 @@ +# Copyright (C) 2007 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + +. lib/test + +# create the old GFS pool labeled linear devices +create_pool_label_() +{ + # FIXME + # echo -e is bashism, dash builtin sh doesn't do \xNN in printf either + # printf comes from coreutils, and is probably not posix either + env printf "\x01\x16\x70\x06\x5f\xcf\xff\xb9\xf8\x24\x8apool1" | dd of=$2 bs=5 seek=1 conv=notrunc + env printf "\x04\x01\x03\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00\x02\x00\x00\x00\x0$1\x68\x01\x16\x70\x00\x00\x00\x00\x00\x06\x5f\xd0" | dd of=$2 bs=273 seek=1 conv=notrunc +} + +env printf "" || exit 200 # skip if printf is not available + +aux prepare_devs 2 + +create_pool_label_ 0 "$dev1" +create_pool_label_ 1 "$dev2" + +# check that pvcreate fails without -ff on the pool device +not pvcreate "$dev1" + +# check that vgdisplay and pvcreate -ff works with the pool device +vgdisplay --config 'global { locking_type = 0 }' +aux disable_dev "$dev2" +# FIXME! since pool1 cannot be opened, vgdisplay gives error... should we say +# "not" there instead, checking that it indeed does fail? +vgdisplay --config 'global { locking_type = 0 }' || true +pvcreate -ff -y "$dev1" diff --git a/test/shell/pv-duplicate.sh b/test/shell/pv-duplicate.sh new file mode 100644 index 00000000..61bafdf6 --- /dev/null +++ b/test/shell/pv-duplicate.sh @@ -0,0 +1,25 @@ +#!/bin/sh +# Copyright (C) 2011 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + +# 'Exercise duplicate metadata diagnostics' + +. lib/test + +aux prepare_devs 3 + +vgcreate -c n --metadatasize 128k $vg1 $dev1 + +# copy mda +dd if=$dev1 of=$dev2 bs=256K count=1 +dd if=$dev1 of=$dev3 bs=256K count=1 + +pvs $dev1 +vgs $vg1 diff --git a/test/shell/pv-min-size.sh b/test/shell/pv-min-size.sh new file mode 100644 index 00000000..71efcb6d --- /dev/null +++ b/test/shell/pv-min-size.sh @@ -0,0 +1,31 @@ +#!/bin/sh +# Copyright (C) 2011 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + +. lib/test + +# use small default size - 512KB +aux lvmconf 'devices/pv_min_size = 512' + +aux prepare_pvs 1 8 + +check pv_field $dev1 pv_name $dev1 + +# increase min size beyond created PV size 10MB +aux lvmconf 'devices/pv_min_size = 10240' + +# and test device is not visible +not check pv_field $dev1 pv_name $dev1 + +# set too low value errornous value +aux lvmconf 'devices/pv_min_size = -100' + +# check the incorrect value is printed +pvs $dev1 2>&1 | grep -- -100 diff --git a/test/shell/pv-range-overflow.sh b/test/shell/pv-range-overflow.sh new file mode 100644 index 00000000..008a09aa --- /dev/null +++ b/test/shell/pv-range-overflow.sh @@ -0,0 +1,32 @@ +#!/bin/sh +# Copyright (C) 2008 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + +# 'Ensure that pvmove diagnoses PE-range values 2^32 and larger.' + +. lib/test + +aux prepare_vg 2 + +lvcreate -L4 -n"$lv" $vg + +# Test for the bogus diagnostic reported in BZ 284771 +# http://bugzilla.redhat.com/284771. +# 'run pvmove with an unrecognized LV name to show bad diagnostic' +not pvmove -v -nbogus $dev1 $dev2 2> err +grep " Logical volume bogus not found." err + +# With lvm-2.02.28 and earlier, on a system with 64-bit "long int", +# the PE range parsing code would accept values up to 2^64-1, but would +# silently truncate them to int32_t. I.e., $dev1:$(echo 2^32|bc) would be +# treated just like $dev1:0. +# 'run the offending pvmove command' +not pvmove -v -n$lv $dev1:4294967296 $dev2 + diff --git a/test/shell/pvchange-usage.sh b/test/shell/pvchange-usage.sh new file mode 100644 index 00000000..5b6f5762 --- /dev/null +++ b/test/shell/pvchange-usage.sh @@ -0,0 +1,66 @@ +#!/bin/sh +# Copyright (C) 2008 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + +# 'Test pvchange option values' + +. lib/test + +aux prepare_devs 4 + +for mda in 0 1 2 +do +# "setup pv with metadatacopies = $mda" + pvcreate $dev4 + pvcreate --metadatacopies $mda $dev1 + vgcreate $vg1 $dev1 $dev4 + +# "pvchange adds/dels tag to pvs with metadatacopies = $mda " + pvchange $dev1 --addtag test$mda + check pv_field $dev1 pv_tags test$mda + pvchange $dev1 --deltag test$mda + check pv_field $dev1 pv_tags "" + +# "vgchange disable/enable allocation for pvs with metadatacopies = $mda (bz452982)" + pvchange $dev1 -x n + check pv_field $dev1 pv_attr --- + pvchange $dev1 -x y + check pv_field $dev1 pv_attr a-- + +# 'remove pv' + vgremove $vg1 + pvremove $dev1 $dev4 +done + +# "pvchange uuid" +pvcreate --metadatacopies 0 $dev1 +pvcreate --metadatacopies 2 $dev2 +vgcreate $vg1 $dev1 $dev2 +pvchange -u $dev1 +pvchange -u $dev2 +check pvlv_counts $vg1 2 0 0 +pvchange -u --all +check pvlv_counts $vg1 2 0 0 + +# "pvchange rejects uuid change under an active lv" +lvcreate -l 16 -i 2 -n $lv --alloc anywhere $vg1 +check pvlv_counts $vg1 2 1 0 +not pvchange -u $dev1 +lvchange -an "$vg1"/"$lv" +pvchange -u $dev1 + +# "cleanup" +lvremove -f "$vg1"/"$lv" +vgremove $vg1 + +# "pvchange reject --addtag to lvm1 pv" +pvcreate -M1 $dev1 +not pvchange $dev1 --addtag test + diff --git a/test/shell/pvcreate-metadata0.sh b/test/shell/pvcreate-metadata0.sh new file mode 100644 index 00000000..e35c59c5 --- /dev/null +++ b/test/shell/pvcreate-metadata0.sh @@ -0,0 +1,32 @@ +#!/bin/sh +# Copyright (C) 2008 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + +# +# Testcase for bugzilla #450651 +# also checks that vgremove properly removes all lv devices in the right order +# +# 'Test pvcreate without metadata on all pvs' + +. lib/test + +aux prepare_devs 2 128 + +#lv_snap=$lv2 +pvcreate "$dev1" +pvcreate --metadatacopies 0 "$dev2" + +# "check lv snapshot" +vgcreate -c n "$vg" "$dev1" "$dev2" +lvcreate -n "$lv" -l 60%FREE "$vg" +lvcreate -s -n $lv2 -l 10%FREE "$vg"/"$lv" +pvdisplay +lvdisplay +vgremove -f "$vg" diff --git a/test/shell/pvcreate-operation-md.sh b/test/shell/pvcreate-operation-md.sh new file mode 100644 index 00000000..dc48917e --- /dev/null +++ b/test/shell/pvcreate-operation-md.sh @@ -0,0 +1,147 @@ +# Copyright (C) 2009 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + +# skip this test if mdadm or sfdisk (or others) aren't available +which mdadm || exit 200 +which sfdisk || exit 200 +which perl || exit 200 +which awk || exit 200 +which cut || exit 200 + +test -f /proc/mdstat && grep -q raid0 /proc/mdstat || \ +modprobe raid0 || exit 200 + +. lib/test + +aux lvmconf 'devices/filter = [ "a|/dev/md.*|", "a/dev\/mapper\/.*$/", "r/.*/" ]' +aux prepare_devs 2 + +# Have MD use a non-standard name to avoid colliding with an existing MD device +# - mdadm >= 3.0 requires that non-standard device names be in /dev/md/ +# - newer mdadm _completely_ defers to udev to create the associated device node +mdadm_maj=$(mdadm --version 2>&1 | perl -pi -e 's|.* v(\d+).*|\1|') +[ $mdadm_maj -ge 3 ] && \ + mddev=/dev/md/md_lvm_test0 || \ + mddev=/dev/md_lvm_test0 + +cleanup_md() { + # sleeps offer hack to defeat: 'md: md127 still in use' + # see: https://bugzilla.redhat.com/show_bug.cgi?id=509908#c25 + aux udev_wait + mdadm --stop $mddev || true + aux udev_wait + if [ -b "$mddev" ]; then + # mdadm doesn't always cleanup the device node + sleep 2 + rm -f $mddev + fi +} + +cleanup_md_and_teardown() { + cleanup_md + aux teardown +} + +# create 2 disk MD raid0 array (stripe_width=128K) +test -b "$mddev" && exit 200 +mdadm --create --metadata=1.0 $mddev --auto=md --level 0 --raid-devices=2 --chunk 64 $dev1 $dev2 +trap 'cleanup_md_and_teardown' EXIT # cleanup this MD device at the end of the test +test -b "$mddev" || exit 200 + +# Test alignment of PV on MD without any MD-aware or topology-aware detection +# - should treat $mddev just like any other block device +pv_align="1.00m" +pvcreate --metadatasize 128k \ + --config 'devices {md_chunk_alignment=0 data_alignment_detection=0 data_alignment_offset_detection=0}' \ + $mddev +check pv_field $mddev pe_start $pv_align + +# Test md_chunk_alignment independent of topology-aware detection +pv_align="1.00m" +pvcreate --metadatasize 128k \ + --config 'devices {data_alignment_detection=0 data_alignment_offset_detection=0}' \ + $mddev +check pv_field $mddev pe_start $pv_align + + +# Test newer topology-aware alignment detection +# - first added to 2.6.31 but not "reliable" until 2.6.33 +if kernel_at_least 2 6 33 ; then + pv_align="1.00m" + # optimal_io_size=131072, minimum_io_size=65536 + pvcreate --metadatasize 128k \ + --config 'devices { md_chunk_alignment=0 }' $mddev + check pv_field $mddev pe_start $pv_align +fi + +# partition MD array directly, depends on blkext in Linux >= 2.6.28 +if kernel_at_least 2 6 28 ; then + # create one partition + sfdisk $mddev <<EOF +,,83 +EOF + # make sure partition on MD is _not_ removed + # - tests partition -> parent lookup via sysfs paths + not pvcreate --metadatasize 128k $mddev + + # verify alignment_offset is accounted for in pe_start + # - topology infrastructure is available in Linux >= 2.6.31 + # - also tests partition -> parent lookup via sysfs paths + + # Oh joy: need to lookup /sys/block/md127 rather than /sys/block/md_lvm_test0 + mddev_maj_min=$(ls -lL $mddev | awk '{ print $5 $6 }' | perl -pi -e 's|,|:|') + mddev_p_sysfs_name=$(echo /sys/dev/block/${mddev_maj_min}/*p1) + base_mddev_p=`basename $mddev_p_sysfs_name` + mddev_p=/dev/${base_mddev_p} + + # in case the system is running without devtmpfs /dev + # wait here for created device node on tmpfs + aux udev_wait $mddev_p + test -b $mddev_p || exit 200 + + # Checking for 'alignment_offset' in sysfs implies Linux >= 2.6.31 + # but reliable alignment_offset support requires kernel.org Linux >= 2.6.33 + sysfs_alignment_offset=/sys/dev/block/${mddev_maj_min}/${base_mddev_p}/alignment_offset + [ -f $sysfs_alignment_offset ] && kernel_at_least 2 6 33 && \ + alignment_offset=`cat $sysfs_alignment_offset` || \ + alignment_offset=0 + + if [ $alignment_offset -gt 0 ]; then + # default alignment is 1M, add alignment_offset + pv_align=$((1048576+$alignment_offset))B + pvcreate --metadatasize 128k $mddev_p + check pv_field $mddev_p pe_start $pv_align "--units b" + pvremove $mddev_p + fi +fi + +# Test newer topology-aware alignment detection w/ --dataalignment override +if kernel_at_least 2 6 33 ; then + cleanup_md + pvcreate -f $dev1 + pvcreate -f $dev2 + + # create 2 disk MD raid0 array (stripe_width=2M) + test -b "$mddev" && exit 200 + mdadm --create --metadata=1.0 $mddev --auto=md --level 0 --raid-devices=2 --chunk 1024 $dev1 $dev2 + test -b "$mddev" || exit 200 + + # optimal_io_size=2097152, minimum_io_size=1048576 + pv_align="2.00m" + pvcreate --metadatasize 128k \ + --config 'devices { md_chunk_alignment=0 }' $mddev + check pv_field $mddev pe_start $pv_align + + # now verify pe_start alignment override using --dataalignment + pv_align="192.00k" + pvcreate --dataalignment 64k --metadatasize 128k \ + --config 'devices { md_chunk_alignment=0 }' $mddev + check pv_field $mddev pe_start $pv_align +fi diff --git a/test/shell/pvcreate-operation.sh b/test/shell/pvcreate-operation.sh new file mode 100644 index 00000000..a1663d6b --- /dev/null +++ b/test/shell/pvcreate-operation.sh @@ -0,0 +1,121 @@ +# Copyright (C) 2008 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + +. lib/test + +aux prepare_devs 4 + +for mdatype in 1 2 +do +# pvcreate (lvm$mdatype) refuses to overwrite an mounted filesystem (bz168330) + test ! -d $TESTDIR/mnt && mkdir $TESTDIR/mnt + if mke2fs $dev1; then + mount $dev1 $TESTDIR/mnt + not pvcreate -M$mdatype $dev1 2>err + grep "Can't open $dev1 exclusively. Mounted filesystem?" err + umount $dev1 + fi + +# pvcreate (lvm$mdatype) succeeds when run repeatedly (pv not in a vg) (bz178216) + pvcreate -M$mdatype $dev1 + pvcreate -M$mdatype $dev1 + pvremove -f $dev1 + +# pvcreate (lvm$mdatype) fails when PV belongs to VG" \ + pvcreate -M$mdatype $dev1 + vgcreate -M$mdatype $vg1 $dev1 + not pvcreate -M$mdatype $dev1 + + vgremove -f $vg1 + pvremove -f $dev1 + +# pvcreate (lvm$mdatype) fails when PV1 does and PV2 does not belong to VG + pvcreate -M$mdatype $dev1 + pvcreate -M$mdatype $dev2 + vgcreate -M$mdatype $vg1 $dev1 + +# pvcreate a second time on $dev2 and $dev1 + not pvcreate -M$mdatype $dev2 $dev1 + + vgremove -f $vg1 + pvremove -f $dev2 + pvremove -f $dev1 + +# NOTE: Force pvcreate after test completion to ensure clean device +#test_expect_success \ +# "pvcreate (lvm$mdatype) fails on md component device" \ +# 'mdadm -C -l raid0 -n 2 /dev/md0 $dev1 $dev2 && +# pvcreate -M$mdatype $dev1; +# status=$?; echo status=$status; test $status != 0 && +# mdadm --stop /dev/md0 && +# pvcreate -ff -y -M$mdatype $dev1 $dev2 && +# pvremove -f $dev1 $dev2' +done + +# pvcreate (lvm2) fails without -ff when PV with metadatacopies=0 belongs to VG +pvcreate --metadatacopies 0 $dev1 +pvcreate --metadatacopies 1 $dev2 +vgcreate $vg1 $dev1 $dev2 +not pvcreate $dev1 +vgremove -f $vg1 +pvremove -f $dev2 +pvremove -f $dev1 + +# pvcreate (lvm2) succeeds with -ff when PV with metadatacopies=0 belongs to VG +pvcreate --metadatacopies 0 $dev1 +pvcreate --metadatacopies 1 $dev2 +vgcreate $vg1 $dev1 $dev2 +pvcreate -ff -y $dev1 +vgreduce --removemissing $vg1 +vgremove -ff $vg1 +pvremove -f $dev2 +pvremove -f $dev1 + +for i in 0 1 2 3 +do +# pvcreate (lvm2) succeeds writing LVM label at sector $i + pvcreate --labelsector $i $dev1 + dd if=$dev1 bs=512 skip=$i count=1 2>/dev/null | strings | grep LABELONE >/dev/null + pvremove -f $dev1 +done + +# pvcreate (lvm2) fails writing LVM label at sector 4 +not pvcreate --labelsector 4 $dev1 + +backupfile=$PREFIX.mybackupfile +uuid1=freddy-fred-fred-fred-fred-fred-freddy +uuid2=freddy-fred-fred-fred-fred-fred-fredie +bogusuuid=fred + +# pvcreate rejects uuid option with less than 32 characters +not pvcreate --norestorefile --uuid $bogusuuid $dev1 + +# pvcreate rejects uuid option without restorefile +not pvcreate --uuid $uuid1 $dev1 + +# pvcreate rejects uuid already in use +pvcreate --norestorefile --uuid $uuid1 $dev1 +not pvcreate --norestorefile --uuid $uuid1 $dev2 + +# pvcreate rejects non-existent file given with restorefile +not pvcreate --uuid $uuid1 --restorefile $backupfile $dev1 + +# pvcreate rejects restorefile with uuid not found in file +pvcreate --norestorefile --uuid $uuid1 $dev1 +vgcfgbackup -f $backupfile +not pvcreate --uuid $uuid2 --restorefile $backupfile $dev2 + +# pvcreate wipes swap signature when forced +dd if=/dev/zero of=$dev1 bs=1024 count=64 +mkswap $dev1 +blkid -c /dev/null $dev1 | grep "swap" +pvcreate -f $dev1 +# blkid cannot make up its mind whether not finding anything it knows is a failure or not +(blkid -c /dev/null $dev1 || true) | not grep "swap" diff --git a/test/shell/pvcreate-usage.sh b/test/shell/pvcreate-usage.sh new file mode 100644 index 00000000..407f3b03 --- /dev/null +++ b/test/shell/pvcreate-usage.sh @@ -0,0 +1,192 @@ +#!/bin/sh +# Copyright (C) 2008 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + +test_description='Test pvcreate option values' +PAGESIZE=$(getconf PAGESIZE) + +. lib/test + +aux prepare_devs 4 + +#COMM 'pvcreate rejects negative setphysicalvolumesize' +not pvcreate --setphysicalvolumesize -1024 $dev1 + +#COMM 'pvcreate rejects negative metadatasize' +not pvcreate --metadatasize -1024 $dev1 + +# x. metadatasize 0, defaults to 255 +# FIXME: unable to check default value, not in reporting cmds +# should default to 255 according to code +# check pv_field pv_mda_size 255 +#COMM 'pvcreate accepts metadatasize 0' +pvcreate --metadatasize 0 $dev1 +pvremove $dev1 + +#Verify vg_mda_size is smaller pv_mda_size +pvcreate --metadatasize 512k $dev1 +pvcreate --metadatasize 96k $dev2 +vgcreate $vg $dev1 $dev2 +check compare_fields vgs $vg vg_mda_size pvs $dev2 pv_mda_size +vgremove -ff $vg + +# x. metadatasize too large +# For some reason we allow this, even though there's no room for data? +##COMM 'pvcreate rejects metadatasize too large' +#not pvcreate --metadatasize 100000000000000 $dev1 + +#COMM 'pvcreate rejects metadatacopies < 0' +not pvcreate --metadatacopies -1 $dev1 + +#COMM 'pvcreate accepts metadatacopies = 0, 1, 2' +for j in metadatacopies pvmetadatacopies +do +pvcreate --$j 0 $dev1 +pvcreate --$j 1 $dev2 +pvcreate --$j 2 $dev3 +check pv_field $dev1 pv_mda_count 0 +check pv_field $dev2 pv_mda_count 1 +check pv_field $dev3 pv_mda_count 2 +pvremove $dev1 +pvremove $dev2 +pvremove $dev3 +done + +#COMM 'pvcreate rejects metadatacopies > 2' +not pvcreate --metadatacopies 3 $dev1 + +#COMM 'pvcreate rejects invalid device' +not pvcreate $dev1bogus + +#COMM 'pvcreate rejects labelsector < 0' +not pvcreate --labelsector -1 $dev1 + +#COMM 'pvcreate rejects labelsector > 1000000000000' +not pvcreate --labelsector 1000000000000 $dev1 + +# other possibilites based on code inspection (not sure how hard) +# x. device too small (min of 512 * 1024 KB) +# x. device filtered out +# x. unable to open /dev/urandom RDONLY +# x. device too large (pe_count > UINT32_MAX) +# x. device read-only +# x. unable to open device readonly +# x. BLKGETSIZE64 fails +# x. set size to value inconsistent with device / PE size + +#COMM 'pvcreate basic dataalignment sanity checks' +not pvcreate --dataalignment -1 $dev1 +not pvcreate -M 1 --dataalignment 1 $dev1 +not pvcreate --dataalignment 1e $dev1 + +#COMM 'pvcreate always rounded up to page size for start of device' +#pvcreate --metadatacopies 0 --dataalignment 1 $dev1 +# amuse shell experts +#check pv_field $dev1 pe_start $(($(getconf PAGESIZE)/1024))".00k" + +#COMM 'pvcreate sets data offset directly' +pvcreate --dataalignment 512k $dev1 +check pv_field $dev1 pe_start 512.00k + +#COMM 'vgcreate/vgremove do not modify data offset of existing PV' +vgcreate $vg $dev1 --config 'devices { data_alignment = 1024 }' +check pv_field $dev1 pe_start 512.00k +vgremove $vg --config 'devices { data_alignment = 1024 }' +check pv_field $dev1 pe_start 512.00k + +#COMM 'pvcreate sets data offset next to mda area' +pvcreate --metadatasize 100k --dataalignment 100k $dev1 +check pv_field $dev1 pe_start 200.00k + +# metadata area start is aligned according to pagesize +if [ $PAGESIZE -eq 65536 ] ; then + pv_align="192.50k" +elif [ $PAGESIZE -eq 8192 ] ; then + pv_align="136.50k" +else + pv_align="133.00k" +fi + +pvcreate --metadatasize 128k --dataalignment 3.5k $dev1 +check pv_field $dev1 pe_start $pv_align + +pvcreate --metadatasize 128k --metadatacopies 2 --dataalignment 3.5k $dev1 +check pv_field $dev1 pe_start $pv_align + +# data area is aligned to 1M by default, +# data area start is shifted by the specified alignment_offset +pv_align="1052160B" # 1048576 + (7*512) +pvcreate --metadatasize 128k --dataalignmentoffset 7s $dev1 +check pv_field $dev1 pe_start $pv_align "--units b" + +# 2nd metadata area is created without problems when +# data area start is shifted by the specified alignment_offset +pvcreate --metadatasize 128k --metadatacopies 2 --dataalignmentoffset 7s $dev1 +check pv_field $dev1 pv_mda_count 2 +# FIXME: compare start of 2nd mda with and without --dataalignmentoffset + +#COMM 'pv with LVM1 compatible data alignment can be convereted' +#compatible == LVM1_PE_ALIGN == 64k +pvcreate --dataalignment 256k $dev1 +vgcreate -s 1m $vg $dev1 +vgconvert -M1 $vg +vgconvert -M2 $vg +check pv_field $dev1 pe_start 256.00k +vgremove $vg + +#COMM 'pv with LVM1 incompatible data alignment cannot be convereted' +pvcreate --dataalignment 10k $dev1 +vgcreate -s 1m $vg $dev1 +not vgconvert -M1 $vg +vgremove $vg + +#COMM 'vgcfgrestore allows pe_start=0' +#basically it produces nonsense, but it tests vgcfgrestore, +#not that final cfg is usable... +pvcreate --metadatacopies 0 $dev1 +pvcreate $dev2 +vgcreate $vg $dev1 $dev2 +vgcfgbackup -f "$(pwd)/backup.$$" $vg +sed 's/pe_start = [0-9]*/pe_start = 0/' "$(pwd)/backup.$$" > "$(pwd)/backup.$$1" +vgcfgrestore -f "$(pwd)/backup.$$1" $vg +check pv_field $dev1 pe_start 0 +check pv_field $dev2 pe_start 0 +vgremove $vg + +echo test pvcreate --metadataignore +for pv_in_vg in 1 0; do +for mdacp in 1 2; do +for ignore in y n; do + echo pvcreate --metadataignore has proper mda_count and mda_used_count + pvcreate --metadatacopies $mdacp --metadataignore $ignore $dev1 $dev2 + check pv_field $dev1 pv_mda_count $mdacp + check pv_field $dev2 pv_mda_count $mdacp + if [ $ignore = y ]; then + check pv_field $dev1 pv_mda_used_count 0 + check pv_field $dev2 pv_mda_used_count 0 + else + check pv_field $dev1 pv_mda_used_count $mdacp + check pv_field $dev2 pv_mda_used_count $mdacp + fi + echo vgcreate has proper vg_mda_count and vg_mda_used_count + if [ $pv_in_vg = 1 ]; then + vgcreate -c n "$vg" $dev1 $dev2 + check vg_field $vg vg_mda_count $(($mdacp * 2)) + if [ $ignore = y ]; then + check vg_field $vg vg_mda_used_count 1 + else + check vg_field $vg vg_mda_used_count $(($mdacp * 2)) + fi + check vg_field $vg vg_mda_copies unmanaged + vgremove $vg + fi +done +done +done diff --git a/test/shell/pvmove-basic.sh b/test/shell/pvmove-basic.sh new file mode 100644 index 00000000..89d24e20 --- /dev/null +++ b/test/shell/pvmove-basic.sh @@ -0,0 +1,378 @@ +#!/bin/sh +# 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_description="ensure that pvmove works with basic options" + +. lib/test + +# --------------------------------------------------------------------- +# Utilities + +lvdev_() { + echo "$DM_DEV_DIR/$1/$2" +} + +lv_is_on_() { + local lv=$1 #allready vg/lv + shift 1 + lvs -a -odevices --noheadings $lv | sed 's/,/\n/g' > out +#is on all specified devs + for d in $*; do grep "$d(" out; done +#isn't on any other dev (we are set -e remember) + for d in $*; do ! grep -v "$d(" out; done + 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 +} + +# --------------------------------------------------------------------- +# Initialize PVs and VGs + +aux prepare_vg 5 40 + +# --------------------------------------------------------------------- +# Common environment setup/cleanup for each sub testcases +FIRST="" + +prepare_lvs_() { + lvcreate -l2 -n $lv1 $vg $dev1 + test -z "$FIRST" && lv_is_on_ $vg/$lv1 $dev1 + lvcreate -l9 -i3 -n $lv2 $vg $dev2 $dev3 $dev4 + test -z "$FIRST" && lv_is_on_ $vg/$lv2 $dev2 $dev3 $dev4 + lvextend -l+2 $vg/$lv1 $dev2 + test -z "$FIRST" && lv_is_on_ $vg/$lv1 $dev1 $dev2 + lvextend -l+2 $vg/$lv1 $dev3 + test -z "$FIRST" && lv_is_on_ $vg/$lv1 $dev1 $dev2 $dev3 + lvextend -l+2 $vg/$lv1 $dev1 + test -z "$FIRST" && lv_is_on_ $vg/$lv1 $dev1 $dev2 $dev3 $dev1 + lvcreate -l1 -n $lv3 $vg $dev2 + test -z "$FIRST" && lv_is_on_ $vg/$lv3 $dev2 + save_dev_sum_ $(lvdev_ $vg $lv1) + save_dev_sum_ $(lvdev_ $vg $lv2) + save_dev_sum_ $(lvdev_ $vg $lv3) + if test -z "$FIRST" ; then + lvs -a -o devices --noheadings $vg/$lv1 > ${lv1}_devs + lvs -a -o devices --noheadings $vg/$lv2 > ${lv2}_devs + lvs -a -o devices --noheadings $vg/$lv3 > ${lv3}_devs + fi + FIRST=done +} + +lv_not_changed_() { + lvs -a -o devices --noheadings $1 > out + diff $(basename $1)_devs out +} + +check_and_cleanup_lvs_() { + lvs -a -o+devices $vg + check_dev_sum_ $(lvdev_ $vg $lv1) + check_dev_sum_ $(lvdev_ $vg $lv2) + check_dev_sum_ $(lvdev_ $vg $lv3) + lvs -a -o name $vg > out && ! grep ^pvmove out + lvremove -ff $vg + if ! dmsetup table|not grep $vg; then + echo "ERROR: lvremove did leave some some mappings in DM behind!" && \ + return 1 + fi + : +} + +#COMM "check environment setup/cleanup" +prepare_lvs_ +check_and_cleanup_lvs_ + +# --------------------------------------------------------------------- +# pvmove tests + +# --- +# filter by LV + +#COMM "only specified LV is moved: from pv2 to pv5 only for lv1" +prepare_lvs_ +pvmove -i1 -n $vg/$lv1 $dev2 $dev5 +lv_is_on_ $vg/$lv1 $dev1 $dev5 $dev3 $dev1 +lv_not_changed_ $vg/$lv2 +lv_not_changed_ $vg/$lv3 +check_and_cleanup_lvs_ + +# --- +# segments in a LV + +#COMM "the 1st seg of 3-segs LV is moved: from pv1 of lv1 to pv4" +prepare_lvs_ +pvmove -i1 -n $vg/$lv1 $dev1 $dev4 +lv_is_on_ $vg/$lv1 $dev4 $dev2 $dev3 $dev4 +lv_not_changed_ $vg/$lv2 +lv_not_changed_ $vg/$lv3 +check_and_cleanup_lvs_ + +#COMM "the 2nd seg of 3-segs LV is moved: from pv2 of lv1 to pv4" +prepare_lvs_ +pvmove -i1 -n $vg/$lv1 $dev2 $dev4 +lv_is_on_ $vg/$lv1 $dev1 $dev4 $dev3 $dev1 +lv_not_changed_ $vg/$lv2 +lv_not_changed_ $vg/$lv3 +check_and_cleanup_lvs_ + +#COMM "the 3rd seg of 3-segs LV is moved: from pv3 of lv1 to pv4" +prepare_lvs_ +pvmove -i1 -n $vg/$lv1 $dev3 $dev4 +lv_is_on_ $vg/$lv1 $dev1 $dev2 $dev4 $dev1 +lv_not_changed_ $vg/$lv2 +lv_not_changed_ $vg/$lv3 +check_and_cleanup_lvs_ + +# --- +# multiple LVs matching + +#COMM "1 out of 3 LVs is moved: from pv4 to pv5" +prepare_lvs_ +pvmove -i1 $dev4 $dev5 +lv_not_changed_ $vg/$lv1 +lv_is_on_ $vg/$lv2 $dev2 $dev3 $dev5 +lv_not_changed_ $vg/$lv3 +check_and_cleanup_lvs_ + +#COMM "2 out of 3 LVs are moved: from pv3 to pv5" +prepare_lvs_ +pvmove -i1 $dev3 $dev5 +lv_is_on_ $vg/$lv1 $dev1 $dev2 $dev5 $dev1 +lv_is_on_ $vg/$lv2 $dev2 $dev5 $dev4 +lv_not_changed_ $vg/$lv3 +check_and_cleanup_lvs_ + +#COMM "3 out of 3 LVs are moved: from pv2 to pv5" +prepare_lvs_ +pvmove -i1 $dev2 $dev5 +lv_is_on_ $vg/$lv1 $dev1 $dev5 $dev3 $dev1 +lv_is_on_ $vg/$lv2 $dev5 $dev3 $dev4 +lv_is_on_ $vg/$lv3 $dev5 +check_and_cleanup_lvs_ + +# --- +# areas of striping + +#COMM "move the 1st stripe: from pv2 of lv2 to pv1" +prepare_lvs_ +pvmove -i1 -n $vg/$lv2 $dev2 $dev1 +lv_not_changed_ $vg/$lv1 +lv_is_on_ $vg/$lv2 $dev1 $dev3 $dev4 +lv_not_changed_ $vg/$lv3 +check_and_cleanup_lvs_ + +#COMM "move the 2nd stripe: from pv3 of lv2 to pv1" +prepare_lvs_ +pvmove -i1 -n $vg/$lv2 $dev3 $dev1 +lv_not_changed_ $vg/$lv1 +lv_is_on_ $vg/$lv2 $dev2 $dev1 $dev4 +lv_not_changed_ $vg/$lv3 +check_and_cleanup_lvs_ + +#COMM "move the 3rd stripe: from pv4 of lv2 to pv1" +prepare_lvs_ +pvmove -i1 -n $vg/$lv2 $dev4 $dev1 +lv_not_changed_ $vg/$lv1 +lv_is_on_ $vg/$lv2 $dev2 $dev3 $dev1 +lv_not_changed_ $vg/$lv3 +check_and_cleanup_lvs_ + +# --- +# partial segment match (source segment splitted) + +#COMM "match to the start of segment:from pv2:0-0 to pv5" +prepare_lvs_ +pvmove -i1 $dev2:0-0 $dev5 +lv_not_changed_ $vg/$lv1 +lv_is_on_ $vg/$lv2 $dev5 $dev2 $dev3 $dev4 +lv_not_changed_ $vg/$lv3 +check_and_cleanup_lvs_ + +#COMM "match to the middle of segment: from pv2:1-1 to pv5" +prepare_lvs_ +pvmove -i1 $dev2:1-1 $dev5 +lv_not_changed_ $vg/$lv1 +lv_is_on_ $vg/$lv2 $dev2 $dev5 $dev2 $dev3 $dev4 +lv_not_changed_ $vg/$lv3 +check_and_cleanup_lvs_ + +#COMM "match to the end of segment: from pv2:2-2 to pv5" +prepare_lvs_ +pvmove -i1 $dev2:2-2 $dev5 +lv_not_changed_ $vg/$lv1 +lv_is_on_ $vg/$lv2 $dev2 $dev5 $dev3 $dev4 +lv_not_changed_ $vg/$lv3 +check_and_cleanup_lvs_ + +# --- +# destination segment splitted + +#COMM "no destination split: from pv2:0-2 to pv5" +prepare_lvs_ +pvmove -i1 $dev2:0-2 $dev5 +lv_not_changed_ $vg/$lv1 +lv_is_on_ $vg/$lv2 $dev5 $dev3 $dev4 +lv_not_changed_ $vg/$lv3 +check_and_cleanup_lvs_ + +#COMM "destination split into 2: from pv2:0-2 to pv5:5-5 and pv4:5-6" +prepare_lvs_ +pvmove -i1 --alloc anywhere $dev2:0-2 $dev5:5-5 $dev4:5-6 +lv_not_changed_ $vg/$lv1 +lv_is_on_ $vg/$lv2 $dev5 $dev4 $dev3 $dev4 +lv_not_changed_ $vg/$lv3 +check_and_cleanup_lvs_ + +#COMM "destination split into 3: from pv2:0-2 to {pv3,4,5}:5-5" +prepare_lvs_ +pvmove -i1 --alloc anywhere $dev2:0-2 $dev3:5-5 $dev4:5-5 $dev5:5-5 +lv_not_changed_ $vg/$lv1 +lv_is_on_ $vg/$lv2 $dev3 $dev4 $dev5 $dev3 $dev4 +lv_not_changed_ $vg/$lv3 +check_and_cleanup_lvs_ + +# --- +# alloc policy (anywhere, contiguous) with both success and failure cases + +#COMM "alloc normal on same PV for source and destination: from pv3:0-2 to pv3:5-7" +prepare_lvs_ +not pvmove -i1 $dev3:0-2 $dev3:5-7 +# "(cleanup previous test)" +lv_not_changed_ $vg/$lv1 +lv_not_changed_ $vg/$lv2 +lv_not_changed_ $vg/$lv3 +check_and_cleanup_lvs_ + +#COMM "alloc anywhere on same PV for source and destination: from pv3:0-2 to pv3:5-7" +prepare_lvs_ +pvmove -i1 --alloc anywhere $dev3:0-2 $dev3:5-7 +lv_not_changed_ $vg/$lv1 +lv_is_on_ $vg/$lv2 $dev2 $dev3 $dev4 +lv_not_changed_ $vg/$lv3 +check_and_cleanup_lvs_ + +#COMM "alloc anywhere but better area available: from pv3:0-2 to pv3:5-7 or pv5:5-6,pv4:5-5" +prepare_lvs_ +pvmove -i1 --alloc anywhere $dev3:0-2 $dev3:5-7 $dev5:5-6 $dev4:5-5 +lv_not_changed_ $vg/$lv1 +#lv_is_on_ $vg/$lv2 $dev2 $dev5 $dev4 $dev4 +lv_not_changed_ $vg/$lv3 +check_and_cleanup_lvs_ + +#COMM "alloc contiguous but area not available: from pv2:0-2 to pv5:5-5 and pv4:5-6" +prepare_lvs_ +not pvmove -i1 --alloc contiguous $dev2:0-2 $dev5:5-5 $dev4:5-6 +# "(cleanup previous test)" +lv_not_changed_ $vg/$lv1 +lv_not_changed_ $vg/$lv2 +lv_not_changed_ $vg/$lv3 +check_and_cleanup_lvs_ + +#COMM "alloc contiguous and contiguous area available: from pv2:0-2 to pv5:0-0,pv5:3-5 and pv4:5-6" +prepare_lvs_ +pvmove -i1 --alloc contiguous $dev2:0-2 $dev5:0-0 $dev5:3-5 $dev4:5-6 +lv_not_changed_ $vg/$lv1 +lv_is_on_ $vg/$lv2 $dev5 $dev3 $dev4 +lv_not_changed_ $vg/$lv3 +check_and_cleanup_lvs_ + +# --- +# multiple segments in a LV + +#COMM "multiple source LVs: from pv3 to pv5" +prepare_lvs_ +pvmove -i1 $dev3 $dev5 +lv_is_on_ $vg/$lv1 $dev1 $dev2 $dev5 +lv_is_on_ $vg/$lv2 $dev2 $dev5 $dev4 +lv_not_changed_ $vg/$lv3 +check_and_cleanup_lvs_ + +# --- +# move inactive LV + +#COMM "move inactive LV: from pv2 to pv5" +prepare_lvs_ +lvchange -an $vg/$lv1 +lvchange -an $vg/$lv3 +pvmove -i1 $dev2 $dev5 +lv_is_on_ $vg/$lv1 $dev1 $dev5 $dev3 +lv_is_on_ $vg/$lv2 $dev5 $dev3 $dev4 +lv_is_on_ $vg/$lv3 $dev5 +check_and_cleanup_lvs_ + +# --- +# other failure cases + +#COMM "no PEs to move: from pv3 to pv1" +prepare_lvs_ +pvmove -i1 $dev3 $dev1 +not pvmove -i1 $dev3 $dev1 +# "(cleanup previous test)" +lv_is_on_ $vg/$lv1 $dev1 $dev2 $dev1 +lv_is_on_ $vg/$lv2 $dev2 $dev1 $dev4 +lv_not_changed_ $vg/$lv3 +check_and_cleanup_lvs_ + +#COMM "no space available: from pv2:0-0 to pv1:0-0" +prepare_lvs_ +not pvmove -i1 $dev2:0-0 $dev1:0-0 +# "(cleanup previous test)" +lv_not_changed_ $vg/$lv1 +lv_not_changed_ $vg/$lv2 +lv_not_changed_ $vg/$lv3 +check_and_cleanup_lvs_ + +#COMM 'same source and destination: from pv1 to pv1' +prepare_lvs_ +not pvmove -i1 $dev1 $dev1 +#"(cleanup previous test)" +lv_not_changed_ $vg/$lv1 +lv_not_changed_ $vg/$lv2 +lv_not_changed_ $vg/$lv3 +check_and_cleanup_lvs_ + +#COMM "sum of specified destination PEs is large enough, but it includes source PEs and the free PEs are not enough" +prepare_lvs_ +not pvmove --alloc anywhere $dev1:0-2 $dev1:0-2 $dev5:0-0 2> err +#"(cleanup previous test)" +grep "Insufficient free space" err +lv_not_changed_ $vg/$lv1 +lv_not_changed_ $vg/$lv2 +lv_not_changed_ $vg/$lv3 +check_and_cleanup_lvs_ + +# --------------------------------------------------------------------- + +#COMM "pvmove abort" +prepare_lvs_ +pvmove -i100 -b $dev1 $dev3 +pvmove --abort +check_and_cleanup_lvs_ + +#COMM "pvmove out of --metadatacopies 0 PV (bz252150)" +vgremove -ff $vg +pvcreate $(cat DEVICES) +pvcreate --metadatacopies 0 $dev1 $dev2 +vgcreate -c n $vg $(cat DEVICES) +lvcreate -l4 -n $lv1 $vg $dev1 +pvmove $dev1 + +#COMM "pvmove fails activating mirror, properly restores state before pvmove" +dmsetup create "$vg-pvmove0" --notable +not pvmove -i 1 $dev2 +test $(dmsetup info --noheadings -c -o suspended "$vg-$lv1") = "Active" +dmsetup remove "$vg-pvmove0" diff --git a/test/shell/pvremove-usage.sh b/test/shell/pvremove-usage.sh new file mode 100644 index 00000000..5f4ceeb7 --- /dev/null +++ b/test/shell/pvremove-usage.sh @@ -0,0 +1,68 @@ +#!/bin/sh +# Copyright (C) 2008 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + +. lib/test + +aux prepare_devs 3 +pvcreate $dev1 +pvcreate --metadatacopies 0 $dev2 +pvcreate --metadatacopies 2 $dev3 +pvremove $dev2 + +# failing, but still removing everything what can be removed +# is somewhat odd as default, what do we have -f for? +pvs | not grep $dev2 +pvcreate --metadatacopies 0 $dev2 + +# check pvremove refuses to remove pv in a vg +vgcreate -c n $vg $dev1 $dev2 +not pvremove $dev2 $dev3 + +for mdacp in 0 1 2; do + # check pvremove truly wipes the label (pvscan wont find) (---metadatacopies $mdacp) + pvcreate --metadatacopies $mdacp $dev3 + pvremove $dev3 + # try to remove agail - should fail cleanly + not pvremove $dev3 + pvscan | not grep $dev3 + + # bz179473 refuse to wipe non-PV device without -f + not pvremove $dev3 + pvremove -f $dev3 + + # reset setup + vgremove -ff $vg + pvcreate --metadatacopies $mdacp $dev1 + pvcreate $dev2 + vgcreate $vg $dev1 $dev2 + + # pvremove -f fails when pv in a vg (---metadatacopies $mdacp) + not pvremove -f $dev1 + pvs $dev1 + + # pvremove -ff fails without confirmation when pv in a vg (---metadatacopies $mdacp) + echo n | not pvremove -ff $dev1 + + # pvremove -ff succeds with confirmation when pv in a vg (---metadatacopies $mdacp) + pvremove -ffy $dev1 + not pvs $dev1 + + vgreduce --removemissing $vg + pvcreate --metadatacopies $mdacp $dev1 + vgextend $vg $dev1 + + # pvremove -ff -y is sufficient when pv in a vg (---metadatacopies $mdacp)" ' + pvremove -ff -y $dev1 + + vgreduce --removemissing $vg + pvcreate --metadatacopies $mdacp $dev1 + vgextend $vg $dev1 +done diff --git a/test/shell/read-ahead.sh b/test/shell/read-ahead.sh new file mode 100644 index 00000000..88f724e9 --- /dev/null +++ b/test/shell/read-ahead.sh @@ -0,0 +1,62 @@ +#!/bin/sh +# Copyright (C) 2008 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + +# +# tests basic functionality of read-ahead and ra regressions +# + +test_description='Test read-ahead functionality' + +. lib/test + + +get_lvs_() { + lvs --units s --nosuffix --noheadings -o $1 "$vg"/"$lv" +} + +check_lvs_() { + case $(get_lvs_ $1) in + *$2) true ;; + *) false ;; + esac +} + +aux prepare_vg 5 + +#COMM "test various read ahead settings (bz450922)" +lvcreate -n "$lv" -l 100%FREE -i5 -I256 "$vg" +ra="$(get_lvs_ lv_kernel_read_ahead)" +test "$(( ( $ra / 5 ) * 5 ))" -eq $ra +lvdisplay "$vg"/"$lv" +not lvchange -r auto "$vg"/"$lv" 2>&1 | grep auto +check_lvs_ lv_read_ahead auto +check_lvs_ lv_kernel_read_ahead 5120 +lvchange -r 640 "$vg/$lv" +check_lvs_ lv_read_ahead 640 +lvremove -ff "$vg" + +#COMM "read ahead is properly inherited from underlying PV" +blockdev --setra 768 $dev1 +vgscan +lvcreate -n $lv -L4m $vg $dev1 +test $(blockdev --getra $DM_DEV_DIR/$vg/$lv) -eq 768 +lvremove -ff $vg + +# Check default, active/inactive values for read_ahead / kernel_read_ahead +lvcreate -n $lv -l 50%FREE $vg +lvchange -an $vg/$lv +check lv_field $vg/$lv lv_read_ahead auto +check lv_field $vg/$lv lv_kernel_read_ahead -1 +lvchange -r 512 $vg/$lv +lvchange -ay $vg/$lv +check lv_field $vg/$lv lv_read_ahead 256.00k +check lv_field $vg/$lv lv_kernel_read_ahead 256.00k +lvremove -ff $vg diff --git a/test/shell/snapshot-autoumount-dmeventd.sh b/test/shell/snapshot-autoumount-dmeventd.sh new file mode 100644 index 00000000..2f5ff7f7 --- /dev/null +++ b/test/shell/snapshot-autoumount-dmeventd.sh @@ -0,0 +1,39 @@ +#!/bin/bash +# Copyright (C) 2010 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + +# no automatic extensions please + +. lib/test + +which mkfs.ext2 || exit 200 + +aux lvmconf "activation/snapshot_autoextend_percent = 0" \ + "activation/snapshot_autoextend_threshold = 100" + +aux prepare_vg 2 +aux prepare_dmeventd + +lvcreate -l 8 -n base $vg +mkfs.ext2 $DM_DEV_DIR/$vg/base + +lvcreate -s -l 4 -n snap $vg/base +lvchange --monitor y $vg/snap + +mkdir mnt +mount $DM_DEV_DIR/mapper/$vg-snap mnt +mount +cat /proc/mounts | grep $vg-snap + +dd if=/dev/zero of=mnt/file$1 bs=1M count=17 +sync +sleep 10 # dmeventd only checks every 10 seconds :( + +cat /proc/mounts | not grep $vg-snap diff --git a/test/shell/snapshot-merge.sh b/test/shell/snapshot-merge.sh new file mode 100644 index 00000000..22babf81 --- /dev/null +++ b/test/shell/snapshot-merge.sh @@ -0,0 +1,133 @@ +#!/bin/sh +# Copyright (C) 2010 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +set -xv + +which mkfs.ext3 || exit 200 + +. lib/test + +lvdev_() +{ + echo "$DM_DEV_DIR/$1/$2" +} + +snap_lv_name_() { + echo ${1}_snap +} + +setup_merge() { + local VG_NAME=$1 + local LV_NAME=$2 + local NUM_EXTRA_SNAPS="$3" + test -z "$NUM_EXTRA_SNAPS" && NUM_EXTRA_SNAPS=0 + local BASE_SNAP_LV_NAME=$(snap_lv_name_ $LV_NAME) + + lvcreate -n $LV_NAME -l 50%FREE $VG_NAME + lvcreate -s -n $BASE_SNAP_LV_NAME -l 20%FREE ${VG_NAME}/${LV_NAME} + mkfs.ext3 $(lvdev_ $VG_NAME $LV_NAME) + + if [ $NUM_EXTRA_SNAPS -gt 0 ]; then + for i in `seq 1 $NUM_EXTRA_SNAPS`; do + lvcreate -s -n ${BASE_SNAP_LV_NAME}_${i} -l 20%FREE ${VG_NAME}/${LV_NAME} + done + fi +} + +aux prepare_vg 1 100 + + +# test full merge of a single LV +setup_merge $vg $lv1 +# now that snapshot LV is created: test if snapshot-merge target is available +$(dmsetup targets | grep snapshot-merge >/dev/null) || exit 200 +lvs -a +# make sure lvconvert --merge requires explicit LV listing +not lvconvert --merge 2>err +lvconvert --merge $vg/$(snap_lv_name_ $lv1) +lvremove -f $vg/$lv1 + + +# test that an actively merging snapshot may not be removed +setup_merge $vg $lv1 +lvconvert -i+100 --merge --background $vg/$(snap_lv_name_ $lv1) +not lvremove -f $vg/$(snap_lv_name_ $lv1) +lvremove -f $vg/$lv1 + + +# "onactivate merge" test +setup_merge $vg $lv1 +lvs -a +mkdir test_mnt +mount $(lvdev_ $vg $lv1) test_mnt +lvconvert --merge $vg/$(snap_lv_name_ $lv1) +# -- refresh LV while FS is still mounted (merge must not start), +# verify 'snapshot-origin' target is still being used +lvchange --refresh $vg/$lv1 +umount test_mnt +rm -r test_mnt +dmsetup table ${vg}-${lv1} | grep " snapshot-origin " + +# -- refresh LV to start merge (now that FS is unmounted), +# an active merge uses the 'snapshot-merge' target +lvchange --refresh $vg/$lv1 +dmsetup table ${vg}-${lv1} | grep " snapshot-merge " +# -- don't care if merge is still active; lvremove at this point +# may test stopping an active merge +lvremove -f $vg/$lv1 + + +# "onactivate merge" test +# -- deactivate/remove after disallowed merge attempt, tests +# to make sure preload of origin's metadata is _not_ performed +setup_merge $vg $lv1 +lvs -a +mkdir test_mnt +mount $(lvdev_ $vg $lv1) test_mnt +lvconvert --merge $vg/$(snap_lv_name_ $lv1) +# -- refresh LV while FS is still mounted (merge must not start), +# verify 'snapshot-origin' target is still being used +lvchange --refresh $vg/$lv1 +umount test_mnt +rm -r test_mnt +dmsetup table ${vg}-${lv1} | grep " snapshot-origin " >/dev/null +lvremove -f $vg/$lv1 + + +# test multiple snapshot merge; tests copy out that is driven by merge +setup_merge $vg $lv1 1 +lvs -a +lvconvert --merge $vg/$(snap_lv_name_ $lv1) +lvremove -f $vg/$lv1 + + +# test merging multiple snapshots that share the same tag +setup_merge $vg $lv1 +setup_merge $vg $lv2 +lvs -a +lvchange --addtag this_is_a_test $vg/$(snap_lv_name_ $lv1) +lvchange --addtag this_is_a_test $vg/$(snap_lv_name_ $lv2) +lvconvert --merge @this_is_a_test +lvs | not grep $(snap_lv_name_ $lv1) +lvs | not grep $(snap_lv_name_ $lv2) +lvremove -f $vg/$lv1 +lvremove -f $vg/$lv2 + +# FIXME following tests would need to poll merge progress, via periodic lvs? +# Background processes don't lend themselves to lvm testsuite... + +# test: onactivate merge of a single lv + +# test: do onactivate, deactivate the origin LV, reactivate the LV, merge should resume + +# test: multiple onactivate merge + + +vgremove -f "$vg" diff --git a/test/shell/snapshots-of-mirrors.sh b/test/shell/snapshots-of-mirrors.sh new file mode 100644 index 00000000..297d5811 --- /dev/null +++ b/test/shell/snapshots-of-mirrors.sh @@ -0,0 +1,44 @@ +# Copyright (C) 2010 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + +. lib/test + +aux prepare_vg 4 + +# Create snapshot of a mirror origin +lvcreate -m 1 -L 10M -n lv $vg +lvcreate -s $vg/lv -L 10M -n snap + +# Down-convert (mirror -> linear) under a snapshot +lvconvert -m0 $vg/lv + +# Up-convert (linear -> mirror) +lvconvert -m2 $vg/lv + +# Down-convert (mirror -> mirror) +lvconvert -m1 $vg/lv + +# Up-convert (mirror -> mirror) -- Not supported! +not lvconvert -m2 $vg/lv + +# Log conversion (disk -> core) +lvconvert --mirrorlog core $vg/lv + +# Log conversion (core -> mirrored) +lvconvert --mirrorlog mirrored $vg/lv + +# Log conversion (mirrored -> core) +lvconvert --mirrorlog core $vg/lv + +# Log conversion (core -> disk) +lvconvert --mirrorlog disk $vg/lv + +# Clean-up +lvremove -ff $vg diff --git a/test/shell/tags.sh b/test/shell/tags.sh new file mode 100644 index 00000000..14e3aaa3 --- /dev/null +++ b/test/shell/tags.sh @@ -0,0 +1,74 @@ +# Copyright (C) 2008 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + +. lib/test + +aux prepare_pvs 5 + +# vgcreate with --addtag +vgcreate -c n --addtag firstvg $vg1 $dev1 $dev2 +vgcreate -c n --addtag secondvg $vg2 $dev3 $dev4 +check vg_field $vg1 tags firstvg +check vg_field $vg2 tags secondvg +vgremove -ff $vg1 +vgremove -ff $vg2 + +# vgchange with --addtag and --deltag +vgcreate -c n $vg1 $dev1 $dev2 +vgcreate -c n $vg2 $dev3 $dev4 +vgchange --addtag firstvgtag1 $vg1 +# adding a tag multiple times is not an error +vgchange --addtag firstvgtag2 $vg1 +vgchange --addtag firstvgtag2 $vg1 +vgchange --addtag firstvgtag3 $vg1 +vgchange --addtag secondvgtag1 $vg2 +vgchange --addtag secondvgtag2 $vg2 +vgchange --addtag secondvgtag3 $vg2 +check vg_field @firstvgtag2 tags "firstvgtag1,firstvgtag2,firstvgtag3" +check vg_field @secondvgtag1 tags "secondvgtag1,secondvgtag2,secondvgtag3" +vgchange --deltag firstvgtag2 $vg1 +check vg_field @firstvgtag1 tags "firstvgtag1,firstvgtag3" +# deleting a tag multiple times is not an error +vgchange --deltag firstvgtag2 $vg1 +vgchange --deltag firstvgtag1 $vg2 +vgremove -ff $vg1 +vgremove -ff $vg2 + +# lvcreate with --addtag +vgcreate -c n $vg1 $dev1 $dev2 +lvcreate --addtag firstlvtag1 -l 4 -n $lv1 $vg1 +lvcreate --addtag secondlvtag1 -l 4 -n $lv2 $vg1 +check lv_field @firstlvtag1 tags "firstlvtag1" +not check lv_field @secondlvtag1 tags "firstlvtag1" +check lv_field $vg1/$lv2 tags "secondlvtag1" +not check lv_field $vg1/$lv1 tags "secondlvtag1" +vgremove -ff $vg1 + +# lvchange with --addtag and --deltag +vgcreate -c n $vg1 $dev1 $dev2 +lvcreate -l 4 -n $lv1 $vg1 +lvcreate -l 4 -n $lv2 $vg1 +lvchange --addtag firstlvtag1 $vg1/$lv1 +# adding a tag multiple times is not an error +lvchange --addtag firstlvtag2 $vg1/$lv1 +lvchange --addtag firstlvtag2 $vg1/$lv1 +lvchange --addtag firstlvtag3 $vg1/$lv1 +lvchange --addtag secondlvtag1 $vg1/$lv2 +lvchange --addtag secondlvtag2 $vg1/$lv2 +lvchange --addtag secondlvtag3 $vg1/$lv2 +check lv_field $vg1/$lv1 tags "firstlvtag1,firstlvtag2,firstlvtag3" +not $(check lv_field $vg1/$lv1 tags "secondlvtag1") +check lv_field $vg1/$lv2 tags "secondlvtag1,secondlvtag2,secondlvtag3" +not $(check lv_field $vg1/$lv1 tags "secondlvtag1") +# deleting a tag multiple times is not an error +lvchange --deltag firstlvtag2 $vg1/$lv1 +lvchange --deltag firstlvtag2 $vg1/$lv1 +check lv_field $vg1/$lv1 tags "firstlvtag1,firstlvtag3" +check lv_field $vg1/$lv2 tags "secondlvtag1,secondlvtag2,secondlvtag3" diff --git a/test/shell/test-partition.sh b/test/shell/test-partition.sh new file mode 100644 index 00000000..f5ccb8d8 --- /dev/null +++ b/test/shell/test-partition.sh @@ -0,0 +1,30 @@ +#!/bin/sh +# Copyright (C) 2010 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + +# +# Testcase for bugzilla #621173 +# excercises partition table scanning code path +# + +which sfdisk || exit 200 + +LVM_TEST_CONFIG_DEVICES="types = [\"device-mapper\", 142]" + +. lib/test + +aux prepare_pvs 1 30 + +pvs + +# create small partition table +echo "1 2" | sfdisk $dev1 + +pvs diff --git a/test/shell/topology-support.sh b/test/shell/topology-support.sh new file mode 100644 index 00000000..0fb55b67 --- /dev/null +++ b/test/shell/topology-support.sh @@ -0,0 +1,106 @@ +# Copyright (C) 2010 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + +which mkfs.ext3 || exit 200 + +. lib/test + +check_logical_block_size() +{ + local DEV_=$(cat SCSI_DEBUG_DEV) + # Verify logical_block_size - requires Linux >= 2.6.31 + SYSFS_LOGICAL_BLOCK_SIZE=`echo /sys/block/$(basename $DEV_)/queue/logical_block_size` + if [ -f "$SYSFS_LOGICAL_BLOCK_SIZE" ] ; then + ACTUAL_LOGICAL_BLOCK_SIZE=`cat $SYSFS_LOGICAL_BLOCK_SIZE` + test $ACTUAL_LOGICAL_BLOCK_SIZE = $1 + fi +} + +lvdev_() +{ + echo "$DM_DEV_DIR/$1/$2" +} + +test_snapshot_mount() +{ + lvcreate -L 16M -n $lv1 $vg $dev1 + mkfs.ext3 $(lvdev_ $vg $lv1) + mkdir test_mnt + mount $(lvdev_ $vg $lv1) test_mnt + lvcreate -L 16M -n $lv2 -s $vg/$lv1 + umount test_mnt + # mount the origin + mount $(lvdev_ $vg $lv1) test_mnt + umount test_mnt + # mount the snapshot + mount $(lvdev_ $vg $lv2) test_mnt + umount test_mnt + rm -r test_mnt + vgchange -an $vg + lvremove -f $vg/$lv2 + lvremove -f $vg/$lv1 +} + +# FIXME add more topology-specific tests and validation (striped LVs, etc) + +NUM_DEVS=1 +PER_DEV_SIZE=34 +DEV_SIZE=$(($NUM_DEVS*$PER_DEV_SIZE)) + +# Test that kernel supports topology +aux prepare_scsi_debug_dev $DEV_SIZE +if [ ! -e /sys/block/$(basename $(cat SCSI_DEBUG_DEV))/alignment_offset ] ; then + aux cleanup_scsi_debug_dev + exit 200 +fi +aux cleanup_scsi_debug_dev + +# --------------------------------------------- +# Create "desktop-class" 4K drive +# (logical_block_size=512, physical_block_size=4096, alignment_offset=0): +LOGICAL_BLOCK_SIZE=512 +aux prepare_scsi_debug_dev $DEV_SIZE \ + sector_size=$LOGICAL_BLOCK_SIZE physblk_exp=3 +check_logical_block_size $LOGICAL_BLOCK_SIZE + +aux prepare_pvs $NUM_DEVS $PER_DEV_SIZE +vgcreate -c n $vg $(cat DEVICES) +test_snapshot_mount +vgremove $vg + +aux cleanup_scsi_debug_dev + +# --------------------------------------------- +# Create "desktop-class" 4K drive w/ 63-sector DOS partition compensation +# (logical_block_size=512, physical_block_size=4096, alignment_offset=3584): +LOGICAL_BLOCK_SIZE=512 +aux prepare_scsi_debug_dev $DEV_SIZE \ + sector_size=$LOGICAL_BLOCK_SIZE physblk_exp=3 lowest_aligned=7 +check_logical_block_size $LOGICAL_BLOCK_SIZE + +aux prepare_pvs $NUM_DEVS $PER_DEV_SIZE +vgcreate -c n $vg $(cat DEVICES) +test_snapshot_mount +vgremove $vg + +aux cleanup_scsi_debug_dev + +# --------------------------------------------- +# Create "enterprise-class" 4K drive +# (logical_block_size=4096, physical_block_size=4096, alignment_offset=0): +LOGICAL_BLOCK_SIZE=4096 +aux prepare_scsi_debug_dev $DEV_SIZE \ + sector_size=$LOGICAL_BLOCK_SIZE +check_logical_block_size $LOGICAL_BLOCK_SIZE + +aux prepare_pvs $NUM_DEVS $PER_DEV_SIZE +vgcreate -c n $vg $(cat DEVICES) +test_snapshot_mount +vgremove $vg diff --git a/test/shell/unknown-segment.sh b/test/shell/unknown-segment.sh new file mode 100644 index 00000000..d6071a1c --- /dev/null +++ b/test/shell/unknown-segment.sh @@ -0,0 +1,34 @@ +#!/bin/sh +# Copyright (C) 2009 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + +. lib/test + +aux prepare_vg 4 + +lvcreate -l 1 -n $lv1 $vg +lvcreate -l 2 -m 1 -n $lv2 $vg + +vgcfgbackup -f bak0 $vg +sed -e 's,striped,unstriped,;s,mirror,unmirror,' -i.orig bak0 +vgcfgrestore -f bak0 $vg + +# we have on-disk metadata with unknown segments now +not lvchange -a y $vg/$lv1 # check that activation is refused + +vgcfgbackup -f bak1 $vg +cat bak1 +sed -e 's,unstriped,striped,;s,unmirror,mirror,' -i.orig bak1 +vgcfgrestore -f bak1 $vg +vgcfgbackup -f bak2 $vg + +egrep -v 'description|seqno|creation_time|Generated' < bak0.orig > a +egrep -v 'description|seqno|creation_time|Generated' < bak2 > b +diff -u a b diff --git a/test/shell/unlost-pv.sh b/test/shell/unlost-pv.sh new file mode 100644 index 00000000..7d2af2ee --- /dev/null +++ b/test/shell/unlost-pv.sh @@ -0,0 +1,38 @@ +#!/bin/sh +# Copyright (C) 2008 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + +. lib/test + +aux prepare_vg 3 + +lvcreate -m 1 -l 1 -n mirror $vg +lvchange -a n $vg/mirror + +check() { +vgscan 2>&1 | tee vgscan.out +grep "Inconsistent metadata found for VG $vg" vgscan.out +vgscan 2>&1 | tee vgscan.out +not grep "Inconsistent metadata found for VG $vg" vgscan.out +} + +# try orphaning a missing PV (bz45867) +aux disable_dev $dev1 +vgreduce --removemissing --force $vg +aux enable_dev $dev1 +check + +# try to just change metadata; we expect the new version (with MISSING_PV set +# on the reappeared volume) to be written out to the previously missing PV +vgextend $vg $dev1 +aux disable_dev $dev1 +lvremove $vg/mirror +aux enable_dev $dev1 +check diff --git a/test/shell/vgcfgbackup-usage.sh b/test/shell/vgcfgbackup-usage.sh new file mode 100644 index 00000000..2d4d5841 --- /dev/null +++ b/test/shell/vgcfgbackup-usage.sh @@ -0,0 +1,54 @@ +#!/bin/sh +# Copyright (C) 2008 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + +. lib/test + +aux prepare_pvs 4 + +# vgcfgbackup handles similar VG names (bz458941) +vg1=${PREFIX}vg00 +vg2=${PREFIX}vg01 +vgcreate $vg1 $dev1 +vgcreate $vg2 $dev2 +vgcfgbackup -f $TESTDIR/bak-%s >out +grep "Volume group \"$vg1\" successfully backed up." out +grep "Volume group \"$vg2\" successfully backed up." out +vgremove -ff $vg1 +vgremove -ff $vg2 + +# vgcfgbackup correctly stores metadata with missing PVs +# and vgcfgrestore able to restore them when device reappears +pv1_uuid=$(pvs --noheadings -o pv_uuid $dev1) +pv2_uuid=$(pvs --noheadings -o pv_uuid $dev2) +vgcreate $vg $(cat DEVICES) +lvcreate -l1 -n $lv1 $vg $dev1 +lvcreate -l1 -n $lv2 $vg $dev2 +lvcreate -l1 -n $lv3 $vg $dev3 +vgchange -a n $vg +pvcreate -ff -y $dev1 +pvcreate -ff -y $dev2 +vgcfgbackup -f "$(pwd)/backup.$$" $vg +sed 's/flags = \[\"MISSING\"\]/flags = \[\]/' "$(pwd)/backup.$$" > "$(pwd)/backup.$$1" +pvcreate -ff -y --norestorefile -u $pv1_uuid $dev1 +pvcreate -ff -y --norestorefile -u $pv2_uuid $dev2 +vgcfgrestore -f "$(pwd)/backup.$$1" $vg +vgremove -ff $vg + +# vgcfgbackup correctly stores metadata LVM1 with missing PVs +# FIXME: clvmd seems to have problem with metadata format change here +# fix it and remove this vgscan +vgscan +pvcreate -M1 $(cat DEVICES) +vgcreate -M1 -c n $vg $(cat DEVICES) +lvcreate -l1 -n $lv1 $vg $dev1 +pvremove -ff -y $dev2 +not lvcreate -l1 -n $lv1 $vg $dev3 +vgcfgbackup -f "$(pwd)/backup.$$" $vg diff --git a/test/shell/vgchange-maxlv.sh b/test/shell/vgchange-maxlv.sh new file mode 100644 index 00000000..53291f6f --- /dev/null +++ b/test/shell/vgchange-maxlv.sh @@ -0,0 +1,31 @@ +#!/bin/bash +# Copyright (C) 2010 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + +. lib/test + +aux prepare_dmeventd +aux prepare_pvs 3 + +vgcreate -c n -l 2 $vg $dev1 $dev2 $dev3 +lvcreate -n one -l 1 $vg +lvcreate -n two -l 1 $vg +not lvcreate -n three -l 1 $vg +vgchange -an $vg +vgremove -ff $vg + +vgcreate -c n -l 3 $vg $dev1 $dev2 $dev3 +lvcreate -n one -l 1 $vg +lvcreate -n snap -s -l 1 $vg/one +lvcreate -n two -l 1 $vg +not lvcreate -n three -l 1 $vg +vgchange --monitor y $vg +vgchange -an $vg 2>&1 | tee vgchange.out +not grep "event server" vgchange.out diff --git a/test/shell/vgchange-sysinit.sh b/test/shell/vgchange-sysinit.sh new file mode 100644 index 00000000..a9f24780 --- /dev/null +++ b/test/shell/vgchange-sysinit.sh @@ -0,0 +1,51 @@ +#!/bin/bash +# Copyright (C) 2011 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + +. lib/test + +which mkfs.ext3 || exit 200 + +aux prepare_pvs 2 8 +test -e LOCAL_CLVMD && exit 200 + +var_lock="$DM_DEV_DIR/$vg1/$lv1" +# keep in sync with aux configured lockingdir +mount_dir="$TESTDIR/var/lock/lvm" + +cleanup_mounted_and_teardown() +{ + umount $mount_dir || true + aux teardown +} + +vgcreate -c n $vg1 $dev1 +vgcreate -c n $vg2 $dev2 + +lvcreate -l 1 -n $lv2 $vg2 +vgchange -an $vg2 + +lvcreate -n $lv1 -l 100%FREE $vg1 +mkfs.ext3 -b4096 -j $var_lock + +trap 'cleanup_mounted_and_teardown' EXIT +mount -n -r $var_lock $mount_dir + +# locking must fail on read-only filesystem +not vgchange -ay $vg2 + +# no-locking with --sysinit +vgchange --sysinit -ay $vg2 +test -b "$DM_DEV_DIR/$vg2/$lv2" + +vgchange --sysinit -an $vg2 +test ! -b "$DM_DEV_DIR/$vg2/$lv2" + +vgchange --ignorelockingfailure -ay $vg2 diff --git a/test/shell/vgchange-usage.sh b/test/shell/vgchange-usage.sh new file mode 100644 index 00000000..e83848ee --- /dev/null +++ b/test/shell/vgchange-usage.sh @@ -0,0 +1,44 @@ +#!/bin/sh +# Copyright (C) 2008 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + +test_description='Exercise some vgchange diagnostics' + +. lib/test + +aux prepare_pvs 3 +pvcreate --metadatacopies 0 $dev1 +vgcreate $vg $(cat DEVICES) + +vgdisplay $vg + +# vgchange -p MaxPhysicalVolumes (bz202232) +aux check vg_field $vg max_pv 0 +vgchange -p 128 $vg +aux check vg_field $vg max_pv 128 + +pv_count=$(get vg_field $vg pv_count) +not vgchange -p 2 $vg 2>err +grep "MaxPhysicalVolumes is less than the current number $pv_count of PVs for" err +aux check vg_field $vg max_pv 128 + +# vgchange -l MaxLogicalVolumes +aux check vg_field $vg max_lv 0 +vgchange -l 128 $vg +aux check vg_field $vg max_lv 128 + +lvcreate -l4 -n$lv1 $vg +lvcreate -l4 -n$lv2 $vg + +lv_count=$(get vg_field $vg lv_count) +not vgchange -l 1 $vg 2>err +grep "MaxLogicalVolume is less than the current number $lv_count of LVs for" err +aux check vg_field $vg max_lv 128 + diff --git a/test/shell/vgcreate-usage.sh b/test/shell/vgcreate-usage.sh new file mode 100644 index 00000000..916262e5 --- /dev/null +++ b/test/shell/vgcreate-usage.sh @@ -0,0 +1,163 @@ +#!/bin/sh +# Copyright (C) 2008 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + +test_description='Exercise some vgcreate diagnostics' + +. lib/test + +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 +vgremove $vg +# try vgck and to remove it again - should fail (but not segfault) +not vgremove $vg +not vgck $vg + +#COMM 'vgcreate accepts smaller (128) maxlogicalvolumes for VG' +vgcreate -c n $vg --maxlogicalvolumes 128 $dev1 $dev2 +check vg_field $vg max_lv 128 +vgremove $vg + +#COMM 'vgcreate accepts smaller (128) maxphysicalvolumes for VG' +vgcreate -c n $vg --maxphysicalvolumes 128 $dev1 $dev2 +check vg_field $vg max_pv 128 +vgremove $vg + +#COMM 'vgcreate rejects a zero physical extent size' +not vgcreate -c n --physicalextentsize 0 $vg $dev1 $dev2 2>err +grep "^ Physical extent size may not be zero\$" err + +#COMM 'vgcreate rejects "inherit" allocation policy' +not vgcreate -c n --alloc inherit $vg $dev1 $dev2 2>err +grep "^ Volume Group allocation policy cannot inherit from anything\$" err + +#COMM 'vgcreate rejects vgname "."' +vginvalid=.; +not vgcreate -c n $vginvalid $dev1 $dev2 2>err +grep "New volume group name \"$vginvalid\" is invalid\$" err + +#COMM 'vgcreate rejects vgname greater than 128 characters' +vginvalid=thisnameisridiculouslylongtotestvalidationcodecheckingmaximumsizethisiswhathappenswhenprogrammersgetboredandorarenotcreativedonttrythisathome +not vgcreate -c n $vginvalid $dev1 $dev2 2>err +grep "New volume group name \"$vginvalid\" is invalid\$" err + +#COMM 'vgcreate rejects already existing vgname "/tmp/$vg"' +#touch /tmp/$vg +#not vgcreate $vg $dev1 $dev2 2>err +#grep "New volume group name \"$vg\" is invalid\$" err + +#COMM "vgcreate rejects repeated invocation (run 2 times) (bz178216)" +vgcreate -c n $vg $dev1 $dev2 +not vgcreate -c n $vg $dev1 $dev2 +vgremove -ff $vg + +#COMM 'vgcreate rejects MaxLogicalVolumes > 255' +not vgcreate -c n --metadatatype 1 --maxlogicalvolumes 1024 $vg $dev1 $dev2 2>err +grep "^ Number of volumes may not exceed 255\$" err + +#COMM "vgcreate fails when the only pv has --metadatacopies 0" +not vgcreate -c n $vg $dev3 + +# Test default (4MB) vg_extent_size as well as limits of extent_size +not vgcreate -c n --physicalextentsize 0k $vg $dev1 $dev2 +vgcreate -c n --physicalextentsize 1k $vg $dev1 $dev2 +check vg_field $vg vg_extent_size 1.00k +vgremove -ff $vg +not vgcreate -c n --physicalextentsize 3K $vg $dev1 $dev2 +not vgcreate -c n --physicalextentsize 1024t $vg $dev1 $dev2 +#not vgcreate --physicalextentsize 1T $vg $dev1 $dev2 +# FIXME: vgcreate allows physicalextentsize larger than pv size! + +# Test default max_lv, max_pv, extent_size, alloc_policy, clustered +vgcreate -c n $vg $dev1 $dev2 +check vg_field $vg vg_extent_size 4.00m +check vg_field $vg max_lv 0 +check vg_field $vg max_pv 0 +check vg_field $vg vg_attr "wz--n-" +vgremove -ff $vg + +# Implicit pvcreate tests, test pvcreate options on vgcreate +# --force, --yes, --metadata{size|copies|type}, --zero +# --dataalignment[offset] +pvremove $dev1 $dev2 +vgcreate -c n --force --yes --zero y $vg $dev1 $dev2 +vgremove -f $vg +pvremove -f $dev1 + +for i in 0 1 2 3 +do +# vgcreate (lvm2) succeeds writing LVM label at sector $i + vgcreate -c n --labelsector $i $vg $dev1 + dd if=$dev1 bs=512 skip=$i count=1 2>/dev/null | strings | grep LABELONE >/dev/null + vgremove -f $vg + pvremove -f $dev1 +done + +# pvmetadatacopies +for i in 1 2 +do + vgcreate -c n --pvmetadatacopies $i $vg $dev1 + check pv_field $dev1 pv_mda_count $i + vgremove -f $vg + pvremove -f $dev1 +done +not vgcreate -c n --pvmetadatacopies 0 $vg $dev1 +pvcreate --metadatacopies 1 $dev2 +vgcreate -c n --pvmetadatacopies 0 $vg $dev1 $dev2 +check pv_field $dev1 pv_mda_count 0 +check pv_field $dev2 pv_mda_count 1 +vgremove -f $vg +pvremove -f $dev1 + +# metadatasize, dataalignment, dataalignmentoffset +#COMM 'pvcreate sets data offset next to mda area' +vgcreate -c n --metadatasize 100k --dataalignment 100k $vg $dev1 +check pv_field $dev1 pe_start 200.00k +vgremove -f $vg +pvremove -f $dev1 + +# data area is aligned to 1M by default, +# data area start is shifted by the specified alignment_offset +pv_align="1052160B" # 1048576 + (7*512) +vgcreate -c n --metadatasize 128k --dataalignmentoffset 7s $vg $dev1 +check pv_field $dev1 pe_start $pv_align "--units b" +vgremove -f $vg +pvremove -f $dev1 + +# metadatatype +for i in 1 2 +do + vgcreate -c n -M $i $vg $dev1 + check vg_field $vg vg_fmt lvm$i + vgremove -f $vg + pvremove -f $dev1 +done + +# vgcreate fails if pv belongs to existing vg +vgcreate -c n $vg1 $dev1 $dev2 +not vgcreate $vg2 $dev2 +vgremove -f $vg1 +pvremove -f $dev1 $dev2 + +# all PVs exist in the VG after created +pvcreate $dev1 +vgcreate -c n $vg1 $dev1 $dev2 $dev3 +check pv_field $dev1 vg_name $vg1 +check pv_field $dev2 vg_name $vg1 +check pv_field $dev3 vg_name $vg1 +vgremove -f $vg1 +pvremove -f $dev1 $dev2 $dev3 diff --git a/test/shell/vgextend-restoremissing.sh b/test/shell/vgextend-restoremissing.sh new file mode 100644 index 00000000..ed61f789 --- /dev/null +++ b/test/shell/vgextend-restoremissing.sh @@ -0,0 +1,30 @@ +#!/bin/bash +# Copyright (C) 2010 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + +. lib/test + + +aux prepare_vg 3 +lvcreate -m 1 -l 1 -n mirror $vg +lvchange -a n $vg/mirror +lvcreate -l 1 -n lv1 $vg $dev1 + +# try to just change metadata; we expect the new version (with MISSING_PV set +# on the reappeared volume) to be written out to the previously missing PV +aux disable_dev $dev1 +lvremove $vg/mirror +aux enable_dev $dev1 +not vgck $vg 2>&1 | tee log +grep "missing 1 physical volume" log +not lvcreate -m 1 -l 1 -n mirror $vg # write operations fail +vgextend --restore $vg $dev1 # restore the missing device +vgck $vg +lvcreate -m 1 -l 1 -n mirror $vg diff --git a/test/shell/vgextend-usage.sh b/test/shell/vgextend-usage.sh new file mode 100644 index 00000000..07bca520 --- /dev/null +++ b/test/shell/vgextend-usage.sh @@ -0,0 +1,129 @@ +# Copyright (C) 2008 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + +# +# Exercise various vgextend commands +# + +. lib/test + +aux prepare_devs 5 + +for mdatype in 1 2 +do + +# Explicit pvcreate +pvcreate -M$mdatype $dev1 $dev2 $dev3 $dev4 $dev5 +vgcreate -M$mdatype $vg1 $dev1 $dev2 +vgextend $vg1 $dev3 $dev4 $dev5 +vgremove -ff $vg1 + +# Implicit pvcreate +pvremove $dev1 $dev2 $dev3 $dev4 $dev5 +vgcreate -M$mdatype $vg1 $dev1 $dev2 +vgextend -M$mdatype $vg1 $dev3 $dev4 $dev5 +vgremove -ff $vg1 +pvremove $dev1 $dev2 $dev3 $dev4 $dev5 + +done + +# Implicit pvcreate tests, test pvcreate options on vgcreate +# --force, --yes, --metadata{size|copies|type}, --zero +# --dataalignment[offset] +vgcreate $vg $dev2 +vgextend --force --yes --zero y $vg $dev1 +vgreduce $vg $dev1 +pvremove -f $dev1 + +for i in 0 1 2 3 +do +# vgcreate (lvm2) succeeds writing LVM label at sector $i + vgextend --labelsector $i $vg $dev1 + dd if=$dev1 bs=512 skip=$i count=1 2>/dev/null | strings | grep LABELONE >/dev/null + vgreduce $vg $dev1 + pvremove -f $dev1 +done + +# pvmetadatacopies +for i in 0 1 2 +do + vgextend --pvmetadatacopies $i $vg $dev1 + check pv_field $dev1 pv_mda_count $i + vgreduce $vg $dev1 + pvremove -f $dev1 +done + +# metadatasize, dataalignment, dataalignmentoffset +#COMM 'pvcreate sets data offset next to mda area' +vgextend --metadatasize 100k --dataalignment 100k $vg $dev1 +check pv_field $dev1 pe_start 200.00k +vgreduce $vg $dev1 +pvremove -f $dev1 + +# data area is aligned to 1M by default, +# data area start is shifted by the specified alignment_offset +pv_align="1052160B" # 1048576 + (7*512) +vgextend --metadatasize 128k --dataalignmentoffset 7s $vg $dev1 +check pv_field $dev1 pe_start $pv_align "--units b" +vgremove -f $vg +pvremove -f $dev1 + +# vgextend fails if pv belongs to existing vg +vgcreate $vg1 $dev1 $dev3 +vgcreate $vg2 $dev2 +not vgextend $vg2 $dev3 +vgremove -f $vg1 +vgremove -f $vg2 +pvremove -f $dev1 $dev2 $dev3 + +#vgextend fails if vg is not resizeable +vgcreate $vg1 $dev1 $dev2 +vgchange --resizeable n $vg1 +not vgextend $vg1 $dev3 +vgremove -f $vg1 +pvremove -f $dev1 $dev2 + +# all PVs exist in the VG after extended +pvcreate $dev1 +vgcreate $vg1 $dev2 +vgextend $vg1 $dev1 $dev3 +check pv_field $dev1 vg_name $vg1 +check pv_field $dev2 vg_name $vg1 +check pv_field $dev3 vg_name $vg1 +vgremove -f $vg1 +pvremove -f $dev1 $dev2 $dev3 + +echo test vgextend --metadataignore +for mdacp in 1 2; do +for ignore in y n; do + echo vgextend --metadataignore has proper mda_count and mda_used_count + vgcreate $vg $dev3 + vgextend --metadataignore $ignore --pvmetadatacopies $mdacp $vg $dev1 $dev2 + check pv_field $dev1 pv_mda_count $mdacp + check pv_field $dev2 pv_mda_count $mdacp + if [ $ignore = y ]; then + check pv_field $dev1 pv_mda_used_count 0 + check pv_field $dev2 pv_mda_used_count 0 + else + check pv_field $dev1 pv_mda_used_count $mdacp + check pv_field $dev2 pv_mda_used_count $mdacp + fi + echo vg has proper vg_mda_count and vg_mda_used_count + check vg_field $vg vg_mda_count $(($mdacp * 2 + 1)) + if [ $ignore = y ]; then + check vg_field $vg vg_mda_used_count 1 + else + check vg_field $vg vg_mda_used_count $(($mdacp * 2 + 1)) + fi + check vg_field $vg vg_mda_copies unmanaged + vgremove $vg + pvremove -ff $dev1 $dev2 $dev3 +done +done diff --git a/test/shell/vgimportclone.sh b/test/shell/vgimportclone.sh new file mode 100644 index 00000000..a7080aab --- /dev/null +++ b/test/shell/vgimportclone.sh @@ -0,0 +1,30 @@ +# Copyright (C) 2010-2011 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + +. lib/test + +aux prepare_devs 2 + +vgcreate -c n --metadatasize 128k $vg1 $dev1 +lvcreate -l100%FREE -n $lv1 $vg1 + +# Clone the LUN +dd if=$dev1 of=$dev2 bs=256K count=1 + +# Verify pvs works on each device to give us vgname +check pv_field $dev1 vg_name $vg1 +check pv_field $dev2 vg_name $vg1 + +# Import the cloned PV to a new VG +vgimportclone --basevgname $vg2 $dev2 + +# Verify we can activate / deactivate the LV from both VGs +lvchange -ay $vg1/$lv1 $vg2/$lv1 +vgchange -an $vg1 $vg2 diff --git a/test/shell/vgmerge-operation.sh b/test/shell/vgmerge-operation.sh new file mode 100644 index 00000000..73099b2e --- /dev/null +++ b/test/shell/vgmerge-operation.sh @@ -0,0 +1,81 @@ +#!/bin/sh +# Copyright (C) 2007-2008 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + +test_description='Test vgmerge operation' + +. lib/test + +aux prepare_pvs 4 64 + +# 'vgmerge succeeds with single linear LV in source VG' +vgcreate -c n $vg1 $dev1 $dev2 +vgcreate -c n $vg2 $dev3 $dev4 +lvcreate -l 4 -n $lv1 $vg1 $dev1 +vgchange -an $vg1 +check pvlv_counts $vg1 2 1 0 +check pvlv_counts $vg2 2 0 0 +vgmerge $vg2 $vg1 +check pvlv_counts $vg2 4 1 0 +vgremove -f $vg2 + +# 'vgmerge succeeds with single linear LV in source and destination VG' +vgcreate -c n $vg1 $dev1 $dev2 +vgcreate -c n $vg2 $dev3 $dev4 +lvcreate -l 4 -n $lv1 $vg1 +lvcreate -l 4 -n $lv2 $vg2 +vgchange -an $vg1 +vgchange -an $vg2 +check pvlv_counts $vg1 2 1 0 +check pvlv_counts $vg2 2 1 0 +vgmerge $vg2 $vg1 +check pvlv_counts $vg2 4 2 0 +vgremove -f $vg2 + +# 'vgmerge succeeds with linear LV + snapshots in source VG' +vgcreate -c n $vg1 $dev1 $dev2 +vgcreate -c n $vg2 $dev3 $dev4 +lvcreate -l 16 -n $lv1 $vg1 +lvcreate -l 4 -s -n $lv2 $vg1/$lv1 +vgchange -an $vg1 +check pvlv_counts $vg1 2 2 1 +check pvlv_counts $vg2 2 0 0 +vgmerge $vg2 $vg1 +check pvlv_counts $vg2 4 2 1 +lvremove -f $vg2/$lv2 +vgremove -f $vg2 + +# 'vgmerge succeeds with mirrored LV in source VG' +vgcreate -c n $vg1 $dev1 $dev2 $dev3 +vgcreate -c n $vg2 $dev4 +lvcreate -l 4 -n $lv1 -m1 $vg1 +vgchange -an $vg1 +check pvlv_counts $vg1 3 1 0 +check pvlv_counts $vg2 1 0 0 +vgmerge $vg2 $vg1 +check pvlv_counts $vg2 4 1 0 +lvremove -f $vg2/$lv1 +vgremove -f $vg2 + +# 'vgmerge rejects LV name collision' +vgcreate -c n $vg1 $dev1 $dev2 +vgcreate -c n $vg2 $dev3 $dev4 +lvcreate -l 4 -n $lv1 $vg1 +lvcreate -l 4 -n $lv1 $vg2 +vgchange -an $vg1 +check pvlv_counts $vg1 2 1 0 +check pvlv_counts $vg2 2 1 0 +not vgmerge $vg2 $vg1 2>err +grep "Duplicate logical volume name \"$lv1\" in \"$vg2\" and \"$vg1" err +check pvlv_counts $vg1 2 1 0 +check pvlv_counts $vg2 2 1 0 +vgremove -f $vg1 +vgremove -f $vg2 + diff --git a/test/shell/vgmerge-usage.sh b/test/shell/vgmerge-usage.sh new file mode 100644 index 00000000..815e1143 --- /dev/null +++ b/test/shell/vgmerge-usage.sh @@ -0,0 +1,67 @@ +#!/bin/sh +# Copyright (C) 2008 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + +# 'Test vgmerge command options for validity' + +. lib/test + +aux prepare_pvs 4 + +# 'vgmerge normal operation' +# ensure ordering does not matter +vgcreate $vg1 $dev1 $dev2 +vgcreate $vg2 $dev3 $dev4 +vgmerge $vg1 $vg2 +vgremove $vg1 +vgcreate -c n $vg2 $dev1 $dev2 +vgcreate -c n $vg1 $dev3 $dev4 +vgmerge $vg2 $vg1 +vgremove $vg2 + +# 'vgmerge rejects duplicate vg name' +vgcreate $vg1 $dev1 $dev2 +vgcreate $vg2 $dev3 $dev4 +not vgmerge $vg1 $vg1 2>err +grep "^ Duplicate volume group name \"$vg1\"\$" err +vgremove $vg1 $vg2 + +# 'vgmerge rejects vgs with incompatible extent_size' +vgcreate --physicalextentsize 4M $vg1 $dev1 $dev2 +vgcreate --physicalextentsize 8M $vg2 $dev3 $dev4 +not vgmerge $vg1 $vg2 2>err +grep "^ Extent sizes differ" err +vgremove $vg1 $vg2 + +# 'vgmerge rejects vgmerge because max_pv is exceeded' +vgcreate --maxphysicalvolumes 2 $vg1 $dev1 $dev2 +vgcreate --maxphysicalvolumes 2 $vg2 $dev3 $dev4 +not vgmerge $vg1 $vg2 2>err +grep "^ Maximum number of physical volumes (2) exceeded" err +vgremove $vg1 $vg2 + +# 'vgmerge rejects vg with active lv' +vgcreate $vg1 $dev1 $dev2 +vgcreate $vg2 $dev3 $dev4 +lvcreate -l 4 -n lv1 $vg2 +not vgmerge $vg1 $vg2 2>err +grep "^ Logical volumes in \"$vg2\" must be inactive\$" err +vgremove -f $vg1 $vg2 + +# 'vgmerge rejects vgmerge because max_lv is exceeded' +vgcreate --maxlogicalvolumes 2 $vg1 $dev1 $dev2 +vgcreate --maxlogicalvolumes 2 $vg2 $dev3 $dev4 +lvcreate -l 4 -n lv1 $vg1 +lvcreate -l 4 -n lv2 $vg1 +lvcreate -l 4 -n lv3 $vg2 +vgchange -an $vg1 $vg2 +not vgmerge $vg1 $vg2 2>err +grep "^ Maximum number of logical volumes (2) exceeded" err +vgremove -f $vg1 $vg2 diff --git a/test/shell/vgreduce-removemissing-snapshot.sh b/test/shell/vgreduce-removemissing-snapshot.sh new file mode 100644 index 00000000..3b94f5c6 --- /dev/null +++ b/test/shell/vgreduce-removemissing-snapshot.sh @@ -0,0 +1,26 @@ +# Copyright (C) 2011 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + +. lib/test + +aux prepare_vg 5 +lvcreate -m 3 --ig -L 2M -n 4way $vg $dev1 $dev2 $dev3 $dev4 $dev5:0 +lvcreate -s $vg/4way -L 2M -n snap +lvcreate -i 2 -L 2M $vg $dev1 $dev2 -n stripe + +aux disable_dev $dev2 $dev4 +echo n | lvconvert --repair $vg/4way +aux enable_dev $dev2 $dev4 +#not vgreduce --removemissing $vg +vgreduce -v --removemissing --force $vg # $dev2 $dev4 +lvs -a -o +devices | not grep unknown +lvs -a -o +devices +check mirror $vg 4way $dev5 + diff --git a/test/shell/vgreduce-usage.sh b/test/shell/vgreduce-usage.sh new file mode 100644 index 00000000..471ef59b --- /dev/null +++ b/test/shell/vgreduce-usage.sh @@ -0,0 +1,87 @@ +#!/bin/sh +# Copyright (C) 2008 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + +. lib/test + +aux prepare_devs 4 + +for mdatype in 1 2 +do + # setup PVs + pvcreate -M$mdatype $dev1 $dev2 + + # (lvm$mdatype) vgreduce removes only the specified pv from vg (bz427382)" ' + vgcreate -c n -M$mdatype $vg1 $dev1 $dev2 + vgreduce $vg1 $dev1 + check pv_field $dev2 vg_name $vg1 + vgremove -f $vg1 + + # (lvm$mdatype) vgreduce rejects removing the last pv (--all) + vgcreate -c n -M$mdatype $vg1 $dev1 $dev2 + not vgreduce --all $vg1 + vgremove -f $vg1 + + # (lvm$mdatype) vgreduce rejects removing the last pv + vgcreate -c n -M$mdatype $vg1 $dev1 $dev2 + not vgreduce $vg1 $dev1 $dev2 + vgremove -f $vg1 + + pvremove -ff $dev1 $dev2 +done + +mdatype=2 # we only expect the following to work for lvm2 metadata + +# (lvm$mdatype) setup PVs (--metadatacopies 0) +pvcreate -M$mdatype $dev1 $dev2 +pvcreate --metadatacopies 0 -M$mdatype $dev3 $dev4 + +# (lvm$mdatype) vgreduce rejects removing pv with the last mda copy (bz247448) +vgcreate -c n -M$mdatype $vg1 $dev1 $dev3 +not vgreduce $vg1 $dev1 +vgremove -f $vg1 + +#COMM "(lvm$mdatype) vgreduce --removemissing --force repares to linear (bz221921)" +# (lvm$mdatype) setup: create mirror & damage one pv +vgcreate -c n -M$mdatype $vg1 $dev1 $dev2 $dev3 +lvcreate -n $lv1 -m1 -l 4 $vg1 +lvcreate -n $lv2 -l 4 $vg1 $dev2 +lvcreate -n $lv3 -l 4 $vg1 $dev3 +vgchange -an $vg1 +aux disable_dev $dev1 +# (lvm$mdatype) vgreduce --removemissing --force repares to linear +vgreduce --removemissing --force $vg1 +check lv_field $vg1/$lv1 segtype linear +check pvlv_counts $vg1 2 3 0 +# cleanup +aux enable_dev $dev1 +pvscan +vgremove -ff $vg1 +not vgs $vg1 # just double-check it's really gone + +#COMM "vgreduce rejects --removemissing --mirrorsonly --force when nonmirror lv lost too" +# (lvm$mdatype) setup: create mirror + linear lvs +vgcreate -c n -M$mdatype $vg1 $(cat DEVICES) +lvcreate -n $lv2 -l 4 $vg1 +lvcreate -m1 -n $lv1 -l 4 $vg1 $dev1 $dev2 $dev3 +lvcreate -n $lv3 -l 4 $vg1 $dev3 +pvs --segments -o +lv_name # for record only +# (lvm$mdatype) setup: damage one pv +vgchange -an $vg1 +aux disable_dev $dev1 +#pvcreate -ff -y $dev1 +# vgreduce rejects --removemissing --mirrorsonly --force when nonmirror lv lost too +not vgreduce -c n --removemissing --mirrorsonly --force $vg1 + +aux enable_dev $dev1 + +pvs -P # for record +lvs -P # for record +vgs -P # for record diff --git a/test/shell/vgrename-usage.sh b/test/shell/vgrename-usage.sh new file mode 100644 index 00000000..bfefb814 --- /dev/null +++ b/test/shell/vgrename-usage.sh @@ -0,0 +1,41 @@ +# Copyright (C) 2008 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + +. lib/test + +aux prepare_devs 4 +pvcreate $dev1 $dev2 +pvcreate --metadatacopies 0 $dev3 $dev4 + +# vgrename normal operation - rename vg1 to vg2 +# vgrename normal operation - rename vg2 to vg1 +# ensure name ordering does not matter +vgcreate $vg1 $dev1 $dev2 +vgrename $vg1 $vg2 +check vg_field $vg2 vg_name $vg2 +vgrename $vg2 $vg1 +check vg_field $vg1 vg_name $vg1 +vgremove $vg1 + +# vgrename by uuid (bz231187) +vgcreate $vg1 $dev1 $dev3 +UUID=$(vgs --noheading -o vg_uuid $vg1) +check vg_field $vg1 vg_uuid $UUID +vgrename $UUID $vg2 +check vg_field $vg2 vg_name $vg2 +vgremove $vg2 + +# vgrename fails - new vg already exists +vgcreate $vg1 $dev1 +vgcreate $vg2 $dev2 +not vgrename $vg1 $vg2 +vgremove $vg1 +vgremove $vg2 + diff --git a/test/shell/vgsplit-operation.sh b/test/shell/vgsplit-operation.sh new file mode 100644 index 00000000..20a5cb25 --- /dev/null +++ b/test/shell/vgsplit-operation.sh @@ -0,0 +1,315 @@ +#!/bin/sh +# Copyright (C) 2007 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + +# Test vgsplit operation, including different LV types + +. lib/test + +COMM() { + LAST_TEST="$@" +} + +aux prepare_pvs 5 258 +# FIXME: paramaterize lvm1 vs lvm2 metadata; most of these tests should run +# fine with lvm1 metadata as well; for now, just add disks 5 and 6 as lvm1 +# metadata + +# +# vgsplit can be done into a new or existing VG +# +for i in new existing +do + # + # We can have PVs or LVs on the cmdline + # + for j in PV LV + do +COMM "vgsplit correctly splits single linear LV into $i VG ($j args)" + vgcreate $vg1 $dev1 $dev2 + if [ $i = existing ]; then + vgcreate $vg2 $dev3 $dev4 + fi + lvcreate -l 4 -n $lv1 $vg1 $dev1 + vgchange -an $vg1 + if [ $j = PV ]; then + vgsplit $vg1 $vg2 $dev1 + else + vgsplit -n $lv1 $vg1 $vg2 + fi + check pvlv_counts $vg1 1 0 0 + if [ $i = existing ]; then + check pvlv_counts $vg2 3 1 0 + else + check pvlv_counts $vg2 1 1 0 + fi + lvremove -f $vg2/$lv1 + vgremove -f $vg2 + vgremove -f $vg1 + +COMM "vgsplit correctly splits single striped LV into $i VG ($j args)" + vgcreate $vg1 $dev1 $dev2 + if [ $i = existing ]; then + vgcreate $vg2 $dev3 $dev4 + fi + lvcreate -l 4 -i 2 -n $lv1 $vg1 $dev1 $dev2 + vgchange -an $vg1 + if [ $j = PV ]; then + vgsplit $vg1 $vg2 $dev1 $dev2 + else + vgsplit -n $lv1 $vg1 $vg2 + fi + if [ $i = existing ]; then + check pvlv_counts $vg2 4 1 0 + else + check pvlv_counts $vg2 2 1 0 + fi + lvremove -f $vg2/$lv1 + vgremove -f $vg2 + +COMM "vgsplit correctly splits mirror LV into $i VG ($j args)" + vgcreate -c n $vg1 $dev1 $dev2 $dev3 + if [ $i = existing ]; then + vgcreate -c n $vg2 $dev4 + fi + lvcreate -l 64 -m1 -n $lv1 $vg1 $dev1 $dev2 $dev3 + vgchange -an $vg1 + if [ $j = PV ]; then + vgsplit $vg1 $vg2 $dev1 $dev2 $dev3 + else + vgsplit -n $lv1 $vg1 $vg2 + fi + if [ $i = existing ]; then + check pvlv_counts $vg2 4 1 0 + else + check pvlv_counts $vg2 3 1 0 + fi + lvremove -f $vg2/$lv1 + vgremove -f $vg2 +# FIXME: ensure split /doesn't/ work when not all devs of mirror specified + +COMM "vgsplit correctly splits mirror LV with mirrored log into $i VG ($j args)" + vgcreate -c n $vg1 $dev1 $dev2 $dev3 $dev4 + if [ $i = existing ]; then + vgcreate -c n $vg2 $dev5 + fi + + lvcreate -l 64 --mirrorlog mirrored -m1 -n $lv1 $vg1 \ + $dev1 $dev2 $dev3 $dev4 + + vgchange -an $vg1 + if [ $j = PV ]; then + vgsplit $vg1 $vg2 $dev1 $dev2 $dev3 $dev4 + else + vgsplit -n $lv1 $vg1 $vg2 + fi + if [ $i = existing ]; then + check pvlv_counts $vg2 5 1 0 + else + check pvlv_counts $vg2 4 1 0 + fi + lvremove -f $vg2/$lv1 + vgremove -f $vg2 +# FIXME: ensure split /doesn't/ work when not all devs of mirror specified + +COMM "vgsplit correctly splits origin and snapshot LV into $i VG ($j args)" + vgcreate -c n $vg1 $dev1 $dev2 + if [ $i = existing ]; then + vgcreate -c n $vg2 $dev3 $dev4 + fi + lvcreate -l 64 -i 2 -n $lv1 $vg1 $dev1 $dev2 + lvcreate -l 4 -i 2 -s -n $lv2 $vg1/$lv1 + vgchange -an $vg1 + if [ $j = PV ]; then + vgsplit $vg1 $vg2 $dev1 $dev2 + else + vgsplit -n $lv1 $vg1 $vg2 + fi + if [ $i = existing ]; then + check pvlv_counts $vg2 4 2 1 + else + check pvlv_counts $vg2 2 2 1 + fi + lvremove -f $vg2/$lv2 + lvremove -f $vg2/$lv1 + vgremove -f $vg2 + +COMM "vgsplit correctly splits linear LV but not snap+origin LV into $i VG ($j args)" + vgcreate -c n $vg1 $dev1 $dev2 + if [ $i = existing ]; then + vgcreate -c n $vg2 $dev3 + fi + lvcreate -l 64 -i 2 -n $lv1 $vg1 + lvcreate -l 4 -i 2 -s -n $lv2 $vg1/$lv1 + vgextend $vg1 $dev4 + lvcreate -l 64 -n $lv3 $vg1 $dev4 + vgchange -an $vg1 + if [ $j = PV ]; then + vgsplit $vg1 $vg2 $dev4 + else + vgsplit -n $lv3 $vg1 $vg2 + fi + if [ $i = existing ]; then + check pvlv_counts $vg2 2 1 0 + check pvlv_counts $vg1 2 2 1 + else + check pvlv_counts $vg2 1 1 0 + check pvlv_counts $vg1 2 2 1 + fi + lvremove -f $vg1/$lv2 + lvremove -f $vg1/$lv1 + lvremove -f $vg2/$lv3 + vgremove -f $vg1 + vgremove -f $vg2 + +COMM "vgsplit correctly splits linear LV but not mirror LV into $i VG ($j args)" + vgcreate -c n $vg1 $dev1 $dev2 $dev3 + if [ $i = existing ]; then + vgcreate -c n $vg2 $dev5 + fi + lvcreate -l 64 -m1 -n $lv1 $vg1 $dev1 $dev2 $dev3 + vgextend $vg1 $dev4 + lvcreate -l 64 -n $lv2 $vg1 $dev4 + vgchange -an $vg1 + vgs + lvs + pvs + if [ $j = PV ]; then + vgsplit $vg1 $vg2 $dev4 + else + vgsplit -n $lv2 $vg1 $vg2 + fi + if [ $i = existing ]; then + check pvlv_counts $vg1 3 1 0 + check pvlv_counts $vg2 2 1 0 + else + vgs + lvs + pvs + check pvlv_counts $vg1 3 1 0 + check pvlv_counts $vg2 1 1 0 + fi + lvremove -f $vg1/$lv1 + lvremove -f $vg2/$lv2 + vgremove -f $vg1 + vgremove -f $vg2 + + done +done + +# +# Test more complex setups where the code has to find associated PVs and +# LVs to split the VG correctly +# +COMM "vgsplit fails splitting 3 striped LVs into VG when only 1 LV specified" +vgcreate $vg1 $dev1 $dev2 $dev3 $dev4 +lvcreate -l 4 -n $lv1 -i 2 $vg1 $dev1 $dev2 +lvcreate -l 4 -n $lv2 -i 2 $vg1 $dev2 $dev3 +lvcreate -l 4 -n $lv3 -i 2 $vg1 $dev3 $dev4 +vgchange -an $vg1 +not vgsplit -n $lv1 $vg1 $vg2 +vgremove -ff $vg1 + +COMM "vgsplit fails splitting one LV with 2 snapshots, only origin LV specified" +vgcreate -c n $vg1 $dev1 $dev2 $dev3 $dev4 +lvcreate -l 16 -n $lv1 $vg1 $dev1 $dev2 +lvcreate -l 4 -n $lv2 -s $vg1/$lv1 $dev3 +lvcreate -l 4 -n $lv3 -s $vg1/$lv1 $dev4 +check pvlv_counts $vg1 4 3 2 +vgchange -an $vg1 +not vgsplit -n $lv1 $vg1 $vg2; +lvremove -f $vg1/$lv2 +lvremove -f $vg1/$lv3 +lvremove -f $vg1/$lv1 +vgremove -ff $vg1 + +COMM "vgsplit fails splitting one LV with 2 snapshots, only snapshot LV specified" +vgcreate -c n $vg1 $dev1 $dev2 $dev3 $dev4 +lvcreate -l 16 -n $lv1 $vg1 $dev1 $dev2 +lvcreate -l 4 -n $lv2 -s $vg1/$lv1 $dev3 +lvcreate -l 4 -n $lv3 -s $vg1/$lv1 $dev4 +check pvlv_counts $vg1 4 3 2 +vgchange -an $vg1 +not vgsplit -n $lv2 $vg1 $vg2 +lvremove -f $vg1/$lv2 +lvremove -f $vg1/$lv3 +lvremove -f $vg1/$lv1 +vgremove -ff $vg1 + +COMM "vgsplit fails splitting one mirror LV, only one PV specified" +vgcreate -c n $vg1 $dev1 $dev2 $dev3 $dev4 +lvcreate -l 16 -n $lv1 -m1 $vg1 $dev1 $dev2 $dev3 +check pvlv_counts $vg1 4 1 0 +vgchange -an $vg1 +not vgsplit $vg1 $vg2 $dev2 +vgremove -ff $vg1 + +COMM "vgsplit fails splitting 1 mirror + 1 striped LV, only striped LV specified" +vgcreate -c n $vg1 $dev1 $dev2 $dev3 $dev4 +lvcreate -l 16 -n $lv1 -m1 $vg1 $dev1 $dev2 $dev3 +lvcreate -l 16 -n $lv2 -i 2 $vg1 $dev3 $dev4 +check pvlv_counts $vg1 4 2 0 +vgchange -an $vg1 +not vgsplit -n $lv2 $vg1 $vg2 2>err +vgremove -ff $vg1 + +# +# Verify vgsplit rejects active LVs only when active LVs involved in split +# +COMM "vgsplit fails, active mirror involved in split" +vgcreate -c n $vg1 $dev1 $dev2 $dev3 $dev4 +lvcreate -l 16 -n $lv1 -m1 $vg1 $dev1 $dev2 $dev3 +lvcreate -l 16 -n $lv2 $vg1 $dev4 +lvchange -an $vg1/$lv2 +check pvlv_counts $vg1 4 2 0 +not vgsplit -n $lv1 $vg1 $vg2; +check pvlv_counts $vg1 4 2 0 +vgremove -ff $vg1 + +COMM "vgsplit succeeds, active mirror not involved in split" +vgcreate -c n $vg1 $dev1 $dev2 $dev3 $dev4 +lvcreate -l 16 -n $lv1 -m1 $vg1 $dev1 $dev2 $dev3 +lvcreate -l 16 -n $lv2 $vg1 $dev4 +lvchange -an $vg1/$lv2 +check pvlv_counts $vg1 4 2 0 +vgsplit -n $lv2 $vg1 $vg2 +check pvlv_counts $vg1 3 1 0 +check pvlv_counts $vg2 1 1 0 +vgremove -ff $vg1 +vgremove -ff $vg2 + +COMM "vgsplit fails, active snapshot involved in split" +vgcreate -c n $vg1 $dev1 $dev2 $dev3 $dev4 +lvcreate -l 64 -i 2 -n $lv1 $vg1 $dev1 $dev2 +lvcreate -l 4 -i 2 -s -n $lv2 $vg1/$lv1 +lvcreate -l 64 -i 2 -n $lv3 $vg1 $dev3 $dev4 +lvchange -an $vg1/$lv3 +check pvlv_counts $vg1 4 3 1 +not vgsplit -n $lv2 $vg1 $vg2; +check pvlv_counts $vg1 4 3 1 +lvremove -f $vg1/$lv2 +vgremove -ff $vg1 + +COMM "vgsplit succeeds, active snapshot not involved in split" +vgcreate -c n $vg1 $dev1 $dev2 $dev3 +lvcreate -l 64 -i 2 -n $lv1 $vg1 $dev1 $dev2 +lvcreate -l 4 -s -n $lv2 $vg1/$lv1 +vgextend $vg1 $dev4 +lvcreate -l 64 -n $lv3 $vg1 $dev4 +lvchange -an $vg1/$lv3 +check pvlv_counts $vg1 4 3 1 +vgsplit -n $lv3 $vg1 $vg2 +check pvlv_counts $vg1 3 2 1 +check pvlv_counts $vg2 1 1 0 +vgchange -an $vg1 +lvremove -f $vg1/$lv2 +vgremove -ff $vg1 +vgremove -ff $vg2 + diff --git a/test/shell/vgsplit-stacked.sh b/test/shell/vgsplit-stacked.sh new file mode 100644 index 00000000..6d05e1b7 --- /dev/null +++ b/test/shell/vgsplit-stacked.sh @@ -0,0 +1,29 @@ +# Copyright (C) 2010 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + +. lib/test + +aux lvmconf 'devices/filter = [ "a/dev\/mirror/", "a/dev\/mapper\/.*$/", "a/dev\/LVMTEST/", "r/.*/" ]' +cat $TESTDIR/etc/lvm.conf +aux prepare_devs 3 + +pvcreate $(cat DEVICES) +vgcreate $vg1 $dev1 $dev2 +lvcreate -n $lv1 -l 100%FREE $vg1 + +#top VG +pvcreate $DM_DEV_DIR/$vg1/$lv1 +vgcreate $vg $DM_DEV_DIR/$vg1/$lv1 $dev3 + +vgchange -a n $vg +vgchange -a n $vg1 + +# this should fail but not segfault, RHBZ 481793. +not vgsplit $vg $vg1 $dev3 diff --git a/test/shell/vgsplit-usage.sh b/test/shell/vgsplit-usage.sh new file mode 100644 index 00000000..fcf82c4a --- /dev/null +++ b/test/shell/vgsplit-usage.sh @@ -0,0 +1,168 @@ +#!/bin/sh +# Copyright (C) 2007-2008 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + +# Test vgsplit command options for validity + +. lib/test + +aux prepare_devs 5 + +for mdatype in 1 2 +do + +pvcreate -M$mdatype $(cat DEVICES) + +# ensure name order does not matter +# NOTE: if we're using lvm1, we must use -M on vgsplit +vgcreate -M$mdatype $vg1 $(cat DEVICES) +vgsplit -M$mdatype $vg1 $vg2 $dev1 +vgremove $vg1 $vg2 + +vgcreate -M$mdatype $vg2 $(cat DEVICES) +vgsplit -M$mdatype $vg2 $vg1 $dev1 +vgremove $vg1 $vg2 + +# vgsplit accepts new vg as destination of split +# lvm1 -- bz244792 +vgcreate -M$mdatype $vg1 $(cat DEVICES) +vgsplit $vg1 $vg2 $dev1 1>err +grep "New volume group \"$vg2\" successfully split from \"$vg1\"" err +vgremove $vg1 $vg2 + +# vgsplit accepts existing vg as destination of split +vgcreate -M$mdatype $vg1 $dev1 $dev2 +vgcreate -M$mdatype $vg2 $dev3 $dev4 +vgsplit $vg1 $vg2 $dev1 1>err +grep "Existing volume group \"$vg2\" successfully split from \"$vg1\"" err +vgremove $vg1 $vg2 + +# vgsplit accepts --maxphysicalvolumes 128 on new VG +vgcreate -M$mdatype $vg1 $dev1 $dev2 +vgsplit --maxphysicalvolumes 128 $vg1 $vg2 $dev1 +check vg_field $vg2 max_pv 128 +vgremove $vg1 $vg2 + +# vgsplit accepts --maxlogicalvolumes 128 on new VG +vgcreate -M$mdatype $vg1 $dev1 $dev2 +vgsplit --maxlogicalvolumes 128 $vg1 $vg2 $dev1 +check vg_field $vg2 max_lv 128 +vgremove $vg1 $vg2 + +# vgsplit rejects split because max_pv of destination would be exceeded +vgcreate -M$mdatype --maxphysicalvolumes 2 $vg1 $dev1 $dev2 +vgcreate -M$mdatype --maxphysicalvolumes 2 $vg2 $dev3 $dev4 +not vgsplit $vg1 $vg2 $dev1 2>err; +grep "^ Maximum number of physical volumes (2) exceeded" err +vgremove $vg1 $vg2 + +# vgsplit rejects split because maxphysicalvolumes given with existing vg +vgcreate -M$mdatype --maxphysicalvolumes 2 $vg1 $dev1 $dev2 +vgcreate -M$mdatype --maxphysicalvolumes 2 $vg2 $dev3 $dev4 +not vgsplit --maxphysicalvolumes 2 $vg1 $vg2 $dev1 2>err; +grep "^ Volume group \"$vg2\" exists, but new VG option specified" err +vgremove $vg1 $vg2 + +# vgsplit rejects split because maxlogicalvolumes given with existing vg +vgcreate -M$mdatype --maxlogicalvolumes 2 $vg1 $dev1 $dev2 +vgcreate -M$mdatype --maxlogicalvolumes 2 $vg2 $dev3 $dev4 +not vgsplit --maxlogicalvolumes 2 $vg1 $vg2 $dev1 2>err +grep "^ Volume group \"$vg2\" exists, but new VG option specified" err +vgremove $vg1 $vg2 + +# vgsplit rejects split because alloc given with existing vg +vgcreate -M$mdatype --alloc cling $vg1 $dev1 $dev2 +vgcreate -M$mdatype --alloc cling $vg2 $dev3 $dev4 +not vgsplit --alloc cling $vg1 $vg2 $dev1 2>err; +grep "^ Volume group \"$vg2\" exists, but new VG option specified" err +vgremove $vg1 $vg2 + +# vgsplit rejects split because clustered given with existing vg +vgcreate -M$mdatype --clustered n $vg1 $dev1 $dev2 +vgcreate -M$mdatype --clustered n $vg2 $dev3 $dev4 +not vgsplit --clustered n $vg1 $vg2 $dev1 2>err +grep "^ Volume group \"$vg2\" exists, but new VG option specified" err +vgremove $vg1 $vg2 + +# vgsplit rejects vg with active lv +pvcreate -M$mdatype -ff $dev3 $dev4 +vgcreate -M$mdatype $vg1 $dev1 $dev2 +vgcreate -M$mdatype $vg2 $dev3 $dev4 +lvcreate -l 4 -n $lv1 $vg1 +not vgsplit $vg1 $vg2 $dev1 2>err; +grep "^ Logical volumes in \"$vg1\" must be inactive\$" err +vgremove -f $vg1 $vg2 + +# vgsplit rejects split because max_lv is exceeded +vgcreate -M$mdatype --maxlogicalvolumes 2 $vg1 $dev1 $dev2 +vgcreate -M$mdatype --maxlogicalvolumes 2 $vg2 $dev3 $dev4 +lvcreate -l 4 -n $lv1 $vg1 +lvcreate -l 4 -n $lv2 $vg1 +lvcreate -l 4 -n $lv3 $vg2 +vgchange -an $vg1 $vg2 +not vgsplit $vg1 $vg2 $dev1 2>err; +grep "^ Maximum number of logical volumes (2) exceeded" err +vgremove -f $vg1 $vg2 + +# vgsplit verify default - max_lv attribute from new VG is same as source VG" \ +vgcreate -M$mdatype $vg1 $dev1 $dev2 +lvcreate -l 4 -n $lv1 $vg1 +vgchange -an $vg1 +vgsplit $vg1 $vg2 $dev1 +check compare_vg_field $vg1 $vg2 max_lv +vgremove -f $vg1 $vg2 + +# vgsplit verify default - max_pv attribute from new VG is same as source VG" \ +vgcreate -M$mdatype $vg1 $dev1 $dev2 +lvcreate -l 4 -n $lv1 $vg1 +vgchange -an $vg1 +vgsplit $vg1 $vg2 $dev1 +check compare_vg_field $vg1 $vg2 max_pv +vgremove -f $vg1 $vg2 + +# vgsplit verify default - vg_fmt attribute from new VG is same as source VG" \ +vgcreate -M$mdatype $vg1 $dev1 $dev2 +lvcreate -l 4 -n $lv1 $vg1 +vgchange -an $vg1 +vgsplit $vg1 $vg2 $dev1 +check compare_vg_field $vg1 $vg2 vg_fmt +vgremove -f $vg2 $vg1 + +# vgsplit rejects split because PV not in VG +vgcreate -M$mdatype $vg1 $dev1 $dev2 +vgcreate -M$mdatype $vg2 $dev3 $dev4 +lvcreate -l 4 -n $lv1 $vg1 +lvcreate -l 4 -n $lv2 $vg1 +vgchange -an $vg1 +not vgsplit $vg1 $vg2 $dev3 2>err; +vgremove -f $vg2 $vg1 +done + +# ONLY LVM2 metadata +# setup PVs" ' +pvcreate --metadatacopies 0 $dev5 + +# vgsplit rejects to give away pv with the last mda copy +vgcreate $vg1 $dev5 $dev2 +lvcreate -l 10 -n $lv1 $vg1 +lvchange -an $vg1/$lv1 +check pvlv_counts $vg1 2 1 0 +not vgsplit $vg1 $vg2 $dev5; +check pvlv_counts $vg1 2 1 0 +vgremove -ff $vg1 + +# vgsplit rejects split because metadata types differ +pvcreate -ff -M1 $dev3 $dev4 +pvcreate -ff $dev1 $dev2 +vgcreate -M1 $vg1 $dev3 $dev4 +vgcreate $vg2 $dev1 $dev2 +not vgsplit $vg1 $vg2 $dev3 2>err; +grep "^ Metadata types differ" err +vgremove $vg1 $vg2 |