blob: 530e6dd8303a189ab195cd997c460a9b9af7841b [file] [log] [blame]
#!/bin/sh
# Copyright (C) 2010-2012 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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
SKIP_WITH_LVMLOCKD=1
# disable lvmetad logging as it bogs down test systems
export LVM_TEST_LVMETAD_DEBUG_OPTS=${LVM_TEST_LVMETAD_DEBUG_OPTS-}
. lib/inittest
log_name_to_count() {
case "$1" in
mirrored) echo 2 ;;
disk) echo 1 ;;
*) echo 0 ;;
esac
}
# 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?
test $start_count_p1 -gt ${#dev_array[@]} && \
die "Action requires too many devices"
# Do we have enough devices for the mirror images?
test $finish_count_p1 -gt ${#dev_array[@]} && \
die "Action requires too many devices"
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 -aey -l2 --type mirror -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 -aey -l2 -n $lv1 $vg
fi
lvs -a -o name,copy_percent,devices $vg
test $active || lvchange -an $vg/$lv1
# 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 --type mirror -m $finish_count --mirrorlog $finish_log_type \
$vg/$lv1 $alloc
test $active || lvchange -aey $vg/$lv1
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_pvs 5 5
vgcreate -s 32k $vg $(cat DEVICES)
MIRRORED="mirrored"
# FIXME: Cluster is not supporting exlusive activation of mirrored log
test -e LOCAL_CLVMD && MIRRORED=
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
}