This patch allow to use custom postgres launcher for tests (tap®ress) by setting environment variable PGLAUNCHER.
Other known methods (like: https://wiki.postgresql.org/wiki/Valgrind) requires to perform installation, build system modifications, executable replacement etc... And proposed way is simpler and more flexible. ** Use-case: run checks under Valgrind - prepare launcher echo 'exec valgrind postgres "$@"' > /tmp/pgvalgrind chmod +x /tmp/pgvalgrind - execute regress tests under Valgrind PGLAUNCHER=/tmp/pgvalgrind TESTS=gin make check-tests - execute concrete tap-test under Valgrind PGLAUNCHER=/tmp/pgvalgrind PROVE_TESTS=t/001_stream_rep.pl make \ check -C src/test/recovery ** Use-case: execute tests with different postgres versions - prepare multi-launcher cat <<EOF > /tmp/launcher cp -f `pwd`/src/backend/postgres.v* \`pg_config --bindir\` exec postgres.v\$V "\$@" EOF chmod +x /tmp/launcher - make some versions of postgres binary ./configure "CFLAGS=..." && make mv src/backend/postgres src/backend/postgres.v1 ./configure "CFLAGS=..." && make mv src/backend/postgres src/backend/postgres.v2 - run checks with different postgres binaries PGLAUNCHER=/tmp/launcher V=1 make check -C contrib/bloom PGLAUNCHER=/tmp/launcher V=2 make check -C contrib/bloom
diff --git a/src/test/perl/PostgresNode.pm b/src/test/perl/PostgresNode.pm index 9575268bd7..6c183be3a2 100644 --- a/src/test/perl/PostgresNode.pm +++ b/src/test/perl/PostgresNode.pm @@ -751,6 +751,7 @@ sub start my $port = $self->port; my $pgdata = $self->data_dir; my $name = $self->name; + my @launcher = defined $ENV{PGLAUNCHER} ? ('-p', $ENV{PGLAUNCHER}) : (); my $ret; BAIL_OUT("node \"$name\" is already running") if defined $self->{_pid}; @@ -767,7 +768,7 @@ sub start # Note: We set the cluster_name here, not in postgresql.conf (in # sub init) so that it does not get copied to standbys. $ret = TestLib::system_log('pg_ctl', '-D', $self->data_dir, '-l', - $self->logfile, '-o', "--cluster-name=$name", 'start'); + $self->logfile, '-o', "--cluster-name=$name", @launcher, 'start'); } if ($ret != 0) @@ -867,6 +868,7 @@ sub restart my $pgdata = $self->data_dir; my $logfile = $self->logfile; my $name = $self->name; + my @launcher = defined $ENV{PGLAUNCHER} ? ('-p', $ENV{PGLAUNCHER}) : (); print "### Restarting node \"$name\"\n"; @@ -875,7 +877,7 @@ sub restart delete $ENV{PGAPPNAME}; TestLib::system_or_bail('pg_ctl', '-D', $pgdata, '-l', $logfile, - 'restart'); + @launcher, 'restart'); } $self->_update_pid(1); diff --git a/src/test/regress/pg_regress.c b/src/test/regress/pg_regress.c index 92bd28dc5a..8104db30f0 100644 --- a/src/test/regress/pg_regress.c +++ b/src/test/regress/pg_regress.c @@ -2290,6 +2290,7 @@ regression_main(int argc, char *argv[], init_function ifunc, test_function tfunc FILE *pg_conf; const char *env_wait; int wait_seconds; + const char *env_launcher; /* * Prepare the temp instance @@ -2423,15 +2424,26 @@ regression_main(int argc, char *argv[], init_function ifunc, test_function tfunc * Start the temp postmaster */ header(_("starting postmaster")); - snprintf(buf, sizeof(buf), - "\"%s%spostgres\" -D \"%s/data\" -F%s " - "-c \"listen_addresses=%s\" -k \"%s\" " - "> \"%s/log/postmaster.log\" 2>&1", - bindir ? bindir : "", - bindir ? "/" : "", - temp_instance, debug ? " -d 5" : "", - hostname ? hostname : "", sockdir ? sockdir : "", - outputdir); + env_launcher = getenv("PGLAUNCHER"); + if (env_launcher != NULL) + snprintf(buf, sizeof(buf), + "\"%s\" -D \"%s/data\" -F%s " + "-c \"listen_addresses=%s\" -k \"%s\" " + "> \"%s/log/postmaster.log\" 2>&1", + env_launcher, + temp_instance, debug ? " -d 5" : "", + hostname ? hostname : "", sockdir ? sockdir : "", + outputdir); + else + snprintf(buf, sizeof(buf), + "\"%s%spostgres\" -D \"%s/data\" -F%s " + "-c \"listen_addresses=%s\" -k \"%s\" " + "> \"%s/log/postmaster.log\" 2>&1", + bindir ? bindir : "", + bindir ? "/" : "", + temp_instance, debug ? " -d 5" : "", + hostname ? hostname : "", sockdir ? sockdir : "", + outputdir); postmaster_pid = spawn_process(buf); if (postmaster_pid == INVALID_PID) {