Re: [PATCH v2] fstests: faster group file creation

[Date Prev] [Date Next] [Thread Prev] [Thread Next] [Date Index] [Thread Index]



On Fri, May 06, 2022 at 03:10:17PM +1000, Dave Chinner wrote:
> From: Dave Chinner <dchinner@xxxxxxxxxx>
> 
> We don't need to execute every test just to check it's groups are
> valid. Just grab all the groups with grep, pull out the unique ones,
> then check them.
> 
> This also avoids the problem of editor swap files being present in
> the test directory and breaking the build because they are not
> executable.
> 
> Building on a clean, already built tree so it only builds the
> group lists:
> 
> $ time make
> ....
> Building udf
>  [GROUP] /home/dave/src/xfstests-dev/tests/udf/group.list
> Building xfs
>  [GROUP] /home/dave/src/xfstests-dev/tests/xfs/group.list
> 
> real    0m36.917s
> user    0m15.032s
> sys     0m26.219s
> $
> 
> Patched:
> 
> $ time make
> ....
> Building udf
>  [GROUP] /home/dave/src/xfstests-dev/tests/udf/group.list
> Building xfs
>  [GROUP] /home/dave/src/xfstests-dev/tests/xfs/group.list
> groups "frobnozzle" not mentioned in documentation.
> gmake[3]: *** [../../include/buildgrouplist:8: group.list] Error 1
> gmake[2]: *** [../include/buildrules:31: xfs] Error 2
> gmake[1]: *** [include/buildrules:31: tests] Error 2
> make: *** [Makefile:51: default] Error 2
> 
> real    0m1.751s
> user    0m0.863s
> sys     0m1.067s
> 
> $
> 
> Just a little bit faster, and as you can see that it still detects
> groups that are not documented. There was also an open .001.swp file
> in the XFS directory and that doesn't throw a failure anymore,
> either.
> 
> Signed-off-by: Dave Chinner <dchinner@xxxxxxxxxx>
> ---

Looks good to me. It's much faster than before, especially when rebuild for
small changes.

Reviewed-by: Zorro Lang <zlang@xxxxxxxxxx>

