diff options
Diffstat (limited to 'test/shell/lvconvert-raid.sh')
-rw-r--r-- | test/shell/lvconvert-raid.sh | 109 |
1 files changed, 108 insertions, 1 deletions
diff --git a/test/shell/lvconvert-raid.sh b/test/shell/lvconvert-raid.sh index c63c1415..c62aee52 100644 --- a/test/shell/lvconvert-raid.sh +++ b/test/shell/lvconvert-raid.sh @@ -11,12 +11,23 @@ . lib/test +get_image_pvs() { + local d + local images="" + + for d in `ls /dev/mapper/${1}-${2}_?image_*`; do + images="$images `basename $d | sed s:-:/:`" + done + lvs --noheadings -a -o devices $images | sed s/\(.\)// +} + ######################################################## # MAIN ######################################################## aux target_at_least dm-raid 1 1 0 || skip -aux prepare_pvs 5 80 +# 9 PVs needed for RAID10 testing (3-stripes/2-mirror - replacing 3 devs) +aux prepare_pvs 9 80 vgcreate -c n -s 256k $vg $(cat DEVICES) ########################################### @@ -132,3 +143,99 @@ for i in 1 2 3 ; do lvconvert --type raid1 $vg/$lv1 lvremove -ff $vg done + +########################################### +# Device Replacement Testing +########################################### +# RAID1: Replace up to n-1 devices - trying different combinations +# Test for 2-way to 4-way RAID1 LVs +for i in {1..3}; do + lvcreate --type raid1 -m $i -l 2 -n $lv1 $vg + + for j in $(seq $(($i + 1))); do # The number of devs to replace at once + for o in $(seq 0 $i); do # The offset into the device list + replace="" + + devices=( $(get_image_pvs $vg $lv1) ) + + for k in $(seq $j); do + index=$((($k + $o) % ($i + 1))) + replace="$replace --replace ${devices[$index]}" + done + aux wait_for_sync $vg $lv1 + + if [ $j -ge $((i + 1)) ]; then + # Can't replace all at once. + not lvconvert $replace $vg/$lv1 + else + lvconvert $replace $vg/$lv1 + fi + done + done + + lvremove -ff $vg +done + +# RAID 4/5/6 (can replace up to 'parity' devices) +for i in 4 5 6; do + lvcreate --type raid$i -i 3 -l 3 -n $lv1 $vg + + if [ $i -eq 6 ]; then + dev_cnt=5 + limit=2 + else + dev_cnt=4 + limit=1 + fi + + for j in {1..3}; do + for o in $(seq 0 $i); do + replace="" + + devices=( $(get_image_pvs $vg $lv1) ) + + for k in $(seq $j); do + index=$((($k + $o) % $dev_cnt)) + replace="$replace --replace ${devices[$index]}" + done + aux wait_for_sync $vg $lv1 + + if [ $j -gt $limit ]; then + not lvconvert $replace $vg/$lv1 + else + lvconvert $replace $vg/$lv1 + fi + done + done + + lvremove -ff $vg +done + +# RAID10: Can replace 'copies - 1' devices from each stripe +# Tests are run on 2-way mirror, 3-way stripe RAID10 +aux target_at_least dm-raid 1 3 1 || skip + +lvcreate --type raid10 -m 1 -i 3 -l 3 -n $lv1 $vg +aux wait_for_sync $vg $lv1 + +# Can replace any single device +for i in $(get_image_pvs $vg $lv1); do + lvconvert --replace $i $vg/$lv1 + aux wait_for_sync $vg $lv1 +done + +# Can't replace adjacent devices +devices=( $(get_image_pvs $vg $lv1) ) +not lvconvert --replace ${devices[0]} --replace ${devices[1]} $vg/$lv1 +not lvconvert --replace ${devices[2]} --replace ${devices[3]} $vg/$lv1 +not lvconvert --replace ${devices[4]} --replace ${devices[5]} $vg/$lv1 + +# Can replace non-adjacent devices +for i in 0 1; do + lvconvert \ + --replace ${devices[$i]} \ + --replace ${devices[$(($i + 2))]} \ + --replace ${devices[$(($i + 4))]} \ + $vg/$lv1 + aux wait_for_sync $vg $lv1 +done |