454 lines
11 KiB
Text
454 lines
11 KiB
Text
# Set of tests for autorebuild functionality using mdadm -F
|
|
# To be able to test ddf one must have all loop devices of bigger size, with the ones
|
|
# above number 7 bigger again by any amount (this is not changed for now as it
|
|
# could affect other tests)
|
|
|
|
export IMSM_DEVNAME_AS_SERIAL=1
|
|
export IMSM_TEST_OROM=1
|
|
export IMSM_NO_PLATFORM=1
|
|
|
|
. tests/utils
|
|
set -ex
|
|
verbose="yes"
|
|
sleeptime=10
|
|
|
|
# if listfailed=yes then don't exit if test failed due to wrong
|
|
# spare-migration and just print a list at the end. Other errors still
|
|
# stop the test.
|
|
# if listfailed=no then exit on first failure
|
|
listfailed="yes"
|
|
|
|
# start Monitor, set monitorpid
|
|
# uses global scan variable
|
|
# all parameters are numbers of devices to be monitored. only used when $scan="no"
|
|
# eg. monitor 0 1 will start monitoring of containers c0, c1 and subarrays v0, v1
|
|
monitor(){
|
|
[ -z $monitorpid ] || return
|
|
if [ "$scan" == "yes" ]; then
|
|
$mdadm -F -d 1 --scan --mail root@localhost -c $config &
|
|
monitorpid=$!
|
|
return
|
|
fi
|
|
unset mddevs
|
|
while [ -n "$1" ]
|
|
do
|
|
eval container=\$c$1
|
|
eval volumes=\$v$1
|
|
mddevs="$mddevs /dev/$container"
|
|
if [ "$container" != "$volumes" ]; then
|
|
for vol in $volumes; do
|
|
mddevs="$mddevs /dev/$vol"
|
|
done
|
|
fi
|
|
shift
|
|
done
|
|
if [ -n "$mddevs" ]; then
|
|
if [ "$verbose" != "yes" ]; then
|
|
$mdadm -F -d 1 $mddevs -c $config >&2 &
|
|
monitorpid=$!
|
|
else
|
|
$mdadm -F -t -d 1 $mddevs -c $config &
|
|
monitorpid=$!
|
|
fi
|
|
fi
|
|
[ "$verbose" != "yes" ] || echo $mddevs $monitorpid
|
|
}
|
|
|
|
test0()
|
|
{
|
|
dsc "Test 0: No config file, no spare should be moved"
|
|
> $config
|
|
setupdevs 0 0 1 $platform
|
|
setupdevs 1 3 4 $platform
|
|
monitor 0 1
|
|
mdadm -a /dev/$c1 $dev2
|
|
mdadm --fail /dev/$v0 $dev0
|
|
# check that spare loop2 was not moved from container c1 to container c0
|
|
chksparemoved $c1 $c0 $dev2 n
|
|
tidyup
|
|
}
|
|
|
|
test0a()
|
|
{
|
|
dsc "Test 0a: No domains in config file, no spare should be moved"
|
|
setupdevs 0 0 1 $platform
|
|
setupdevs 1 3 4 $platform
|
|
createconfig a
|
|
monitor 0 1
|
|
mdadm -a /dev/$c1 $dev2
|
|
mdadm --fail /dev/$v0 $dev0
|
|
# check that spare loop2 was not moved from container c1 to container c0
|
|
chksparemoved $c1 $c0 $dev2 n
|
|
tidyup
|
|
}
|
|
|
|
test1()
|
|
{
|
|
dsc "Test 1: Common domain, add disk to one container and fail first one in another container, spare should be moved"
|
|
setupdevs 0 0 1 $platform
|
|
setupdevs 1 3 4 $platform
|
|
# create config file with arrays and common domain
|
|
createconfig a
|
|
createconfig domain-$platform $platform spare 0 1 2 3 4
|
|
monitor 0 1
|
|
mdadm -a /dev/$c1 $dev2
|
|
mdadm --fail /dev/$v0 $dev0
|
|
# check that spare loop2 was moved from container c1 to container c0
|
|
chksparemoved $c1 $c0 $dev2
|
|
tidyup
|
|
}
|
|
|
|
test1a()
|
|
{
|
|
dsc "Test 1a: Common domain, add disk to one container and fail second one in another container, spare should be moved"
|
|
setupdevs 0 0 1 $platform
|
|
setupdevs 1 3 4 $platform
|
|
createconfig a
|
|
createconfig domain-$platform $platform spare 0 1 2 3 4
|
|
monitor 0 1
|
|
mdadm -a /dev/$c1 $dev2
|
|
mdadm --fail /dev/$v0 $dev1
|
|
# check that spare loop2 was moved from container c1 to container c0
|
|
chksparemoved $c1 $c0 $dev2
|
|
tidyup
|
|
}
|
|
|
|
test2()
|
|
{
|
|
dsc "Test 2: Common domain, fail disk in one container and add one to another container, spare should be moved"
|
|
setupdevs 0 0 1 $platform
|
|
setupdevs 1 3 4 $platform
|
|
createconfig a
|
|
createconfig domain-$platform $platform spare 0 1 2 3 4
|
|
monitor 0 1
|
|
mdadm --fail /dev/$v0 $dev1
|
|
mdadm -a /dev/$c1 $dev2
|
|
chksparemoved $c1 $c0 $dev2
|
|
tidyup
|
|
}
|
|
|
|
test3()
|
|
{
|
|
dsc "Test 3: Two domains, fail a disk in one domain, add a disk to another domain, the spare should not be moved"
|
|
setupdevs 0 0 1 $platform
|
|
setupdevs 1 3 4 $platform
|
|
# create config file with 2 domains
|
|
createconfig a
|
|
createconfig domain-$platform"1" $platform spare 0 1 2
|
|
createconfig domain-$platform"2" $platform spare 3 4 5
|
|
monitor 0 1
|
|
mdadm --fail /dev/$v0 $dev1
|
|
mdadm -a /dev/$c1 $dev5
|
|
chksparemoved $c1 $c0 $dev5 n
|
|
tidyup
|
|
}
|
|
|
|
test4()
|
|
{
|
|
dsc "Test 4: One domain holds one container, fail a disk in domain, and add disk to a container not described by domain, move if metadata allows"
|
|
setupdevs 0 0 1 $platform
|
|
setupdevs 1 3 4 $platform
|
|
createconfig a
|
|
createconfig domain-$platform $platform spare 0 1 2
|
|
monitor 0 1
|
|
mdadm --fail /dev/$v0 $dev1
|
|
mdadm -a /dev/$c1 $dev5
|
|
unset shouldmove
|
|
[ "$platform" == "imsm" ] || shouldmove="n"
|
|
chksparemoved $c1 $c0 $dev5 $shouldmove
|
|
tidyup
|
|
}
|
|
|
|
test5()
|
|
{
|
|
dsc "Test 5: Two domains, two containers in each domain"
|
|
setupdevs 0 0 1 $platform
|
|
setupdevs 1 3 4 $platform
|
|
setupdevs 2 5 6 $platform
|
|
setupdevs 3 8 10 $platform
|
|
# 2 and 9 for spares
|
|
createconfig a
|
|
createconfig domain-$platform"1" $platform spare 0 1 2 3 4
|
|
createconfig domain-$platform"2" $platform spare 5 6 8 9 10
|
|
monitor 0 1 2 3
|
|
test5a
|
|
test5b
|
|
test5c
|
|
tidyup
|
|
}
|
|
|
|
test5a()
|
|
{
|
|
dsc "Test 5a: Two containers in each domain, add spare loop2 to domain1 and fail disk in the other domain, the spare should not be moved"
|
|
mdadm -a /dev/$c0 $dev2
|
|
mdadm --fail /dev/$v2 $dev5
|
|
chksparemoved $c0 $c2 $dev2 n
|
|
}
|
|
|
|
test5b()
|
|
{
|
|
dsc "Test 5b: Fail disk in the same domain but different container, spare loop2 should be moved"
|
|
mdadm --fail /dev/$v1 $dev3
|
|
chksparemoved $c0 $c1 $dev2
|
|
}
|
|
|
|
test5c()
|
|
{
|
|
dsc "Test 5c: Add spare loop9 to different container in domain with degraded array, spare should be moved"
|
|
mdadm -a /dev/$c3 $dev9
|
|
chksparemoved $c3 $c2 $dev9
|
|
}
|
|
|
|
test6()
|
|
{
|
|
dsc "Test 6: One domain has two containers, fail a disk in one container, there is a spare in other container too small to use for rebuild"
|
|
setupdevs 0 0 1 $platform
|
|
setupdevs 1 8 9 $platform
|
|
# all devices in one domain
|
|
createconfig a
|
|
createconfig domain-$platform $platform spare 0 1 2 8 9
|
|
monitor 0 1
|
|
mdadm -a /dev/$c0 $dev2
|
|
mdadm --fail /dev/$v1 $dev8
|
|
chksparemoved $c0 $c1 $dev2 n
|
|
tidyup
|
|
}
|
|
|
|
test7()
|
|
{
|
|
dsc "Test 7: One domain, add small spare to container, fail disk in array, spare not used, add suitable spare to other container, spare should be moved"
|
|
setupdevs 0 0 1 $platform
|
|
setupdevs 1 8 9 $platform
|
|
createconfig a
|
|
createconfig domain-$platform $platform spare 0 1 2 8 9 10
|
|
monitor 0 1
|
|
mdadm -a /dev/$c1 $dev2
|
|
mdadm --fail /dev/$v1 $dev8
|
|
mdadm -a /dev/$c0 $dev10
|
|
chksparemoved $c0 $c1 $dev10
|
|
tidyup
|
|
}
|
|
|
|
|
|
test7a()
|
|
{
|
|
dsc "Test 7a: Small spare in parent, suitable one in other container, $dev2 in $c1 is not in common domain"
|
|
setupdevs 0 0 1 $platform
|
|
setupdevs 1 8 9 $platform
|
|
#all $platform devices in one domain
|
|
createconfig a
|
|
createconfig domain-$platform"1" $platform spare 0 1 8 9 10
|
|
createconfig domain-$platform"2" $platform spare 2
|
|
monitor 0 1
|
|
mdadm -a /dev/$c1 $dev2
|
|
chkspare $c1 $dev2
|
|
mdadm --fail /dev/$v1 $dev8
|
|
mdadm -a /dev/$c0 $dev10
|
|
chksparemoved $c0 $c1 $dev10
|
|
tidyup
|
|
}
|
|
|
|
test8()
|
|
{
|
|
# ddf does not have getinfo_super_disks implemented so skip this test
|
|
return
|
|
dsc "Test 8: imsm and ddf - spare should not be migrated"
|
|
setupdevs 0 10 11 imsm
|
|
setupdevs 1 8 9 ddf
|
|
createconfig a
|
|
createconfig domain0 noplatform spare 8 9 10 11 12
|
|
monitor 0 1
|
|
mdadm -a /dev/$c1 $dev12
|
|
mdadm --fail /dev/$v0 $dev10
|
|
chksparemoved $c1 $c0 $dev12 n
|
|
tidyup
|
|
}
|
|
|
|
test9()
|
|
{
|
|
dsc "Test 9: imsm and native 1.2 - one domain, no metadata specified, spare should be moved"
|
|
setupdevs 0 10 11 imsm
|
|
setupdevs 1 8 9 1.2
|
|
createconfig a
|
|
createconfig domain0 noplatform spare 8 9 10 11 12
|
|
monitor 0 1
|
|
mdadm -a /dev/$c1 $dev12
|
|
mdadm --fail /dev/$v0 $dev10
|
|
chksparemoved $c1 $c0 $dev12
|
|
tidyup
|
|
}
|
|
|
|
test9a()
|
|
{
|
|
dsc "Test 9a: imsm and native 1.2 - spare in global domain, should be moved"
|
|
setupdevs 0 10 11 imsm
|
|
setupdevs 1 8 9 1.2
|
|
createconfig a
|
|
createconfig domain-global noplatform spare 8 9 10 11 12
|
|
createconfig domain-1.2 1.2 spare 8 9
|
|
createconfig domain-imsm imsm spare 10 11
|
|
monitor 0 1
|
|
mdadm -a /dev/$c1 $dev12
|
|
mdadm --fail /dev/$v0 $dev10
|
|
chksparemoved $c1 $c0 $dev12
|
|
tidyup
|
|
}
|
|
|
|
test10()
|
|
{
|
|
dsc "Test 10: Two arrays on the same devices in container"
|
|
setupdevs 0 0 1 $platform 10000
|
|
setupdevs 1 3 4 $platform
|
|
createconfig a
|
|
createconfig domain-$platform $platform spare 0 1 2 3 4 5
|
|
monitor 0 1
|
|
mdadm -a /dev/$c1 $dev2
|
|
mdadm --fail /dev/md/sub0_ $dev0
|
|
chksparemoved $c1 $c0 $dev2
|
|
if [ $failed -eq 0 ]; then
|
|
# now fail the spare and see if we get another one
|
|
mdadm --fail /dev/md/sub0_ $dev2
|
|
mdadm -a /dev/$c1 $dev5
|
|
chksparemoved $c1 $c0 $dev5
|
|
fi
|
|
tidyup
|
|
}
|
|
|
|
test11()
|
|
{
|
|
dsc "Test 11: Failed spare from other container should not be used"
|
|
setupdevs 0 0 1 $platform
|
|
setupdevs 1 3 4 $platform
|
|
createconfig a
|
|
createconfig domain-$platform $platform spare 0 1 2 3 4
|
|
monitor 0 1
|
|
mdadm -a /dev/$c1 $dev2
|
|
mdadm --fail /dev/$v1 $dev3
|
|
#wait until recovery finishes so no degraded array in c1
|
|
check wait
|
|
mdadm --fail /dev/$v0 $dev0
|
|
chksparemoved $c1 $c0 $dev3 n
|
|
tidyup
|
|
}
|
|
|
|
test12()
|
|
{
|
|
dsc "Test 12: Only one spare should be taken for rebuild, second not needed"
|
|
setupdevs 0 0 1 $platform
|
|
setupdevs 1 3 4 $platform
|
|
createconfig a
|
|
createconfig domain-$platform $platform spare 0 1 2 3 4 5
|
|
monitor 0 1
|
|
mdadm -a /dev/$c1 $dev2
|
|
mdadm -a /dev/$c1 $dev5
|
|
mdadm --fail /dev/$v0 $dev0
|
|
sleep $sleeptime
|
|
chkarray $dev2 n
|
|
sc1=$c
|
|
chkarray $dev5 n
|
|
sc2=$c
|
|
[ "$sc1" != "$sc2" ] || err "both spares in the same container $sc1"
|
|
tidyup
|
|
}
|
|
|
|
test13()
|
|
{
|
|
dsc "Test 13: Common domain, two containers, fail a disk in container, action is below spare, the spare should be moved regadless of action"
|
|
setupdevs 0 0 1 $platform
|
|
setupdevs 1 4 5 $platform
|
|
# same domain but different action on 4 5 6
|
|
createconfig a
|
|
createconfig domain-$platform $platform spare 0 1
|
|
createconfig domain-$platform $platform include 4 5 6
|
|
monitor 0 1
|
|
mdadm -a /dev/$c1 $dev6
|
|
mdadm --fail /dev/$v0 $dev0
|
|
chksparemoved $c1 $c0 $d6
|
|
tidyup
|
|
}
|
|
|
|
test14()
|
|
{
|
|
dsc "Test 14: One domain, small array on big disks, check if small spare is accepted"
|
|
setupdevs 0 8 9 $platform 10000 1
|
|
setupdevs 1 0 1 $platform
|
|
createconfig a
|
|
createconfig domain-$platform $platform spare 0 1 2 8 9
|
|
monitor 0 1
|
|
mdadm -a /dev/$c1 $dev2
|
|
mdadm --fail /dev/$v0 $dev9
|
|
chksparemoved $c1 $c0 $d2
|
|
tidyup
|
|
}
|
|
|
|
test15()
|
|
{
|
|
dsc "Test 15: spare in global domain for $platform metadata, should be moved"
|
|
# this is like 9a but only one metadata used
|
|
setupdevs 0 10 11 $platform
|
|
setupdevs 1 8 9 $platform
|
|
createconfig a
|
|
createconfig domain-global $platform spare 8 9 10 11 12
|
|
createconfig domain-1 $platform spare 8 9
|
|
createconfig domain-2 $platform spare 10 11
|
|
monitor 0 1
|
|
mdadm -a /dev/$c1 $dev12
|
|
mdadm --fail /dev/$v0 $dev10
|
|
chksparemoved $c1 $c0 $dev12
|
|
tidyup
|
|
}
|
|
|
|
try()
|
|
{
|
|
test0
|
|
test0a
|
|
test1
|
|
test1a
|
|
test2
|
|
test3
|
|
test4
|
|
test5
|
|
test6
|
|
if [ "$platform" != "1.2" ]; then
|
|
# this is because we can't have a small spare added to native array
|
|
test7
|
|
test7a
|
|
fi
|
|
test8
|
|
test9
|
|
test9a
|
|
if [ "$platform" != "1.2" ]; then
|
|
# we can't create two subarrays on the same devices for native (without
|
|
# partitions)
|
|
test10
|
|
fi
|
|
test11
|
|
test12
|
|
test13
|
|
test14
|
|
test15
|
|
}
|
|
|
|
try_failed()
|
|
{
|
|
platform="1.2"
|
|
scan="no"
|
|
test5
|
|
test9
|
|
test13
|
|
scan="yes"
|
|
test9
|
|
}
|
|
|
|
#try_failed
|
|
|
|
for scan in no yes; do
|
|
for platform in 1.2 imsm; do
|
|
try
|
|
done
|
|
done
|
|
|
|
[ $listfailed == "no" ] || [ -z $flist ] || echo -e "\n FAILED TESTS: $flist"
|
|
|
|
#cat $targetdir/log
|
|
rm -f /dev/disk/by-path/loop*
|