summaryrefslogtreecommitdiffstats
path: root/test/shell/lvconvert-raid.sh
diff options
context:
space:
mode:
Diffstat (limited to 'test/shell/lvconvert-raid.sh')
-rw-r--r--test/shell/lvconvert-raid.sh109
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