aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorNoah Misch <noah@leadboat.com>2022-01-26 18:06:19 -0800
committerNoah Misch <noah@leadboat.com>2022-01-26 18:06:19 -0800
commitce6d79368efa8a553490b5b5962bc529d7de54cb (patch)
tree31a303d1ee30b575b741aa9d1790864be2aec159 /src
parent2dbb7b9b2279d064f66ce9008869fd0e2b794534 (diff)
downloadpostgresql-ce6d79368efa8a553490b5b5962bc529d7de54cb.tar.gz
postgresql-ce6d79368efa8a553490b5b5962bc529d7de54cb.zip
On sparc64+ext4, suppress test failures from known WAL read failure.
Buildfarm members kittiwake, tadarida and snapper began to fail frequently when commits 3cd9c3b921977272e6650a5efbeade4203c4bca2 and f47ed79cc8a0cfa154dc7f01faaf59822552363f added tests of concurrency, but the problem was reachable before those commits. Back-patch to v10 (all supported versions). Discussion: https://postgr.es/m/20220116210241.GC756210@rfd.leadboat.com
Diffstat (limited to 'src')
-rw-r--r--src/test/perl/PostgreSQL/Test/Utils.pm23
-rw-r--r--src/test/recovery/t/027_stream_regress.pl13
2 files changed, 35 insertions, 1 deletions
diff --git a/src/test/perl/PostgreSQL/Test/Utils.pm b/src/test/perl/PostgreSQL/Test/Utils.pm
index 50be10fb5af..3da04b3b6cc 100644
--- a/src/test/perl/PostgreSQL/Test/Utils.pm
+++ b/src/test/perl/PostgreSQL/Test/Utils.pm
@@ -351,6 +351,29 @@ sub perl2host
=pod
+=item has_wal_read_bug()
+
+Returns true if $tmp_check is subject to a sparc64+ext4 bug that causes WAL
+readers to see zeros if another process simultaneously wrote the same offsets.
+Consult this in tests that fail frequently on affected configurations. The
+bug has made streaming standbys fail to advance, reporting corrupt WAL. It
+has made COMMIT PREPARED fail with "could not read two-phase state from WAL".
+Non-WAL PostgreSQL reads haven't been affected, likely because those readers
+and writers have buffering systems in common. See
+https://postgr.es/m/20220116210241.GC756210@rfd.leadboat.com for details.
+
+=cut
+
+sub has_wal_read_bug
+{
+ return
+ $Config{osname} eq 'linux'
+ && $Config{archname} =~ /^sparc/
+ && !run_log([ qw(df -x ext4), $tmp_check ], '>', '/dev/null', '2>&1');
+}
+
+=pod
+
=item system_log(@cmd)
Run (via C<system()>) the command passed as argument; the return
diff --git a/src/test/recovery/t/027_stream_regress.pl b/src/test/recovery/t/027_stream_regress.pl
index 8c0a8b6d0ac..0596980b1a6 100644
--- a/src/test/recovery/t/027_stream_regress.pl
+++ b/src/test/recovery/t/027_stream_regress.pl
@@ -3,9 +3,20 @@ use strict;
use warnings;
use PostgreSQL::Test::Cluster;
use PostgreSQL::Test::Utils;
-use Test::More tests => 4;
+use Test::More;
use File::Basename;
+if (PostgreSQL::Test::Utils::has_wal_read_bug)
+{
+ # We'd prefer to use "local $TODO", but the bug causes this test file to
+ # die(), not merely to fail.
+ plan skip_all => 'filesystem bug';
+}
+else
+{
+ plan tests => 4;
+}
+
# Initialize primary node
my $node_primary = PostgreSQL::Test::Cluster->new('primary');
$node_primary->init(allows_streaming => 1);