Test replay of regression tests, attempt II.
authorThomas Munro <tmunro@postgresql.org>
Mon, 17 Jan 2022 03:34:55 +0000 (16:34 +1300)
committerThomas Munro <tmunro@postgresql.org>
Mon, 17 Jan 2022 03:34:55 +0000 (16:34 +1300)
See commit message for 123828a7fa563025d0ceee10cf1b2a253cd05319.  The
only change this time is the order of the arguments passed to
pg_regress.  The previously version broke in the build farm environment
due to the contents of EXTRA_REGRESS_OPTS (see also commit 8cade04c
which had to do something similar).

Discussion: https://postgr.es/m/CA%2BhUKGKpRWQ9SxdxxDmTBCJoR0YnFpMBe7kyzY8SUQk%2BHeskxg%40mail.gmail.com

doc/src/sgml/regress.sgml
src/test/recovery/Makefile
src/test/recovery/t/027_stream_regress.pl [new file with mode: 0644]
src/tools/msvc/vcregress.pl

index 8cf10085d35884814ba7f2c5b0f4f78ba87cff40..952139fc60a4cbefc3f03cbe326e046ec2a93180 100644 (file)
@@ -289,6 +289,17 @@ make check-world PG_TEST_EXTRA='kerberos ldap ssl'
       </para>
      </listitem>
     </varlistentry>
+
+    <varlistentry>
+     <term><literal>wal_consistency_checking</literal></term>
+     <listitem>
+      <para>
+       Uses <literal>wal_consistency_checking=all</literal> while running
+       certain tests under <filename>src/test/recovery</filename>.  Not
+       enabled by default because it is resource intensive.
+      </para>
+     </listitem>
+    </varlistentry>
    </variablelist>
 
    Tests for features that are not supported by the current build
index e3011c3e379bcae02e4d5c5011851f292169ed9b..ec5a1f14d15fbd4f40f2189326c9ef58f06df878 100644 (file)
@@ -15,10 +15,14 @@ subdir = src/test/recovery
 top_builddir = ../../..
 include $(top_builddir)/src/Makefile.global
 
-# required for 017_shm.pl
+# required for 017_shm.pl and 027_stream_regress.pl
 REGRESS_SHLIB=$(abs_top_builddir)/src/test/regress/regress$(DLSUFFIX)
 export REGRESS_SHLIB
 
+# required for 027_stream_regress.pl
+REGRESS_OUTPUTDIR=$(abs_top_builddir)/src/test/recovery
+export REGRESS_OUTPUTDIR
+
 check:
    $(prove_check)
 
diff --git a/src/test/recovery/t/027_stream_regress.pl b/src/test/recovery/t/027_stream_regress.pl
new file mode 100644 (file)
index 0000000..8c0a8b6
--- /dev/null
@@ -0,0 +1,79 @@
+# Run the standard regression tests with streaming replication
+use strict;
+use warnings;
+use PostgreSQL::Test::Cluster;
+use PostgreSQL::Test::Utils;
+use Test::More tests => 4;
+use File::Basename;
+
+# Initialize primary node
+my $node_primary = PostgreSQL::Test::Cluster->new('primary');
+$node_primary->init(allows_streaming => 1);
+$node_primary->adjust_conf('postgresql.conf', 'max_connections', '25', 1);
+$node_primary->append_conf('postgresql.conf', 'max_prepared_transactions = 10');
+
+# WAL consistency checking is resource intensive so require opt-in with the
+# PG_TEST_EXTRA environment variable.
+if ($ENV{PG_TEST_EXTRA} &&
+   $ENV{PG_TEST_EXTRA} =~ m/\bwal_consistency_checking\b/) {
+   $node_primary->append_conf('postgresql.conf',
+       'wal_consistency_checking = all');
+}
+
+$node_primary->start;
+is( $node_primary->psql(
+        'postgres',
+        qq[SELECT pg_create_physical_replication_slot('standby_1');]),
+    0,
+    'physical slot created on primary');
+my $backup_name = 'my_backup';
+
+# Take backup
+$node_primary->backup($backup_name);
+
+# Create streaming standby linking to primary
+my $node_standby_1 = PostgreSQL::Test::Cluster->new('standby_1');
+$node_standby_1->init_from_backup($node_primary, $backup_name,
+   has_streaming => 1);
+$node_standby_1->append_conf('postgresql.conf',
+    "primary_slot_name = standby_1");
+$node_standby_1->start;
+
+my $dlpath = PostgreSQL::Test::Utils::perl2host(dirname($ENV{REGRESS_SHLIB}));
+my $outputdir = PostgreSQL::Test::Utils::perl2host($ENV{REGRESS_OUTPUTDIR});
+
+# Run the regression tests against the primary.
+my $extra_opts = $ENV{EXTRA_REGRESS_OPTS} || "";
+system_or_bail($ENV{PG_REGRESS} . " $extra_opts " .
+              "--dlpath=\"$dlpath\" " .
+              "--bindir= " .
+              "--port=" . $node_primary->port . " " .
+              "--schedule=../regress/parallel_schedule " .
+              "--max-concurrent-tests=20 " .
+              "--inputdir=../regress " .
+              "--outputdir=\"$outputdir\"");
+
+# Clobber all sequences with their next value, so that we don't have
+# differences between nodes due to caching.
+$node_primary->psql('regression',
+   "select setval(seqrelid, nextval(seqrelid)) from pg_sequence");
+
+# Wait for standby to catch up
+$node_primary->wait_for_catchup($node_standby_1, 'replay',
+   $node_primary->lsn('insert'));
+
+# Perform a logical dump of primary and standby, and check that they match
+command_ok(
+   [ 'pg_dumpall', '-f', $outputdir . '/primary.dump', '--no-sync',
+     '-p', $node_primary->port ],
+   'dump primary server');
+command_ok(
+   [ 'pg_dumpall', '-f', $outputdir . '/standby.dump', '--no-sync',
+     '-p', $node_standby_1->port ],
+   'dump standby server');
+command_ok(
+   [ 'diff', $outputdir . '/primary.dump', $outputdir . '/standby.dump' ],
+   'compare primary and standby dumps');
+
+$node_standby_1->stop;
+$node_primary->stop;
index 7c4115614e5432d8251a25c1a5fc3c5f6ee59e76..8ba823b712cee8c3e566c544ccec93713b2fa52b 100644 (file)
@@ -536,6 +536,8 @@ sub recoverycheck
 {
    InstallTemp();
 
+   $ENV{REGRESS_OUTPUTDIR} = "$topdir/src/test/recovery";
+
    my $mstat  = 0;
    my $dir    = "$topdir/src/test/recovery";
    my $status = tap_check($dir);