fstests: faster group file creation
authorDave Chinner <dchinner@redhat.com>
Fri, 6 May 2022 05:10:17 +0000 (15:10 +1000)
committerZorro Lang <zlang@kernel.org>
Sat, 7 May 2022 07:16:21 +0000 (15:16 +0800)
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@redhat.com>
Reviewed-by: Zorro Lang <zlang@kernel.org>
Signed-off-by: Zorro Lang <zlang@kernel.org>
common/preamble
tools/mkgroupfile

index 6821966099321b5856fb119899a17f23fcdb0bf3..e60cd949ac4135b124b0195ccb310e835d7eeaa0 100644 (file)
@@ -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"
 
index 3844e57d334a34337ab64cfd200aead8c8f7e34c..244358989774f9aca19d1b4de06472cc8b95ded7 100755 (executable)
@@ -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