diff options
-rw-r--r-- | contrib/amcheck/t/003_cic_2pc.pl | 2 | ||||
-rw-r--r-- | src/test/perl/PostgreSQL/Test/Utils.pm | 23 | ||||
-rw-r--r-- | src/test/recovery/t/027_stream_regress.pl | 13 |
3 files changed, 37 insertions, 1 deletions
diff --git a/contrib/amcheck/t/003_cic_2pc.pl b/contrib/amcheck/t/003_cic_2pc.pl index dfe7f0ff3b6..2f804efb845 100644 --- a/contrib/amcheck/t/003_cic_2pc.pl +++ b/contrib/amcheck/t/003_cic_2pc.pl @@ -11,6 +11,8 @@ use PostgreSQL::Test::Utils; use Test::More tests => 5; +local $TODO = 'filesystem bug' if PostgreSQL::Test::Utils::has_wal_read_bug; + my ($node, $result); # 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); |