From ef73a8162a5fe9c4b2f895bf9fb660f1aabc796c Mon Sep 17 00:00:00 2001 From: Tom Lane Date: Sat, 7 Oct 2017 17:20:09 -0400 Subject: [PATCH] Enforce our convention about max number of parallel regression tests. 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 | 2 +- src/test/regress/pg_regress.c | 25 ++++++++++++++++++++----- src/tools/msvc/vcregress.pl | 2 ++ 3 files changed, 23 insertions(+), 6 deletions(-) diff --git a/src/test/regress/GNUmakefile b/src/test/regress/GNUmakefile index b923ea1420..56cd202078 100644 --- a/src/test/regress/GNUmakefile +++ b/src/test/regress/GNUmakefile @@ -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) diff --git a/src/test/regress/pg_regress.c b/src/test/regress/pg_regress.c index abb742b1ed..f859fbc011 100644 --- a/src/test/regress/pg_regress.c +++ b/src/test/regress/pg_regress.c @@ -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"), diff --git a/src/tools/msvc/vcregress.pl b/src/tools/msvc/vcregress.pl index 2904679114..719fe83047 100644 --- a/src/tools/msvc/vcregress.pl +++ b/src/tools/msvc/vcregress.pl @@ -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"); -- 2.40.0