I got tired of wondering what timing dependencies might still be lurking
in the parallel regression tests, and wrote a little Perl script to find
out by making variant versions of the parallel_schedule file.

Essentially, the script forces each test in a parallel group to run
before all the other ones in its group, and also after all the other
ones.  This isn't a completely bulletproof check: you could imagine
that test A might be unhappy about some intermediate state created by
test B, while not being unhappy with either the starting or ending
states.  But it's a lot better than guess-and-hope.

The script successfully exposed the problem reported earlier today by
Robert Hentosh (create_index test depends on create_misc having run),
and didn't find any other problems, which I guess is a good sign.
(I've now committed a fix for that mistake, BTW.)

I'm not sure if the script has any long-term usefulness (anyone feel it
deserves to get into CVS in src/tools/?).  But I'll attach it anyway
just so it gets into the pghackers archives.

To use it you'd do something like

mkdir scheds
./sched_variants parallel_schedule scheds/sch
for f in scheds/sch*
do
        echo $f
        /bin/sh ./pg_regress --schedule=$f
        ff=`basename $f`
        mv regression.out scheds/regression.out.$ff
        mv regression.diffs scheds/regression.diffs.$ff
done


                        regards, tom lane

#! /usr/bin/perl

# Generate variants of parallel_schedule file to verify that there are
# no order dependencies between tests executed in parallel.

# Usage: sched_variants input_file output_prefix

# Output files are named with 'output_prefix' suffixed .1, .2, etc.

die "Usage: sched_variants input_file output_prefix\n" if ($#ARGV != 1);

$infile = $ARGV[0];
$outprefix = $ARGV[1];

$outcount = 0;                  # number of output files created

# We scan the input file repeatedly.  On each pass we generate two
# output files, one where the k'th entry of each parallel test set
# has been extracted and forced to run first, and one where it's been
# forced to run last.  The number of passes needed is the same as the
# largest number of tests in a parallel test set.

$k = 1;                         # test index we are currently hacking

$more = 1;                      # true if we need another pass

while ($more) {
    $more = 0;                  # until proven differently

    open(INFILE, $infile) || die "$infile: $!\n";

    $outcount++;
    $outbefore = $outprefix . "." . $outcount;
    open(OUTBEFORE, "> $outbefore") || die "$outbefore: $!\n";

    $outcount++;
    $outafter = $outprefix . "." . $outcount;
    open(OUTAFTER, "> $outafter") || die "$outafter: $!\n";

    while (<INFILE>) {
        if (! /^test:/) {
            # comment line
            print OUTBEFORE $_;
            print OUTAFTER $_;
            next;
        }
        @tests = split;
        shift(@tests);          # remove test:
        if ($#tests < $k-1 || $#tests == 0) {
            # too few tests in this set, just repeat as-is
            print OUTBEFORE $_;
            print OUTAFTER $_;
            next;
        }
        if ($#tests >= $k) {
            $more = 1;          # need more passes to process this set
        }
        @thistest = splice(@tests, $k-1, 1);
        print OUTBEFORE "test: @thistest\n";
        print OUTBEFORE "test: @tests\n";

        print OUTAFTER "test: @tests\n";
        print OUTAFTER "test: @thistest\n";
    }

    close OUTBEFORE;
    close OUTAFTER;
    close INFILE;

    $k++;
}

print "$outcount test files generated.\n";

exit 0;
---------------------------(end of broadcast)---------------------------
TIP 3: if posting/reading through Usenet, please send an appropriate
subscribe-nomail command to [EMAIL PROTECTED] so that your
message can get through to the mailing list cleanly

Reply via email to