2017-07-02 22:38:32 +03:00
#!/usr/bin/env bash
2017-03-09 06:01:47 +03:00
# Copyright (C) 2011-2017 Red Hat, Inc. All rights reserved.
2011-08-18 23:56:17 +04:00
#
# 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,
2016-01-21 13:49:46 +03:00
# Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
2011-08-18 23:56:17 +04:00
2014-07-21 23:44:53 +04:00
# disable lvmetad logging as it bogs down test systems
2015-10-27 17:10:06 +03:00
SKIP_WITH_LVMPOLLD = 1
2015-05-01 15:45:47 +03:00
. lib/inittest
2014-07-21 23:44:53 +04:00
2012-08-25 00:34:19 +04:00
get_image_pvs( ) {
local d
2017-07-08 23:29:50 +03:00
local images = ( )
2012-08-25 00:34:19 +04:00
2017-07-08 23:29:50 +03:00
images = ( $( dmsetup ls | grep " ${ 1 } - ${ 2 } _.image_.* " | cut -f1 | sed -e s:-:/:) )
lvs --noheadings -a -o devices " ${ images [@] } " | sed s/\( .\) //
2012-08-25 00:34:19 +04:00
}
2011-08-18 23:56:17 +04:00
########################################################
# MAIN
########################################################
2014-05-24 00:35:05 +04:00
aux have_raid 1 3 0 || skip
2011-08-18 23:56:17 +04:00
2014-07-11 03:52:55 +04:00
aux prepare_pvs 9
2017-07-06 20:41:25 +03:00
get_devs
# vgcreate -s 256k "$vg" "${DEVICES[@]}"
2018-05-24 17:49:48 +03:00
vgcreate $SHARED -s 2m " $vg " " ${ DEVICES [@] } "
2011-08-18 23:56:17 +04:00
###########################################
# RAID1 convert tests
###########################################
2012-06-26 15:45:45 +04:00
for under_snap in false true; do
2012-10-16 00:43:15 +04:00
for i in 1 2 3; do
for j in 1 2 3; do
2011-08-18 23:56:17 +04:00
if [ $i -eq 1 ] ; then
from = "linear"
else
from = " $i -way "
fi
if [ $j -eq 1 ] ; then
to = "linear"
else
to = " $j -way "
fi
2012-01-24 18:33:38 +04:00
echo -n " Converting from $from to $to "
if $under_snap ; then
echo -n " (while under a snapshot)"
fi
echo
2011-10-07 18:52:26 +04:00
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
2013-09-11 01:33:22 +04:00
lvcreate -aey -l 2 -n $lv1 $vg
2011-10-07 18:52:26 +04:00
else
2017-07-06 20:27:04 +03:00
lvcreate --type raid1 -m $(( i - 1 )) -l 2 -n $lv1 $vg
2012-07-24 23:20:30 +04:00
aux wait_for_sync $vg $lv1
2011-10-07 18:52:26 +04:00
fi
2012-01-24 18:33:38 +04:00
if $under_snap ; then
2013-09-11 01:33:22 +04:00
lvcreate -aey -s $vg /$lv1 -n snap -l 2
2012-01-24 18:33:38 +04:00
fi
2017-03-09 06:01:47 +03:00
mirrors = $(( j - 1 ))
if [ $i -eq 1 ]
then
2017-04-06 19:47:41 +03:00
[ $mirrors -eq 0 ] && lvconvert -y -m $mirrors $vg /$lv1
2017-03-09 06:01:47 +03:00
else
if [ $mirrors -eq 0 ]
then
not lvconvert -m $mirrors $vg /$lv1
lvconvert -y -m $mirrors $vg /$lv1
else
2017-04-06 19:47:41 +03:00
lvconvert -y -m $mirrors $vg /$lv1
2017-03-09 06:01:47 +03:00
fi
fi
2011-08-18 23:56:17 +04:00
# FIXME: ensure no residual devices
if [ $j -eq 1 ] ; then
check linear $vg $lv1
fi
lvremove -ff $vg
done
done
2012-01-24 18:33:38 +04:00
done
2012-03-16 00:00:54 +04:00
2012-09-19 20:09:32 +04:00
##############################################
# RAID1 - shouldn't be able to add image
# if created '--nosync', but should
# be able to after 'lvchange --resync'
##############################################
lvcreate --type raid1 -m 1 -l 2 -n $lv1 $vg --nosync
not lvconvert -m +1 $vg /$lv1
lvchange --resync -y $vg /$lv1
aux wait_for_sync $vg $lv1
2017-04-06 19:47:41 +03:00
lvconvert -y -m +1 $vg /$lv1
2012-09-19 20:09:32 +04:00
lvremove -ff $vg
2012-03-16 00:00:54 +04:00
# 3-way to 2-way convert while specifying devices
2014-03-20 02:32:25 +04:00
lvcreate --type raid1 -m 2 -l 2 -n $lv1 $vg " $dev1 " " $dev2 " " $dev3 "
2012-07-24 23:20:30 +04:00
aux wait_for_sync $vg $lv1
2017-04-06 19:47:41 +03:00
lvconvert -y -m 1 $vg /$lv1 " $dev2 "
2012-03-16 00:00:54 +04:00
lvremove -ff $vg
2011-08-18 23:56:17 +04:00
#
# 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
2012-07-24 23:20:30 +04:00
aux wait_for_sync $vg $lv1
2011-08-18 23:56:17 +04:00
lvconvert --splitmirrors 1 -n $lv2 $vg /$lv1
check lv_exists $vg $lv1
check linear $vg $lv2
2014-12-04 16:24:44 +03:00
check active $vg $lv2
2011-08-18 23:56:17 +04:00
# FIXME: ensure no residual devices
lvremove -ff $vg
# 2-way to linear/linear
lvcreate --type raid1 -m 1 -l 2 -n $lv1 $vg
2012-07-24 23:20:30 +04:00
aux wait_for_sync $vg $lv1
2017-03-09 15:59:47 +03:00
not lvconvert --splitmirrors 1 -n $lv2 $vg /$lv1
lvconvert --yes --splitmirrors 1 -n $lv2 $vg /$lv1
2011-08-18 23:56:17 +04:00
check linear $vg $lv1
check linear $vg $lv2
2014-12-04 16:24:44 +03:00
check active $vg $lv2
2011-08-18 23:56:17 +04:00
# FIXME: ensure no residual devices
lvremove -ff $vg
2015-01-28 15:39:41 +03:00
# 4-way
lvcreate --type raid1 -m 4 -l 2 -n $lv1 $vg
aux wait_for_sync $vg $lv1
2017-03-09 15:59:47 +03:00
lvconvert --splitmirrors 1 --name $lv2 $vg /$lv1 " $dev2 "
2015-01-28 15:39:41 +03:00
lvremove -ff $vg
2011-08-18 23:56:17 +04:00
###########################################
2016-12-23 05:35:13 +03:00
# RAID1 split + trackchanges / merge with content check
2011-08-18 23:56:17 +04:00
###########################################
# 3-way to 2-way/linear
2016-12-23 05:35:13 +03:00
lvcreate --type raid1 -m 2 -l 1 -n $lv1 $vg
mkfs.ext4 " $DM_DEV_DIR / $vg / $lv1 "
fsck.ext4 -fn " $DM_DEV_DIR / $vg / $lv1 "
2012-07-24 23:20:30 +04:00
aux wait_for_sync $vg $lv1
2016-12-23 05:35:13 +03:00
fsck.ext4 -fn " $DM_DEV_DIR / $vg / $lv1 "
2011-08-18 23:56:17 +04:00
lvconvert --splitmirrors 1 --trackchanges $vg /$lv1
check lv_exists $vg $lv1
check linear $vg ${ lv1 } _rimage_2
2016-12-23 05:35:13 +03:00
fsck.ext4 -fn " $DM_DEV_DIR /mapper/ $vg - ${ lv1 } _rimage_2 "
2017-07-10 11:38:55 +03:00
dd of = " $DM_DEV_DIR / $vg / $lv1 " if = /dev/zero bs = 512 oflag = direct count = " $( blockdev --getsz " $DM_DEV_DIR / $vg / $lv1 " ) "
2016-12-23 05:35:13 +03:00
not fsck.ext4 -fn " $DM_DEV_DIR / $vg / $lv1 "
fsck.ext4 -fn " $DM_DEV_DIR /mapper/ $vg - ${ lv1 } _rimage_2 "
# FIXME: needed on tiny loop but not on real block backend ?
lvchange --refresh $vg /$lv1
2011-08-18 23:56:17 +04:00
lvconvert --merge $vg /${ lv1 } _rimage_2
2016-12-23 05:35:13 +03:00
aux wait_for_sync $vg $lv1
lvconvert --splitmirrors 1 --trackchanges $vg /$lv1
not fsck.ext4 -fn " $DM_DEV_DIR /mapper/ $vg - ${ lv1 } _rimage_2 "
2011-08-18 23:56:17 +04:00
# FIXME: ensure no residual devices
lvremove -ff $vg
2011-10-07 18:56:01 +04:00
2017-03-09 06:01:47 +03:00
# Check split track changes gets rejected w/o -y on 2-legged raid1
lvcreate --type raid1 -m 1 -l 1 -n $lv1 $vg
mkfs.ext4 " $DM_DEV_DIR / $vg / $lv1 "
fsck.ext4 -fn " $DM_DEV_DIR / $vg / $lv1 "
aux wait_for_sync $vg $lv1
fsck.ext4 -fn " $DM_DEV_DIR / $vg / $lv1 "
not lvconvert --splitmirrors 1 --trackchanges $vg /$lv1
2017-03-09 15:59:47 +03:00
lvconvert --yes --splitmirrors 1 --trackchanges $vg /$lv1
2017-03-09 06:01:47 +03:00
# FIXME: ensure no residual devices
lvremove -ff $vg
2013-06-20 02:50:10 +04:00
###########################################
# Linear to RAID1 conversion ("raid1" default segtype)
###########################################
2013-09-11 01:33:22 +04:00
lvcreate -aey -l 2 -n $lv1 $vg
2017-04-06 19:47:41 +03:00
lvconvert -y -m 1 $vg /$lv1 \
2013-06-20 02:50:10 +04:00
--config 'global { mirror_segtype_default = "raid1" }'
2013-09-26 07:25:43 +04:00
lvs --noheadings -o attr $vg /$lv1 | grep '^[[:space:]]*r'
2013-06-20 02:50:10 +04:00
lvremove -ff $vg
###########################################
# Linear to RAID1 conversion (override "mirror" default segtype)
###########################################
2013-09-11 01:33:22 +04:00
lvcreate -aey -l 2 -n $lv1 $vg
2017-04-06 19:47:41 +03:00
lvconvert --yes --type raid1 -m 1 $vg /$lv1 \
2013-06-20 02:50:10 +04:00
--config 'global { mirror_segtype_default = "mirror" }'
2013-09-26 07:25:43 +04:00
lvs --noheadings -o attr $vg /$lv1 | grep '^[[:space:]]*r'
2013-06-20 02:50:10 +04:00
lvremove -ff $vg
2013-09-11 01:33:22 +04:00
###########################################
# Must not be able to convert non-EX LVs in a cluster
###########################################
if [ -e LOCAL_CLVMD ] ; then
lvcreate -l 2 -n $lv1 $vg
2017-04-06 19:47:41 +03:00
not lvconvert -y --type raid1 -m 1 $vg /$lv1 \
2013-09-11 01:33:22 +04:00
--config 'global { mirror_segtype_default = "mirror" }'
lvremove -ff $vg
fi
2011-10-07 18:56:01 +04:00
###########################################
# Mirror to RAID1 conversion
###########################################
for i in 1 2 3 ; do
2013-09-11 01:33:22 +04:00
lvcreate -aey --type mirror -m $i -l 2 -n $lv1 $vg
2012-07-24 23:20:30 +04:00
aux wait_for_sync $vg $lv1
2017-04-06 19:47:41 +03:00
lvconvert -y --type raid1 $vg /$lv1
2011-10-07 18:56:01 +04:00
lvremove -ff $vg
done
2012-08-25 00:34:19 +04:00
2017-06-14 16:41:05 +03:00
###########################################
# Upconverted RAID1 should not allow loss of primary
# - don't allow removal of primary while syncing
# - DO allow removal of secondaries while syncing
###########################################
2017-07-10 11:40:09 +03:00
aux delay_dev " $dev2 " 0 100
lvcreate -aey -l 2 -n $lv1 $vg " $dev1 "
2017-06-14 16:41:05 +03:00
lvconvert -y -m 1 $vg /$lv1 \
2017-07-10 11:40:09 +03:00
--config 'global { mirror_segtype_default = "raid1" }' " $dev2 "
2017-06-14 16:41:05 +03:00
lvs --noheadings -o attr $vg /$lv1 | grep '^[[:space:]]*r'
2017-07-10 11:40:09 +03:00
not lvconvert --yes -m 0 $vg /$lv1 " $dev1 "
lvconvert --yes -m 0 $vg /$lv1 " $dev2 "
aux enable_dev " $dev2 "
2017-06-14 16:41:05 +03:00
lvremove -ff $vg
###########################################
# lvcreated RAID1 should allow all down-conversion
# - DO allow removal of primary while syncing
# - DO allow removal of secondaries while syncing
###########################################
2017-07-10 11:40:09 +03:00
aux delay_dev " $dev2 " 0 100
lvcreate --type raid1 -m 2 -aey -l 2 -n $lv1 $vg " $dev1 " " $dev2 " " $dev3 "
2018-11-19 00:01:27 +03:00
case " $( uname -r) " in
4.8.14*)
echo "Skippen test that kills this kernel"
; ;
*)
2017-07-10 11:40:09 +03:00
lvconvert --yes -m 1 $vg /$lv1 " $dev3 "
2021-03-20 12:39:02 +03:00
# FIXME: it is unclear what should happen - older kernel
# do use 'resync' for initial array building so then
# we are not able to recognize difference
# Should we check version target as react differentely ??
# Otherwise we have problem with the above test case.
should lvconvert --yes -m 0 $vg /$lv1 " $dev1 "
2017-07-10 11:40:09 +03:00
aux enable_dev " $dev2 "
2018-11-19 00:01:27 +03:00
; ;
esac
2017-06-14 16:41:05 +03:00
lvremove -ff $vg
###########################################
# Converting from 2-way RAID1 to 3-way
# - DO allow removal of one of primary sources
# - Do not allow removal of all primary sources
###########################################
2017-07-10 11:40:09 +03:00
lvcreate --type raid1 -m 1 -aey -l 2 -n $lv1 $vg " $dev1 " " $dev2 "
2017-06-14 16:41:05 +03:00
aux wait_for_sync $vg $lv1
2017-07-10 11:40:09 +03:00
aux delay_dev " $dev3 " 0 100
lvconvert --yes -m +1 $vg /$lv1 " $dev3 "
2017-06-14 16:41:05 +03:00
# should allow 1st primary to be removed
2017-07-10 11:40:09 +03:00
lvconvert --yes -m -1 $vg /$lv1 " $dev1 "
2017-06-14 16:41:05 +03:00
# should NOT allow last primary to be removed
2017-07-10 11:40:09 +03:00
not lvconvert --yes -m -1 $vg /$lv1 " $dev2 "
2017-06-14 16:41:05 +03:00
# should allow non-primary to be removed
2017-07-10 11:40:09 +03:00
lvconvert --yes -m 0 $vg /$lv1 " $dev3 "
aux enable_dev " $dev3 "
2017-06-14 16:41:05 +03:00
lvremove -ff $vg
###########################################
# Converting from 2-way RAID1 to 3-way
# - Should allow removal of two devices,
# as long as they aren't both primary
###########################################
2017-07-10 11:40:09 +03:00
lvcreate --type raid1 -m 1 -aey -l 2 -n $lv1 $vg " $dev1 " " $dev2 "
2017-06-14 16:41:05 +03:00
aux wait_for_sync $vg $lv1
2017-07-10 11:40:09 +03:00
aux delay_dev " $dev3 " 0 100
lvconvert --yes -m +1 $vg /$lv1 " $dev3 "
2017-06-14 16:41:05 +03:00
# should NOT allow both primaries to be removed
2017-07-10 11:40:09 +03:00
not lvconvert -m 0 $vg /$lv1 " $dev1 " " $dev2 "
2017-06-14 16:41:05 +03:00
# should allow primary + non-primary
2017-07-10 11:40:09 +03:00
lvconvert --yes -m 0 $vg /$lv1 " $dev1 " " $dev3 "
aux enable_dev " $dev3 "
2017-06-14 16:41:05 +03:00
lvremove -ff $vg
2012-08-25 00:34:19 +04:00
###########################################
# 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
2017-07-10 11:40:09 +03:00
lvcreate --type raid1 -m " $i " -l 2 -n $lv1 $vg
2012-08-25 00:34:19 +04:00
2017-07-10 11:40:09 +03:00
for j in $( seq $(( i + 1 )) ) ; do # The number of devs to replace at once
2012-08-25 00:34:19 +04:00
for o in $( seq 0 $i ) ; do # The offset into the device list
2017-07-08 23:29:50 +03:00
replace = ( )
2012-08-25 00:34:19 +04:00
devices = ( $( get_image_pvs $vg $lv1 ) )
2017-07-10 11:40:09 +03:00
for k in $( seq " $j " ) ; do
2017-07-06 20:27:04 +03:00
index = $(( ( k + o ) % ( i + 1 ) ))
2017-07-08 23:29:50 +03:00
replace += ( "--replace" )
replace += ( " ${ devices [ $index ] } " )
2012-08-25 00:34:19 +04:00
done
aux wait_for_sync $vg $lv1
2017-07-10 11:40:09 +03:00
if [ " $j " -ge $(( i + 1 )) ] ; then
2012-08-25 00:34:19 +04:00
# Can't replace all at once.
2017-07-08 23:29:50 +03:00
not lvconvert " ${ replace [@] } " $vg /$lv1
2012-08-25 00:34:19 +04:00
else
2017-07-08 23:29:50 +03:00
lvconvert " ${ replace [@] } " $vg /$lv1
2012-08-25 00:34:19 +04:00
fi
done
done
lvremove -ff $vg
done
2014-02-27 02:25:30 +04:00
vgremove -ff $vg