]> granicus.if.org Git - postgresql/commitdiff
Enforce our convention about max number of parallel regression tests.
authorTom Lane <tgl@sss.pgh.pa.us>
Sat, 7 Oct 2017 21:20:09 +0000 (17:20 -0400)
committerTom Lane <tgl@sss.pgh.pa.us>
Sat, 7 Oct 2017 21:20:09 +0000 (17:20 -0400)
We have a very old rule that parallel_schedule should have no more
than twenty tests in any one parallel group, so as to provide a
bound on the number of concurrently running processes needed to
pass the tests.  But people keep forgetting the rule, so let's add
a few lines of code to check it.

Discussion: https://postgr.es/m/a37e9c57-22d4-1b82-1270-4501cd2e984e@2ndquadrant.com

src/test/regress/GNUmakefile
src/test/regress/pg_regress.c
src/tools/msvc/vcregress.pl

index b923ea142031052e561d7fad3ded467d997609d2..56cd2020787c14c5f524ed13b0718ba13c9471cd 100644 (file)
@@ -124,7 +124,7 @@ tablespace-setup:
 ## Run tests
 ##
 
-REGRESS_OPTS = --dlpath=. $(EXTRA_REGRESS_OPTS)
+REGRESS_OPTS = --dlpath=. --max-concurrent-tests=20 $(EXTRA_REGRESS_OPTS)
 
 check: all tablespace-setup
        $(pg_regress_check) $(REGRESS_OPTS) --schedule=$(srcdir)/parallel_schedule $(MAXCONNOPT) $(EXTRA_TESTS)
index abb742b1ed1dec866bb946df46281d3713674ecf..f859fbc011941515d8644d12550468403e712541 100644 (file)
@@ -78,6 +78,7 @@ char     *launcher = NULL;
 static _stringlist *loadlanguage = NULL;
 static _stringlist *loadextension = NULL;
 static int     max_connections = 0;
+static int     max_concurrent_tests = 0;
 static char *encoding = NULL;
 static _stringlist *schedulelist = NULL;
 static _stringlist *extra_tests = NULL;
@@ -1592,9 +1593,9 @@ run_schedule(const char *schedule, test_function tfunc)
        FILE       *scf;
        int                     line_num = 0;
 
-       memset(resultfiles, 0, sizeof(_stringlist *) * MAX_PARALLEL_TESTS);
-       memset(expectfiles, 0, sizeof(_stringlist *) * MAX_PARALLEL_TESTS);
-       memset(tags, 0, sizeof(_stringlist *) * MAX_PARALLEL_TESTS);
+       memset(resultfiles, 0, sizeof(resultfiles));
+       memset(expectfiles, 0, sizeof(expectfiles));
+       memset(tags, 0, sizeof(tags));
 
        scf = fopen(schedule, "r");
        if (!scf)
@@ -1614,6 +1615,7 @@ run_schedule(const char *schedule, test_function tfunc)
 
                line_num++;
 
+               /* clear out string lists left over from previous line */
                for (i = 0; i < MAX_PARALLEL_TESTS; i++)
                {
                        if (resultfiles[i] == NULL)
@@ -1667,8 +1669,8 @@ run_schedule(const char *schedule, test_function tfunc)
                                if (num_tests >= MAX_PARALLEL_TESTS)
                                {
                                        /* can't print scbuf here, it's already been trashed */
-                                       fprintf(stderr, _("too many parallel tests in schedule file \"%s\", line %d\n"),
-                                                       schedule, line_num);
+                                       fprintf(stderr, _("too many parallel tests (more than %d) in schedule file \"%s\" line %d\n"),
+                                                       MAX_PARALLEL_TESTS, schedule, line_num);
                                        exit(2);
                                }
                                tests[num_tests] = c;
@@ -1691,6 +1693,13 @@ run_schedule(const char *schedule, test_function tfunc)
                        wait_for_tests(pids, statuses, NULL, 1);
                        /* status line is finished below */
                }
+               else if (max_concurrent_tests > 0 && max_concurrent_tests < num_tests)
+               {
+                       /* can't print scbuf here, it's already been trashed */
+                       fprintf(stderr, _("too many parallel tests (more than %d) in schedule file \"%s\" line %d\n"),
+                                       max_concurrent_tests, schedule, line_num);
+                       exit(2);
+               }
                else if (max_connections > 0 && max_connections < num_tests)
                {
                        int                     oldest = 0;
@@ -1999,6 +2008,8 @@ help(void)
        printf(_("                            tests; can appear multiple times\n"));
        printf(_("  --max-connections=N       maximum number of concurrent connections\n"));
        printf(_("                            (default is 0, meaning unlimited)\n"));
+       printf(_("  --max-concurrent-tests=N  maximum number of concurrent tests in schedule\n"));
+       printf(_("                            (default is 0, meaning unlimited)\n"));
        printf(_("  --outputdir=DIR           place output files in DIR (default \".\")\n"));
        printf(_("  --schedule=FILE           use test ordering schedule from FILE\n"));
        printf(_("                            (can be used multiple times to concatenate)\n"));
@@ -2048,6 +2059,7 @@ regression_main(int argc, char *argv[], init_function ifunc, test_function tfunc
                {"launcher", required_argument, NULL, 21},
                {"load-extension", required_argument, NULL, 22},
                {"config-auth", required_argument, NULL, 24},
+               {"max-concurrent-tests", required_argument, NULL, 25},
                {NULL, 0, NULL, 0}
        };
 
@@ -2161,6 +2173,9 @@ regression_main(int argc, char *argv[], init_function ifunc, test_function tfunc
                        case 24:
                                config_auth_datadir = pg_strdup(optarg);
                                break;
+                       case 25:
+                               max_concurrent_tests = atoi(optarg);
+                               break;
                        default:
                                /* getopt_long already emitted a complaint */
                                fprintf(stderr, _("\nTry \"%s -h\" for more information.\n"),
index 290467911482fdeaf799745a282ad14c6d554fe3..719fe830476015dbbbee3c778dbea2390c21030f 100644 (file)
@@ -104,6 +104,7 @@ sub installcheck
                "--dlpath=.",
                "--bindir=../../../$Config/psql",
                "--schedule=${schedule}_schedule",
+               "--max-concurrent-tests=20",
                "--encoding=SQL_ASCII",
                "--no-locale");
        push(@args, $maxconn) if $maxconn;
@@ -122,6 +123,7 @@ sub check
                "--dlpath=.",
                "--bindir=",
                "--schedule=${schedule}_schedule",
+               "--max-concurrent-tests=20",
                "--encoding=SQL_ASCII",
                "--no-locale",
                "--temp-instance=./tmp_check");