From dbb716f1bb09b62dcdbdae5741510afb8db35d41 Mon Sep 17 00:00:00 2001 From: Zach Brown Date: Mon, 1 Feb 2021 09:26:46 -0800 Subject: [PATCH] Update tests for quorum slots Update the tests to deal with the mkfs and mount changes for the specifically configured quorum slots. Signed-off-by: Zach Brown --- tests/funcs/fs.sh | 13 +++++++++++ tests/run-tests.sh | 27 ++++++++++++++++----- tests/tests/mount-unmount-race.sh | 39 ++++++++++++++++++------------- 3 files changed, 57 insertions(+), 22 deletions(-) diff --git a/tests/funcs/fs.sh b/tests/funcs/fs.sh index 160f00df..47230898 100644 --- a/tests/funcs/fs.sh +++ b/tests/funcs/fs.sh @@ -99,6 +99,19 @@ t_first_client_nr() t_fail "t_first_client_nr didn't find any clients" } +# +# The number of quorum members needed to form a majority to start the +# server. +# +t_majority_count() +{ + if [ "$T_QUORUM" -lt 3 ]; then + echo 1 + else + echo $(((T_QUORUM / 2) + 1)) + fi +} + t_mount() { local nr="$1" diff --git a/tests/run-tests.sh b/tests/run-tests.sh index f2e5983f..e8cedd9d 100755 --- a/tests/run-tests.sh +++ b/tests/run-tests.sh @@ -52,11 +52,11 @@ $(basename $0) options: | the file system to be tested. Will be clobbered by -m mkfs. -m | Run mkfs on the device before mounting and running | tests. Implies unmounting existing mounts first. - -n | The number of devices and mounts to test. + -n | The number of devices and mounts to test. -P | Enable trace_printk. -p | Exit script after preparing mounts only, don't run tests. - -q | Specify the quorum count needed to mount. This is - | used when running mkfs and is needed by a few tests. + -q | The first mounts will be quorum members. Must be + | at least 1 and no greater than -n number of mounts. -r | Specify the directory in which to store results of | test runs. The directory will be created if it doesn't | exist. Previous results will be deleted as each test runs. @@ -199,7 +199,6 @@ test -e "$T_EX_META_DEV" || die "extra meta device -f '$T_EX_META_DEV' doesn't e test -n "$T_EX_DATA_DEV" || die "must specify -e extra data device" test -e "$T_EX_DATA_DEV" || die "extra data device -e '$T_EX_DATA_DEV' doesn't exist" -test -n "$T_MKFS" -a -z "$T_QUORUM" && die "mkfs (-m) requires quorum (-q)" test -n "$T_RESULTS" || die "must specify -r results dir" test -n "$T_XFSTESTS_REPO" -a -z "$T_XFSTESTS_BRANCH" -a -z "$T_SKIP_CHECKOUT" && \ die "-X xfstests repo requires -x xfstests branch" @@ -209,6 +208,12 @@ test -n "$T_XFSTESTS_BRANCH" -a -z "$T_XFSTESTS_REPO" -a -z "$T_SKIP_CHECKOUT" & test -n "$T_NR_MOUNTS" || die "must specify -n nr mounts" test "$T_NR_MOUNTS" -ge 1 -a "$T_NR_MOUNTS" -le 8 || \ die "-n nr mounts must be >= 1 and <= 8" +test -n "$T_QUORUM" || \ + die "must specify -q number of mounts that are quorum members" +test "$T_QUORUM" -ge "1" || \ + die "-q quorum mmembers must be at least 1" +test "$T_QUORUM" -le "$T_NR_MOUNTS" || \ + die "-q quorum mmembers must not be greater than -n mounts" # top level paths T_KMOD=$(realpath "$(dirname $0)/../kmod") @@ -307,8 +312,14 @@ if [ -n "$T_UNMOUNT" ]; then unmount_all fi +quo="" if [ -n "$T_MKFS" ]; then - cmd scoutfs mkfs -Q "$T_QUORUM" "$T_META_DEVICE" "$T_DATA_DEVICE" -f + for i in $(seq -0 $((T_QUORUM - 1))); do + quo="$quo -Q $i,127.0.0.1,$((42000 + i))" + done + + msg "making new filesystem with $T_QUORUM quorum members" + cmd scoutfs mkfs -f $quo "$T_META_DEVICE" "$T_DATA_DEVICE" fi if [ -n "$T_INSMOD" ]; then @@ -365,8 +376,12 @@ for i in $(seq 0 $((T_NR_MOUNTS - 1))); do dir="/mnt/test.$i" test -d "$dir" || cmd mkdir -p "$dir" + opts="-o metadev_path=$meta_dev" + if [ "$i" -lt "$T_QUORUM" ]; then + opts="$opts,quorum_slot_nr=$i" + fi + msg "mounting $meta_dev|$data_dev on $dir" - opts="-o server_addr=127.0.0.1,metadev_path=$meta_dev" cmd mount -t scoutfs $opts "$data_dev" "$dir" & p="$!" diff --git a/tests/tests/mount-unmount-race.sh b/tests/tests/mount-unmount-race.sh index 0f445cb1..1951e1ea 100644 --- a/tests/tests/mount-unmount-race.sh +++ b/tests/tests/mount-unmount-race.sh @@ -4,25 +4,23 @@ # At the start of the test all mounts are mounted. Each iteration # randomly decides to change each mount or to leave it alone. # -# They create dirty items before unmounting to encourage compaction -# while unmounting +# Each iteration create dirty items across the mounts randomly, giving +# unmount some work to do. # # For this test to be meaningful it needs multiple mounts beyond the -# quorum set which can be racing to mount and unmount. A reasonable -# config would be 5 mounts with 3 quorum. But the test will run with -# whatever count it finds. +# quorum majority which can be racing to mount and unmount. A +# reasonable config would be 5 mounts with 3 quorum members. But the +# test will run with whatever count it finds. # -# This assumes that all the mounts are configured as voting servers. We -# could update it to be more clever and know that it can always safely -# unmount mounts that aren't configured as servers. +# The test assumes that the first mounts are the quorum members. # -# nothing to do if we can't unmount -test "$T_NR_MOUNTS" == "$T_QUORUM" && \ - t_skip "only quorum members mounted, can't unmount" +majority_nr=$(t_majority_count) +quorum_nr=$T_QUORUM -nr_mounted=$T_NR_MOUNTS -nr_quorum=$T_QUORUM +cur_quorum=$quorum_nr +test "$cur_quorum" == "$majority_nr" && \ + t_skip "all quorum members make up majority, need more mounts to unmount" echo "== create per mount files" for i in $(t_fs_nrs); do @@ -55,19 +53,28 @@ while [ "$SECONDS" -lt "$END" ]; do fi if [ "${mounted[$i]}" == 1 ]; then - if [ "$nr_mounted" -gt "$nr_quorum" ]; then + # + # can always unmount non-quorum mounts, + # can only unmount quorum members beyond majority + # + if [ "$i" -ge "$quorum_nr" -o \ + "$cur_quorum" -gt "$majority_nr" ]; then t_umount $i & pid=$! pids="$pids $pid" mounted[$i]=0 - (( nr_mounted-- )) + if [ "$i" -lt "$quorum_nr" ]; then + (( cur_quorum-- )) + fi fi else t_mount $i & pid=$! pids="$pids $pid" mounted[$i]=1 - (( nr_mounted++ )) + if [ "$i" -lt "$quorum_nr" ]; then + (( cur_quorum++ )) + fi fi done