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)
{