From 4182428d60496b7fe61f0599156f871e3cd63f89 Mon Sep 17 00:00:00 2001 From: "Brian C. Lane" Date: Fri, 7 Aug 2015 11:43:17 -0700 Subject: [PATCH 34/35] tests: Use wait_for_dev_to_ functions Recent changes to udev have made some long-standing problems appear more frequently. udev executes various actions when changes are made to devices. Sometimes this can result in device nodes not appearing immediately. Other times it can result in EBUSY being returned. This patch only addresses devices that are slow to appear/disappear. It is best to use the wait_for_dev_to_appear_ and wait_for_dev_to_disappear_ functions than to test for existance. These will loop and wait for up to 2 seconds for it to appear. This also changes t9041 to fail if mkfs doesn't work since using skip here may hide cases when the device node doesn't appear. Related: rhbz#1245144 --- tests/t1100-busy-label.sh | 10 ++-------- tests/t6001-psep.sh | 4 ++-- tests/t6002-dm-many-partitions.sh | 6 ++---- tests/t6004-dm-512b-sectors.sh | 1 + tests/t6100-mdraid-partitions.sh | 5 +++-- tests/t9041-undetected-in-use-16th-partition.sh | 2 +- 6 files changed, 11 insertions(+), 17 deletions(-) diff --git a/tests/t1100-busy-label.sh b/tests/t1100-busy-label.sh index 9e371da..93229a7 100755 --- a/tests/t1100-busy-label.sh +++ b/tests/t1100-busy-label.sh @@ -27,22 +27,16 @@ dev=$(cat dev-name) parted -s "$dev" mklabel msdos mkpart primary fat32 1 40 > out 2>&1 || fail=1 compare /dev/null out || fail=1 -mkfs.vfat ${dev}1 || skip_ "mkfs.vfat failed" +wait_for_dev_to_appear_ ${dev}1 || fail=1 +mkfs.vfat ${dev}1 || fail=1 mount_point="`pwd`/mnt" # Be sure to unmount upon interrupt, failure, etc. cleanup_fn_() { umount "${dev}1" > /dev/null 2>&1; } -# There's a race condition here: on udev-based systems, the partition#1 -# device, ${dev}1 (i.e., /dev/sdd1) is not created immediately, and -# without some delay, this mount command would fail. Using a flash card -# as $dev, the loop below typically iterates 7-20 times. - # create mount point dir. and mount the just-created partition on it mkdir $mount_point || fail=1 -i=0; while :; do test -e "${dev}1" && break; test $i = 90 && break; - i=$(expr $i + 1); done; mount "${dev}1" $mount_point || fail=1 # now that a partition is mounted, mklabel attempt must fail diff --git a/tests/t6001-psep.sh b/tests/t6001-psep.sh index 0c1ab99..b747732 100644 --- a/tests/t6001-psep.sh +++ b/tests/t6001-psep.sh @@ -55,7 +55,7 @@ parted -s $dev mklabel msdos mkpart primary fat32 1m 5m > out 2>&1 || fail=1 compare /dev/null out || fail=1 #make sure device name is correct -test -e ${dev}p1 || fail=1 +wait_for_dev_to_appear_ ${dev}p1 || fail=1 #repeat on name not ending in a digit # setup: create a mapping @@ -67,7 +67,7 @@ parted -s $dev mklabel msdos mkpart primary fat32 1m 5m > out 2>&1 || fail=1 compare /dev/null out || fail=1 #make sure device name is correct -test -e ${dev}1 || fail=1 +wait_for_dev_to_appear_ ${dev}1 || fail=1 if [ -n "$fail" ]; then ls /dev/mapper diff --git a/tests/t6002-dm-many-partitions.sh b/tests/t6002-dm-many-partitions.sh index 4d08e72..247c9ee 100755 --- a/tests/t6002-dm-many-partitions.sh +++ b/tests/t6002-dm-many-partitions.sh @@ -49,10 +49,8 @@ parted -m -a min -s /dev/mapper/$dm_name mklabel gpt $cmd > /dev/null 2>&1 || fa # Make sure all the partitions appeared under /dev/mapper/ for ((i=1; i<=$n_partitions; i+=1)); do - if [ ! -e "/dev/mapper/${dm_name}p$i" ]; then - fail=1 - break - fi + wait_for_dev_to_appear_ "/dev/mapper/${dm_name}p$i" || { fail=1; break; } + # remove the partitions as we go, otherwise cleanup won't work. dmsetup remove /dev/mapper/${dm_name}p$i done diff --git a/tests/t6004-dm-512b-sectors.sh b/tests/t6004-dm-512b-sectors.sh index 31abba9..c3045af 100644 --- a/tests/t6004-dm-512b-sectors.sh +++ b/tests/t6004-dm-512b-sectors.sh @@ -60,6 +60,7 @@ dev="/dev/mapper/$linear_" # Create msdos partition table with a partition from 1MiB to 100MiB parted -s $dev mklabel msdos mkpart primary ext2 1MiB 101MiB > out 2>&1 || fail=1 compare /dev/null out || fail=1 +wait_for_dev_to_appear_ ${dev}1 || fail=1 # The size of the partition should be 100MiB, or 204800 512b sectors p1_size=$(blockdev --getsz ${dev}1) || framework_failure diff --git a/tests/t6100-mdraid-partitions.sh b/tests/t6100-mdraid-partitions.sh index aedf69b..d7e7d6a 100755 --- a/tests/t6100-mdraid-partitions.sh +++ b/tests/t6100-mdraid-partitions.sh @@ -54,13 +54,14 @@ parted -s $md_dev mklabel gpt \ compare /dev/null out || fail=1 # Verify that kernel has been informed about the second device. -grep "${md_name}p2" /proc/partitions || { fail=1; cat /proc/partitions; } +wait_for_dev_to_appear_ ${md_dev}p2 || { fail=1; cat /proc/partitions; } # Remove partitions from the raid device. parted -s $md_dev rm 2 rm 1 > out 2>&1 || fail=1 compare /dev/null out || fail=1 # Verify that kernel has been informed about those removals. -grep "${md_name}p[12]" /proc/partitions && { fail=1; cat /proc/partitions; } +wait_for_dev_to_disappear_ ${md_dev}p1 2 || { fail=1; cat /proc/partitions; } +wait_for_dev_to_disappear_ ${md_dev}p2 2 || { fail=1; cat /proc/partitions; } Exit $fail diff --git a/tests/t9041-undetected-in-use-16th-partition.sh b/tests/t9041-undetected-in-use-16th-partition.sh index 6ddc7d8..0b22b0e 100644 --- a/tests/t9041-undetected-in-use-16th-partition.sh +++ b/tests/t9041-undetected-in-use-16th-partition.sh @@ -72,7 +72,7 @@ wait_for_dev_to_appear_ ${scsi_dev}16 || fail_ ${scsi_dev}16 did not appear partitions="${scsi_dev}14 ${scsi_dev}15 ${scsi_dev}16" for i in $partitions; do - mkfs.ext3 $i || skip_ mkfs.ext3 $i failed + mkfs.ext3 $i || fail=1 done # be sure to unmount upon interrupt, failure, etc. -- 2.4.3