diff options
author | Jonathan Brassow <jbrassow@redhat.com> | 2013-08-26 16:38:54 -0500 |
---|---|---|
committer | Jonathan Brassow <jbrassow@redhat.com> | 2013-08-26 16:38:54 -0500 |
commit | 0799e81ee08a76c877d774b2f7df75ad3ec29897 (patch) | |
tree | dac4a9fb4bdcb1de05e3d176202dfbced009b559 | |
parent | 2ef48b91ed74f732b6150a9492da624d204b331d (diff) | |
download | lvm2-0799e81ee08a76c877d774b2f7df75ad3ec29897.tar.gz |
test: pvmove tests for all the different segment types.
Test moving linear, mirror, snapshot, RAID1,5,10, thinpool, thin
and thin on RAID. Perform the moves along with a dummy LV and
also without the dummy LV by specifying a logical volume name as
an argument to pvmove.
-rw-r--r-- | test/shell/pvmove-all-segtypes.sh | 304 |
1 files changed, 304 insertions, 0 deletions
diff --git a/test/shell/pvmove-all-segtypes.sh b/test/shell/pvmove-all-segtypes.sh new file mode 100644 index 000000000..13b8fba54 --- /dev/null +++ b/test/shell/pvmove-all-segtypes.sh @@ -0,0 +1,304 @@ +#!/bin/sh +# Copyright (C) 2013 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="ensure pvmove works with all segment types" + +. lib/test + +which mkfs.ext2 || skip +which md5sum || skip + +# --------------------------------------------------------------------- +# Utilities +lvdev_() { + echo "$DM_DEV_DIR/$1/$2" +} + +# lv_is_on_pvs <VG> <LV> <PV1> <PV2> ... +lv_is_on_pvs() { + local vg=$1 + local lv_list=( $2 ) + local new_lv_list=() + local run_again=true + + shift 2 + + while $run_again; do + run_again=false + for tmplv in ${lv_list[*]}; do + if [[ $(lvs -a --noheadings -o attr $vg/$tmplv) =~ ^[[:space:]]*r.* ]] || + [[ $(lvs -a --noheadings -o attr $vg/$tmplv) =~ ^[[:space:]]*R.* ]]; then + # Expand RAID + echo "$tmplv is a RAID LV" + new_lv_list=( ${new_lv_list[*]} `lvs -a --noheadings -o name | grep ${tmplv}_r` ) + run_again=true + elif [[ $(lvs -a --noheadings -o attr $vg/$tmplv) =~ ^[[:space:]]*m.* ]] || + [[ $(lvs -a --noheadings -o attr $vg/$tmplv) =~ ^[[:space:]]*M.* ]]; then + # Expand Mirror + echo "$tmplv is a mirror LV" + new_lv_list=( ${new_lv_list[*]} `lvs -a --noheadings -o devices $vg/$tmplv | sed s/,/' '/g` ) + new_lv_list=( ${new_lv_list[*]} `lvs -a --noheadings -o mirror_log $vg/$tmplv | sed s/,/' '/g` ) + run_again=true + elif [[ $(lvs -a --noheadings -o attr $vg/$tmplv) =~ ^[[:space:]]*t.* ]]; then + # Expand Thin Pool + echo "$tmplv is a thin-pool LV" + new_lv_list=( ${new_lv_list[*]} `lvs -a --noheadings -o data_lv,metadata_lv $vg/$tmplv | sed s/,/' '/g` ) + run_again=true + elif [[ $(lvs -a --noheadings -o attr $vg/$tmplv) =~ ^[[:space:]]*V.* ]]; then + # Expand Thin-LV + echo "$tmplv is a thin-LV" + new_lv_list=( ${new_lv_list[*]} `lvs -a --noheadings -o pool_lv $vg/$tmplv | sed s/,/' '/g` ) + run_again=true + elif [[ $(lvs -a --noheadings -o attr $vg/$tmplv) =~ ^[[:space:]]*e.* ]] && + lvs -a --noheadings -o devices $vg/$tmplv | grep $tmplv; then + # Expand Thin Pool Meta, which is also RAID + echo "$tmplv is a thinpool (RAID) metadata" + new_lv_list=( ${new_lv_list[*]} `lvs -a --noheadings -o name | grep ${tmplv}_r` ) + run_again=true + else + new_lv_list=( ${new_lv_list[*]} $tmplv ) + fi + done + printf "\nOld LV list: ${lv_list[*]}\n\n" + + lv_list=() + for tmplv in ${new_lv_list[*]}; do + lv_list=( ${lv_list[*]} $(echo $tmplv | sed s/\(.*\)/''/ | sed s/\\[/''/ | sed s/]/''/) ) + done + printf "\nExpanded LV list: ${lv_list[*]}\n\n" + + new_lv_list=() + done + + [ -e out-$$ ] && rm out-$$ + for tmplv in ${lv_list[*]}; do + lvs -a -odevices --noheadings $vg/$tmplv | sed 's/,/\n/g' >> out-$$ + done + + #is on all specified devs + for d in $*; do + if ! grep "$d(" out-$$; then + cat out-$$ + false + fi + done + + #isn't on any other dev (we are set -e remember) + cat out-$$ + [ -e tmp-$$ ] && rm tmp-$$ + for d in $*; do + echo "Removing $d" + ! grep -v "$d(" out-$$ >> tmp-$$ + mv tmp-$$ out-$$ + cat out-$$ + done + # out-$$ must be empty - no additional devs allowed + [ ! -s out-$$ ] + + rm out-$$ + return 0 +} + +save_dev_sum_() { + mkfs.ext2 $1 > /dev/null && md5sum $1 > md5.$(basename $1) +} + +check_dev_sum_() { + md5sum -c md5.$(basename $1) +} +# --------------------------------------------------------------------- + +aux prepare_vg 5 30 + +# Each of the following tests does: +# 1) Create two LVs - one linear and one other segment type +# The two LVs will share a PV. +# 2) Move both LVs together +# 3) Move only the second LV by name + +printf "##\n# Testing pvmove of linear LV\n##\n" +lvcreate -l 2 -n ${lv1}_foo $vg "$dev1" +lvcreate -l 2 -n $lv1 $vg "$dev1" +lv_is_on_pvs $vg ${lv1}_foo "$dev1" +lv_is_on_pvs $vg $lv1 "$dev1" +save_dev_sum_ $(lvdev_ $vg $lv1) +pvmove "$dev1" "$dev5" +lv_is_on_pvs $vg ${lv1}_foo "$dev5" +lv_is_on_pvs $vg $lv1 "$dev5" +check_dev_sum_ $(lvdev_ $vg $lv1) +pvmove -n $lv1 "$dev5" "$dev4" +lv_is_on_pvs $vg $lv1 "$dev4" +lv_is_on_pvs $vg ${lv1}_foo "$dev5" +check_dev_sum_ $(lvdev_ $vg $lv1) +lvremove -ff $vg + +printf "##\n# Testing pvmove of stripe LV\n##\n" +lvcreate -l 2 -n ${lv1}_foo $vg "$dev1" +lvcreate -l 4 -i 2 -n $lv1 $vg "$dev1" "$dev2" +lv_is_on_pvs $vg ${lv1}_foo "$dev1" +lv_is_on_pvs $vg $lv1 "$dev1" "$dev2" +save_dev_sum_ $(lvdev_ $vg $lv1) +pvmove "$dev1" "$dev5" +lv_is_on_pvs $vg ${lv1}_foo "$dev5" +lv_is_on_pvs $vg $lv1 "$dev2" "$dev5" +check_dev_sum_ $(lvdev_ $vg $lv1) +pvmove -n $lv1 "$dev5" "$dev4" +lv_is_on_pvs $vg $lv1 "$dev2" "$dev4" +lv_is_on_pvs $vg ${lv1}_foo "$dev5" +check_dev_sum_ $(lvdev_ $vg $lv1) +lvremove -ff $vg + +printf "##\n# Testing pvmove of mirror LV\n##\n" +lvcreate -l 2 -n ${lv1}_foo $vg "$dev1" +lvcreate -l 2 --type mirror -m 1 -n $lv1 $vg "$dev1" "$dev2" +lv_is_on_pvs $vg ${lv1}_foo "$dev1" +lv_is_on_pvs $vg $lv1 "$dev1" "$dev2" +save_dev_sum_ $(lvdev_ $vg $lv1) +pvmove "$dev1" "$dev5" +lv_is_on_pvs $vg ${lv1}_foo "$dev5" +lv_is_on_pvs $vg $lv1 "$dev2" "$dev5" +check_dev_sum_ $(lvdev_ $vg $lv1) +pvmove -n $lv1 "$dev5" "$dev4" +lv_is_on_pvs $vg $lv1 "$dev2" "$dev4" +lv_is_on_pvs $vg ${lv1}_foo "$dev5" +check_dev_sum_ $(lvdev_ $vg $lv1) +lvremove -ff $vg + +# Dummy LV and snap share dev1, while origin is on dev2 +printf "##\n# Testing pvmove of snapshot LV\n##\n" +lvcreate -l 2 -n ${lv1}_foo $vg "$dev1" +lvcreate -l 2 -n $lv1 $vg "$dev2" +lvcreate -s $vg/$lv1 -l 2 -n snap "$dev1" +lv_is_on_pvs $vg ${lv1}_foo "$dev1" +lv_is_on_pvs $vg snap "$dev1" +save_dev_sum_ $(lvdev_ $vg snap) +pvmove "$dev1" "$dev5" +lv_is_on_pvs $vg ${lv1}_foo "$dev5" +lv_is_on_pvs $vg snap "$dev5" +check_dev_sum_ $(lvdev_ $vg snap) +pvmove -n snap "$dev5" "$dev4" +lv_is_on_pvs $vg snap "$dev4" +lv_is_on_pvs $vg ${lv1}_foo "$dev5" +check_dev_sum_ $(lvdev_ $vg snap) +lvremove -ff $vg + +## +# RAID +## +if aux target_at_least dm-raid 1 3 5; then + printf "##\n# Testing pvmove of RAID1 LV\n##\n" + lvcreate -l 2 -n ${lv1}_foo $vg "$dev1" + lvcreate -l 2 --type raid1 -m 1 -n $lv1 $vg "$dev1" "$dev2" + lv_is_on_pvs $vg ${lv1}_foo "$dev1" + lv_is_on_pvs $vg $lv1 "$dev1" "$dev2" + save_dev_sum_ $(lvdev_ $vg $lv1) + pvmove "$dev1" "$dev5" + lv_is_on_pvs $vg ${lv1}_foo "$dev5" + lv_is_on_pvs $vg $lv1 "$dev2" "$dev5" + check_dev_sum_ $(lvdev_ $vg $lv1) + pvmove -n $lv1 "$dev5" "$dev4" + lv_is_on_pvs $vg $lv1 "$dev2" "$dev4" + lv_is_on_pvs $vg ${lv1}_foo "$dev5" + check_dev_sum_ $(lvdev_ $vg $lv1) + lvremove -ff $vg + + printf "##\n# Testing pvmove of RAID10 LV\n##\n" + lvcreate -l 2 -n ${lv1}_foo $vg "$dev1" + lvcreate -l 4 --type raid10 -i 2 -m 1 -n $lv1 $vg \ + "$dev1" "$dev2" "$dev3" "$dev4" + lv_is_on_pvs $vg ${lv1}_foo "$dev1" + lv_is_on_pvs $vg $lv1 "$dev1" "$dev2" "$dev3" "$dev4" + save_dev_sum_ $(lvdev_ $vg $lv1) + pvmove "$dev1" "$dev5" + lv_is_on_pvs $vg ${lv1}_foo "$dev5" + lv_is_on_pvs $vg $lv1 "$dev2" "$dev3" "$dev4" "$dev5" + check_dev_sum_ $(lvdev_ $vg $lv1) + pvmove -n $lv1 "$dev5" "$dev1" + lv_is_on_pvs $vg $lv1 "$dev1" "$dev2" "$dev3" "$dev4" + lv_is_on_pvs $vg ${lv1}_foo "$dev5" + check_dev_sum_ $(lvdev_ $vg $lv1) + lvremove -ff $vg + + printf "##\n# Testing pvmove of RAID5 LV\n##\n" + lvcreate -l 2 -n ${lv1}_foo $vg "$dev1" + lvcreate -l 4 --type raid5 -i 2 -n $lv1 $vg \ + "$dev1" "$dev2" "$dev3" + lv_is_on_pvs $vg ${lv1}_foo "$dev1" + lv_is_on_pvs $vg $lv1 "$dev1" "$dev2" "$dev3" + save_dev_sum_ $(lvdev_ $vg $lv1) + pvmove "$dev1" "$dev5" + lv_is_on_pvs $vg ${lv1}_foo "$dev5" + lv_is_on_pvs $vg $lv1 "$dev2" "$dev3" "$dev5" + check_dev_sum_ $(lvdev_ $vg $lv1) + pvmove -n $lv1 "$dev5" "$dev4" + lv_is_on_pvs $vg $lv1 "$dev2" "$dev3" "$dev4" + lv_is_on_pvs $vg ${lv1}_foo "$dev5" + check_dev_sum_ $(lvdev_ $vg $lv1) + lvremove -ff $vg +fi + +## +# Thin +## +if aux target_at_least dm-thin-pool 1 8 0; then + + printf "##\n# Testing pvmove of thin-pool LV\n##\n" + lvcreate -l 2 -n ${lv1}_foo $vg "$dev1" + lvcreate -T $vg/$lv1 -l 4 "$dev1" + lv_is_on_pvs $vg ${lv1}_foo "$dev1" + lv_is_on_pvs $vg $lv1 "$dev1" + save_dev_sum_ $(lvdev_ $vg $lv1) + pvmove "$dev1" "$dev5" + lv_is_on_pvs $vg ${lv1}_foo "$dev5" + lv_is_on_pvs $vg $lv1 "$dev5" + check_dev_sum_ $(lvdev_ $vg $lv1) + pvmove -n $lv1 "$dev5" "$dev4" + lv_is_on_pvs $vg $lv1 "$dev4" + lv_is_on_pvs $vg ${lv1}_foo "$dev5" + check_dev_sum_ $(lvdev_ $vg $lv1) + lvremove -ff $vg + + printf "##\n# Testing pvmove of thin LV\n##\n" + lvcreate -l 2 -n ${lv1}_foo $vg "$dev1" + lvcreate -T $vg/${lv1}_pool -l 4 -V 8 -n $lv1 "$dev1" + lv_is_on_pvs $vg ${lv1}_foo "$dev1" + lv_is_on_pvs $vg $lv1 "$dev1" + save_dev_sum_ $(lvdev_ $vg $lv1) + pvmove "$dev1" "$dev5" + lv_is_on_pvs $vg ${lv1}_foo "$dev5" + lv_is_on_pvs $vg $lv1 "$dev5" + check_dev_sum_ $(lvdev_ $vg $lv1) + pvmove -n $lv1 "$dev5" "$dev4" + lv_is_on_pvs $vg $lv1 "$dev4" + lv_is_on_pvs $vg ${lv1}_foo "$dev5" + check_dev_sum_ $(lvdev_ $vg $lv1) + lvremove -ff $vg + + printf "##\n# Testing pvmove of thin LV on RAID\n##\n" + lvcreate -l 2 -n ${lv1}_foo $vg "$dev1" + lvcreate --type raid1 -m 1 -l 4 -n ${lv1}_raid1_pool $vg "$dev1" "$dev2" + lvcreate --type raid1 -m 1 -l 4 -n ${lv1}_raid1_meta $vg "$dev1" "$dev2" + lvconvert --thinpool $vg/${lv1}_raid1_pool \ + --poolmetadata ${lv1}_raid1_meta + lvcreate -T $vg/${lv1}_raid1_pool -V 8 -n $lv1 + lv_is_on_pvs $vg ${lv1}_foo "$dev1" + lv_is_on_pvs $vg $lv1 "$dev1" "$dev2" + save_dev_sum_ $(lvdev_ $vg $lv1) + pvmove "$dev1" "$dev5" + lv_is_on_pvs $vg ${lv1}_foo "$dev5" + lv_is_on_pvs $vg $lv1 "$dev2" "$dev5" + check_dev_sum_ $(lvdev_ $vg $lv1) + pvmove -n $lv1 "$dev5" "$dev4" + lv_is_on_pvs $vg $lv1 "$dev2" "$dev4" + lv_is_on_pvs $vg ${lv1}_foo "$dev5" + check_dev_sum_ $(lvdev_ $vg $lv1) + lvremove -ff $vg +fi |