Allow passing extra options to initdb for tests

Setting the environment variable PG_TEST_INITDB_EXTRA_OPTS passes
extra options to initdb run by pg_regress or
PostgreSQL::Test::Cluster's init.

This can be useful for a wide variety of uses, like running all tests
with checksums enabled, or with JIT enabled, or with different GUC
settings, or with different locale settings.  (Not all tests are going
to pass with arbitrary options, but it is useful to run this against
specific test suites.)

Reviewed-by: Ian Lawrence Barwick <barwick@gmail.com>
Discussion: https://www.postgresql.org/message-id/flat/d4d2ad9f-1c1d-47a1-bb4d-c10a747d4f15%40eisentraut.org
This commit is contained in:
Peter Eisentraut 2024-02-15 09:52:08 +01:00
parent 9bc1eee988
commit 995d400cec
3 changed files with 40 additions and 8 deletions

View File

@ -390,12 +390,37 @@ make check LANG=C ENCODING=EUC_JP
<title>Custom Server Settings</title>
<para>
Custom server settings to use when running a regression test suite can be
There are several ways to use custom server settings when running a test
suite. This can be useful to enable additional logging, adjust resource
limits, or enable extra run-time checks such as <xref
linkend="guc-debug-discard-caches"/>. But note that not all tests can be
expected to pass cleanly with arbitrary settings.
</para>
<para>
Extra options can be passed to the various <command>initdb</command>
commands that are run internally during test setup using the environment
variable <envar>PG_TEST_INITDB_EXTRA_OPTS</envar>. For example, to run a
test with checksums enabled and a custom WAL segment size and
<varname>work_mem</varname> setting, use:
<screen>
make check PG_TEST_INITDB_EXTRA_OPTS='-k --wal-segsize=4 -c work_mem=50MB'
</screen>
</para>
<para>
For the core regression test suite and other tests driven by
<command>pg_regress</command>, custom run-time server settings can also be
set in the <varname>PGOPTIONS</varname> environment variable (for settings
that allow this):
that allow this), for example:
<screen>
make check PGOPTIONS="-c debug_parallel_query=regress -c work_mem=50MB"
</screen>
(This makes use of functionality provided by libpq; see <xref
linkend="libpq-connect-options"/> for details.)
</para>
<para>
When running against a temporary installation, custom settings can also be
set by supplying a pre-written <filename>postgresql.conf</filename>:
<screen>
@ -405,11 +430,6 @@ make check EXTRA_REGRESS_OPTS="--temp-config=test_postgresql.conf"
</screen>
</para>
<para>
This can be useful to enable additional logging, adjust resource limits,
or enable extra run-time checks such as <xref
linkend="guc-debug-discard-caches"/>.
</para>
</sect2>
<sect2 id="regress-run-extra-tests">

View File

@ -114,6 +114,7 @@ use Socket;
use Test::More;
use PostgreSQL::Test::Utils ();
use PostgreSQL::Test::BackgroundPsql ();
use Text::ParseWords qw(shellwords);
use Time::HiRes qw(usleep);
use Scalar::Util qw(blessed);
@ -519,6 +520,12 @@ sub init
$params{allows_streaming} = 0 unless defined $params{allows_streaming};
$params{has_archiving} = 0 unless defined $params{has_archiving};
my $initdb_extra_opts_env = $ENV{PG_TEST_INITDB_EXTRA_OPTS};
if (defined $initdb_extra_opts_env)
{
push @{ $params{extra} }, shellwords($initdb_extra_opts_env);
}
mkdir $self->backup_dir;
mkdir $self->archive_dir;

View File

@ -2306,6 +2306,7 @@ regression_main(int argc, char *argv[],
const char *keywords[4];
const char *values[4];
PGPing rv;
const char *initdb_extra_opts_env;
/*
* Prepare the temp instance
@ -2327,6 +2328,8 @@ regression_main(int argc, char *argv[],
if (!directory_exists(buf))
make_directory(buf);
initdb_extra_opts_env = getenv("PG_TEST_INITDB_EXTRA_OPTS");
initStringInfo(&cmd);
/*
@ -2339,7 +2342,7 @@ regression_main(int argc, char *argv[],
* duplicate it until we require perl at build time.
*/
initdb_template_dir = getenv("INITDB_TEMPLATE");
if (initdb_template_dir == NULL || nolocale || debug)
if (initdb_template_dir == NULL || nolocale || debug || initdb_extra_opts_env)
{
note("initializing database system by running initdb");
@ -2352,6 +2355,8 @@ regression_main(int argc, char *argv[],
appendStringInfoString(&cmd, " --debug");
if (nolocale)
appendStringInfoString(&cmd, " --no-locale");
if (initdb_extra_opts_env)
appendStringInfo(&cmd, " %s", initdb_extra_opts_env);
appendStringInfo(&cmd, " > \"%s/log/initdb.log\" 2>&1", outputdir);
fflush(NULL);
if (system(cmd.data))