From 9deb8c7dfd9b119884543416e4c681cbe21d97b2 Mon Sep 17 00:00:00 2001 From: Karel Zak Date: Wed, 6 Dec 2017 14:21:38 +0100 Subject: tests: add lock on shared resources (e.g. scsi_debug) The patch enables flock for scsi_debug to avoid collision between tests. The patch also adds ./run.sh --nolocks to disable this feature. Signed-off-by: Karel Zak --- tests/functions.sh | 27 +++++++++++++++++++++++++++ 1 file changed, 27 insertions(+) (limited to 'tests/functions.sh') diff --git a/tests/functions.sh b/tests/functions.sh index 5b9b61c05..0409b6283 100644 --- a/tests/functions.sh +++ b/tests/functions.sh @@ -271,6 +271,9 @@ function ts_init_env { TS_OUTDIR="$top_builddir/tests/output/$TS_COMPONENT" TS_DIFFDIR="$top_builddir/tests/diff/$TS_COMPONENT" + TS_NOLOCKS=$(ts_has_option "nolocks" "$*") + TS_LOCKDIR="$top_builddir/tests/output" + ts_init_core_env TS_VERBOSE=$(ts_has_option "verbose" "$*") @@ -673,11 +676,34 @@ function ts_fdisk_clean { $TS_OUTPUT } + +function ts_lock { + local resource="$1" + local lockfile="${TS_LOCKDIR}/${resource}.lock" + + if [ "$TS_NOLOCKS" == "yes" ]; then + return 0 + fi + + # Don't lock if flock(1) is missing + type "flock" >/dev/null 2>&1 || return 1 + + eval "exec 200>$lockfile" + flock --exclusive --timeout 30 200 || ts_skip "failed to lock $resource" +} + +# Note that flock(2) lock is released on FD close. +function ts_unlock { + 200<&- +} + function ts_scsi_debug_init { local devname local t TS_DEVICE="none" + ts_lock "scsi_debug" + # dry run is not really reliable, real modprobe may still fail modprobe --dry-run --quiet scsi_debug &>/dev/null \ || ts_skip "missing scsi_debug module (dry-run)" @@ -746,6 +772,7 @@ function ts_scsi_debug_rmmod { # TODO unset TS_DEVICE, check that nobody uses it later, e.g. ts_fdisk_clean + ts_unlock "scsi_debug" return 0 } -- cgit v1.2.3-55-g7522