[lvm-devel] dev-next - tests: new aux mdadm_create

David Teigland teigland at sourceware.org
Wed Mar 31 21:48:38 UTC 2021


Gitweb:        https://sourceware.org/git/?p=lvm2.git;a=commitdiff;h=ada99f939fe24e23994244fdbe960014b355fd44
Commit:        ada99f939fe24e23994244fdbe960014b355fd44
Parent:        77432ee13742d09af5e8b1f8813d65bda3556a1d
Author:        Zdenek Kabelac <zkabelac at redhat.com>
AuthorDate:    Mon Mar 22 18:54:54 2021 +0100
Committer:     Zdenek Kabelac <zkabelac at redhat.com>
CommitterDate: Mon Mar 22 22:42:52 2021 +0100

tests: new aux mdadm_create

Add generic wrapper for mdadm --create which takes
normal 'mdadm' args - but allows us to handle differences of
mdadm usage across various version of mdadm tool.

Resulting MD device is availalble in  $(< MD_DEV).

Automatic cleaning is made through   cleanup_md_dev

Calling of mdadm_create cleans previous MD dev if it exists.
---
 test/lib/aux.sh | 91 ++++++++++++++++++++++++++++++++++++++++++++++++++-------
 1 file changed, 81 insertions(+), 10 deletions(-)

diff --git a/test/lib/aux.sh b/test/lib/aux.sh
index ae173b8da..2bc3da2c9 100644
--- a/test/lib/aux.sh
+++ b/test/lib/aux.sh
@@ -776,8 +776,80 @@ prepare_md_dev() {
 	printf "%s\n" "${@:4}" > MD_DEVICES
 }
 
+mdadm_create() {
+	local mddev
+	local maj=
+	local mdname="md_lvm_test0"
+	local mddir="md/"
+	local mddevdir="$DM_DEV_DIR/$mddir"
+
+	maj=$(mdadm --version 2>&1) || skip "mdadm tool is missing!"
+
+	cleanup_md_dev
+	rm -f debug.log strace.log
+
+	# Have MD use a non-standard name to avoid colliding with an existing MD device
+	# - mdadm >= 3.0 requires that non-standard device names be in /dev/md/
+	# - newer mdadm _completely_ defers to udev to create the associated device node
+	maj=${maj##*- v}
+	maj=${maj%%.*}
+	[ "$maj" -ge 3 ] || mddir=""
+
+	mddev="/dev/${mddir}$mdname"
+	name=$1
+
+	mdadm --create "$mddev" "$@" || {
+		# Some older 'mdadm' version managed to open and close devices internaly
+		# and reporting non-exclusive access on such device
+		# let's just skip the test if this happens.
+		# Note: It's pretty complex to get rid of consequences
+		#       the following sequence avoid leaks on f19
+		# TODO: maybe try here to recreate few times....
+		mdadm --stop "$mddev" || true
+		udev_wait
+		while  [ "$#" -ne 0 ] ; do
+			case "$1" in
+			*"$PREFIX"*) mdadm --zero-superblock "$1" || true ;;
+			esac
+			shift
+		done
+		udev_wait
+		skip "Test skipped, unreliable mdadm detected!"
+	}
+
+	for i in {10..0} ; do
+		test -e "$mddev" && break
+		echo "Waiting for $mddev."
+		sleep .5
+	done
+
+	# LVM/DM will see this device
+	case "$DM_DEV_DIR" in
+	"/dev") readlink -f "$mddev" > MD_DEV_PV ;;
+	*)	mkdir -p "$mddevdir"
+		rm -f "$mddevdir/$mdname"
+		cp -LR "$mddev" "$mddevdir"
+		echo "${mddevdir}${mdname}" > MD_DEV_PV ;;
+	esac
+
+	mddev=$(readlink -f "$mddev")
+	test -b "$mddev" || skip "mdadm has not created device!"
+	echo "$mddev" > MD_DEV
+	rm -f MD_DEVICES
+	while  [ "$#" -ne 0 ] ; do
+		case "$1" in
+		*"$PREFIX"*) echo "$1" >> MD_DEVICES ;;
+		esac
+		shift
+	done
+}
+
 cleanup_md_dev() {
 	test -f MD_DEV || return 0
+	grep -q "$(basename $(< MD_DEV) )" /proc/mdstat || {
+		rm -f MD_DEV
+		return 0
+	}
 
 	local IFS=$IFS_NL
 	local dev
@@ -785,21 +857,20 @@ cleanup_md_dev() {
 	local mddev_pv
 	mddev=$(< MD_DEV)
 	mddev_pv=$(< MD_DEV_PV)
-	udev_wait
-	mdadm --stop "$mddev" || true
-	udev_wait  # wait till events are process, not zeroing to early
+
+	for i in {10..0} ; do
+		udev_wait
+		mdadm --stop "$mddev" || true
+		udev_wait  # wait till events are process, not zeroing to early
+		grep -q "$(basename $(< MD_DEV) )" /proc/mdstat || break
+		sleep .1
+		echo "$mddev is still present, stopping again"
+	done
 	test "$DM_DEV_DIR" != "/dev" && rm -rf "${mddev_pv%/*}"
 	for dev in $(< MD_DEVICES); do
 		mdadm --zero-superblock "$dev" || true
 	done
 	udev_wait
-	if [ -b "$mddev" ]; then
-		# mdadm doesn't always cleanup the device node
-		# sleeps offer hack to defeat: 'md: md127 still in use'
-		# see: https://bugzilla.redhat.com/show_bug.cgi?id=509908#c25
-		sleep 2
-		rm -f "$mddev"
-	fi
 	rm -f MD_DEV MD_DEVICES MD_DEV_PV
 }
 




More information about the lvm-devel mailing list