1
0
mirror of git://sourceware.org/git/lvm2.git synced 2025-02-25 21:57:45 +03:00

tests: try unfreezeing raids

With problematic kernels raid devices can be occasionaly left with
'frozen' status - try to 'unfreeze' them with idle message on teardown.

Also replace couple greps with 'built-in' dmsetup --select feature.

Note: dmsetup --select  currently reports 'No devices found' on stdout
and return success - looks like a bug to fix.
This commit is contained in:
Zdenek Kabelac 2018-03-08 17:32:47 +01:00
parent b1ace8ce19
commit 90512910e5
2 changed files with 37 additions and 22 deletions

View File

@ -396,15 +396,23 @@ teardown_devs_prefixed() {
local prefix=$1
local stray=${2:-0}
local IFS=$IFS_NL
local once=1
local dm
rm -rf "$TESTDIR/dev/$prefix*"
# Send idle message to frozen raids (with hope to unfreeze them)
for dm in $(dm_status | egrep "$prefix.*raid.*frozen"); do
echo "## unfreezing: dmsetup message \"${dm%:*}\""
dmsetup message "${dm%:*}" 0 "idle" &
done
# Resume suspended devices first
for dm in $(dm_info suspended,name | grep "^Suspended:.*$prefix"); do
echo "dmsetup resume \"${dm#Suspended:}\""
dmsetup clear "${dm#Suspended:}"
dmsetup resume "${dm#Suspended:}" &
for dm in $(dm_info name -S "name=~$PREFIX&&suspended=Suspended"); do
test "$dm" != "No devices found" || break
echo "## resuming: dmsetup resume \"$dm\""
dmsetup clear "$dm"
dmsetup resume "$dm" &
done
wait
@ -425,37 +433,40 @@ teardown_devs_prefixed() {
# 2nd. loop is trying --force removal which can possibly 'unstuck' some bloked operations
for i in 0 1; do
local num_remaining_devs=999999
local num_devs=0
test "$i" = 1 && test "$stray" = 0 && break # no stray device removal
while :; do
local cnt
local sortby="name"
local need_udev_wait=0
local num_devs=0
# HACK: sort also by minors - so we try to close 'possibly later' created device first
test "$i" = 0 || sortby="-minor"
# when nothing left for removal, escape both loops...
dm_info name,open --separator ' ' --sort open,"$sortby" | grep "$prefix" > out || break 2
num_devs=$(wc -l < out)
test "$num_devs" -lt "$num_remaining_devs" || break # not managed to reduce table size anymore
test "$i" = 0 || echo "## removing $num_devs stray mapped devices with names beginning with $prefix: "
while IFS=' ' read -r dm cnt; do
for dm in $(dm_info name,open --separator ';' --nameprefixes --sort open,"$sortby" -S "name=~$prefix") ; do
test "$dm" != "No devices found" || break 2
eval "$dm"
if test "$i" = 0; then
test "$cnt" -eq 0 || break # stop loop with 1st. opened device
dmsetup remove "$dm" &>/dev/null || touch REMOVE_FAILED &
if test "$once" = 1 ; then
once=0
echo "## removing stray mapped devices with names beginning with $prefix: "
fi
test "$DM_OPEN" = 0 || break # stop loop with 1st. opened device
dmsetup remove "$DM_NAME" &>/dev/null || touch REMOVE_FAILED &
else
dmsetup remove -f "$dm" || true
dmsetup remove -f "$DM_NAME" || true
fi
need_udev_wait=1
done < out
test "$need_udev_wait" -eq 1 || break
num_devs=$(( num_devs + 1 ))
done
test "$i" = 0 || break
test "$num_devs" -gt 0 || break
udev_wait
wait
num_remaining_devs=$num_devs
done # looping till there are some removed devicess
done # looping till there are some removed devices
done
}

View File

@ -228,6 +228,10 @@ dm_info() {
should dmsetup info --noheadings -c -o "$@"
}
dm_status() {
should dmsetup status --noheadings "$@"
}
dm_table() {
should dmsetup table "$@"
}