> V2: don't optimise away the per-test group listing in the output
> file that check relies on for '-g <group>' matching.
> 
>  common/preamble   | 28 -----------------------
>  tools/mkgroupfile | 66 ++++++++++++++++++++++++++++++++++++++-----------------
>  2 files changed, 46 insertions(+), 48 deletions(-)
> 
> diff --git a/common/preamble b/common/preamble
> index 64d79385..f4a405ac 100644
> --- a/common/preamble
> +++ b/common/preamble
> @@ -23,26 +23,6 @@ _register_cleanup()
>  	trap "${cleanup}exit \$status" EXIT HUP INT QUIT TERM $*
>  }
>  
> -# Make sure each group is in the documentation file.
> -_check_groups() {
> -	test -n "$GROUPNAME_DOC_FILE" || return 0
> -
> -	local testname="$(echo "$0" | sed -e 's/^.*tests\///g')"
> -	declare -a missing=()
> -
> -	for group in "$@"; do
> -		if ! grep -q "^${group}[[:space:]]" "$GROUPNAME_DOC_FILE"; then
> -			missing+=("\"${group}\"")
> -		fi
> -	done
> -	test "${#missing}" -eq 0 && return 0
> -
> -	local suffix=
> -	test "${#missing}" -gt 1 && suffix="s"
> -	echo "$testname: group$suffix ${missing[@]} not mentioned in documentation." 1>&2
> -	return 1
> -}
> -
>  # Prepare to run a fstest by initializing the required global variables to
>  # their defaults, sourcing common functions, registering a cleanup function,
>  # and removing the $seqres.full file.
> @@ -59,14 +39,6 @@ _begin_fstest()
>  
>  	seq=`basename $0`
>  
> -	# If we're only running the test to generate a group.list file,
> -	# spit out the group data and exit.
> -	if [ -n "$GENERATE_GROUPS" ]; then
> -		_check_groups "$@" || exit 1
> -		echo "$seq $@"
> -		exit 0
> -	fi
> -
>  	seqres=$RESULT_DIR/$seq
>  	echo "QA output created by $seq"
>  
> diff --git a/tools/mkgroupfile b/tools/mkgroupfile
> index 3844e57d..24435898 100755
> --- a/tools/mkgroupfile
> +++ b/tools/mkgroupfile
> @@ -11,40 +11,64 @@ fi
>  
>  test_dir="$PWD"
>  groupfile="$1"
> +new_groups="/tmp/groups.$$"
>  GROUPNAME_DOC_FILE="$(readlink -m ../../doc/group-names.txt)"
> -export GROUPNAME_DOC_FILE
>  
>  if [ ! -x ../../check ]; then
>  	echo "$0: Run this from tests/XXX/."
>  	exit 1
>  fi
>  
> -cleanup() {
> -	test -z "$groupfile" && return
> -	test -z "$ngroupfile" && return
> -
> -	if [ $ret -eq 0 ]; then
> -		mv -f "$ngroupfile" "$groupfile"
> -	else
> -		rm -f "$ngroupfile"
> -	fi
> +cleanup()
> +{
> +	rm -f $new_groups.check
> +	rm -f $new_groups
>  }
>  
>  ret=1	# trigger cleanup of temporary files unless we succeed
>  trap 'cleanup; exit $ret' EXIT INT TERM QUIT
>  
> +# Make sure each group is in the documentation file.
> +_check_groups() {
> +	test -n "$GROUPNAME_DOC_FILE" || return 0
> +
> +	local groups="$1"
> +	declare -a missing=()
> +
> +	for group in `grep -v '#' $groups`; do
> +		if ! grep -q "^${group}[[:space:]]" "$GROUPNAME_DOC_FILE"; then
> +			missing+=("\"${group}\"")
> +		fi
> +	done
> +	test "${#missing}" -eq 0 && return 0
> +
> +	local suffix=
> +	test "${#missing}" -gt 1 && suffix="s"
> +	echo "group$suffix ${missing[@]} not mentioned in documentation." 1>&2
> +	ret=1
> +	exit 1
> +}
> +
>  generate_groupfile() {
> -	cat << ENDL
> +	cat << ENDL > $new_groups
>  # QA groups control file, automatically generated.
>  # See _begin_fstest in each test for details.
>  
>  ENDL
> +
>  	cd ../../
> -	export GENERATE_GROUPS=yes
> -	grep -R -l "^_begin_fstest" "$test_dir/" 2>/dev/null | while read testfile; do
> -		test -x "$testfile" && "$testfile" || return 1
> -	done | sort -g
> -	ret="${PIPESTATUS[1]}"
> +
> +	# Aggregate the groups each test belongs to for the group file
> +	grep -I -R "^_begin_fstest" $test_dir/ | \
> +		sed -e 's/^.*\/\([0-9]*\):_begin_fstest/\1/' >> $new_groups
> +
> +	# Create the list of unique groups for existence checking
> +	grep -I -R "^_begin_fstest" $test_dir/ | \
> +		sed -e 's/^.*_begin_fstest //' -e 's/ /\n/g' | \
> +		sort -u > $new_groups.check
> +
> +	_check_groups $new_groups.check
> +
>  	cd "$test_dir"
>  }
>  
> @@ -52,10 +76,12 @@ if [ -z "$groupfile" ] || [ "$groupfile" = "-" ]; then
>  	# Dump the group file to stdout and exit
>  	unset groupfile
>  	generate_groupfile
> +	cat $new_groups
>  else
>  	# Otherwise, write the group file to disk somewhere.
> -	ngroupfile="${groupfile}.new"
> -	rm -f "$ngroupfile"
> -	generate_groupfile >> "$ngroupfile"
> -	# let cleanup rename or delete ngroupfile
> +	generate_groupfile
> +	mv -f "$new_groups" "$groupfile"
>  fi
> +
> +# Success!
> +ret=0
> 




[Index of Archives]     [Linux Filesystems Development]     [Linux NFS]     [Linux NILFS]     [Linux USB Devel]     [Linux Audio Users]     [Yosemite News]     [Linux Kernel]     [Linux SCSI]

  Powered by Linux