1
0
mirror of https://github.com/postgres/postgres.git synced 2025-04-29 13:56:47 +03:00

Add option force_initdb to PostgreSQL::Test::Cluster:init()

This option is useful to bypass the default behavior of init() which
would create the data folder of a new cluster by copying it from a
template previously initdb'd, if any.  Copying the data folder is much
cheaper than running initdb, but some tests may want to force that.  For
example, one scenario of pg_combinebackup updated in this commit needs a
different system ID for two nodes.

Previously, this could only be achieved by unsetting
$ENV{'INITDB_TEMPLATE'}, which could become a problem in complex node
setups by making tests less efficient.

Author: Amul Sul
Reviewed-by: Robert Haas, Michael Paquier
Discussion: https://postgr.es/m/Zc1tX9lLonLGu6oH@paquier.xyz
This commit is contained in:
Michael Paquier 2024-02-21 13:28:51 +09:00
parent 75bcba6cbd
commit ff9e1e764f
2 changed files with 18 additions and 17 deletions

View File

@ -18,18 +18,12 @@ $node1->init(has_archiving => 1, allows_streaming => 1);
$node1->append_conf('postgresql.conf', 'summarize_wal = on'); $node1->append_conf('postgresql.conf', 'summarize_wal = on');
$node1->start; $node1->start;
# Set up another new database instance. We don't want to use the cached # Set up another new database instance. force_initdb is used because
# INITDB_TEMPLATE for this, because we want it to be a separate cluster # we want it to be a separate cluster with a different system ID.
# with a different system ID. my $node2 = PostgreSQL::Test::Cluster->new('node2');
my $node2; $node2->init(force_initdb => 1, has_archiving => 1, allows_streaming => 1);
{
local $ENV{'INITDB_TEMPLATE'} = undef;
$node2 = PostgreSQL::Test::Cluster->new('node2');
$node2->init(has_archiving => 1, allows_streaming => 1);
$node2->append_conf('postgresql.conf', 'summarize_wal = on'); $node2->append_conf('postgresql.conf', 'summarize_wal = on');
$node2->start; $node2->start;
}
# Take a full backup from node1. # Take a full backup from node1.
my $backup1path = $node1->backup_dir . '/backup1'; my $backup1path = $node1->backup_dir . '/backup1';

View File

@ -503,6 +503,9 @@ parameter allows_streaming => 'logical' or 'physical' (passing 1 will also
suffice for physical replication) depending on type of replication that suffice for physical replication) depending on type of replication that
should be enabled. This is disabled by default. should be enabled. This is disabled by default.
force_initdb => 1 will force the initialization of the cluster with a new
initdb rather than copying the data folder from a template.
The new node is set up in a fast but unsafe configuration where fsync is The new node is set up in a fast but unsafe configuration where fsync is
disabled. disabled.
@ -518,6 +521,7 @@ sub init
local %ENV = $self->_get_env(); local %ENV = $self->_get_env();
$params{allows_streaming} = 0 unless defined $params{allows_streaming}; $params{allows_streaming} = 0 unless defined $params{allows_streaming};
$params{force_initdb} = 0 unless defined $params{force_initdb};
$params{has_archiving} = 0 unless defined $params{has_archiving}; $params{has_archiving} = 0 unless defined $params{has_archiving};
my $initdb_extra_opts_env = $ENV{PG_TEST_INITDB_EXTRA_OPTS}; my $initdb_extra_opts_env = $ENV{PG_TEST_INITDB_EXTRA_OPTS};
@ -529,14 +533,17 @@ sub init
mkdir $self->backup_dir; mkdir $self->backup_dir;
mkdir $self->archive_dir; mkdir $self->archive_dir;
# If available and if there aren't any parameters, use a previously # If available, if there aren't any parameters and if force_initdb is
# initdb'd cluster as a template by copying it. For a lot of tests, that's # disabled, use a previously initdb'd cluster as a template by copying it.
# substantially cheaper. Do so only if there aren't parameters, it doesn't # For a lot of tests, that's substantially cheaper. It does not seem
# seem worth figuring out whether they affect compatibility. # worth figuring out whether extra parameters affect compatibility, so
# initdb is forced if any are defined.
# #
# There's very similar code in pg_regress.c, but we can't easily # There's very similar code in pg_regress.c, but we can't easily
# deduplicate it until we require perl at build time. # deduplicate it until we require perl at build time.
if (defined $params{extra} or !defined $ENV{INITDB_TEMPLATE}) if ( $params{force_initdb}
or defined $params{extra}
or !defined $ENV{INITDB_TEMPLATE})
{ {
note("initializing database system by running initdb"); note("initializing database system by running initdb");
PostgreSQL::Test::Utils::system_or_bail('initdb', '-D', $pgdata, '-A', PostgreSQL::Test::Utils::system_or_bail('initdb', '-D', $pgdata, '-A',