On sparc64+ext4, suppress test failures from known WAL read failure.

Buildfarm members kittiwake, tadarida and snapper began to fail
frequently when commits 3cd9c3b921 and
f47ed79cc8 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
This commit is contained in:
Noah Misch 2022-01-26 18:06:19 -08:00
parent 2dbb7b9b22
commit ce6d79368e
3 changed files with 37 additions and 1 deletions

View File

@ -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);
#

View File

@ -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

View File

@ -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);