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:
parent
b1ace8ce19
commit
90512910e5
@ -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
|
||||
}
|
||||
|
||||
|
@ -228,6 +228,10 @@ dm_info() {
|
||||
should dmsetup info --noheadings -c -o "$@"
|
||||
}
|
||||
|
||||
dm_status() {
|
||||
should dmsetup status --noheadings "$@"
|
||||
}
|
||||
|
||||
dm_table() {
|
||||
should dmsetup table "$@"
|
||||
}
|
||||
|
Loading…
x
Reference in New Issue
Block a user