wait_for_catchup-vs-has_wal_read_bug-v1.patch

text/plain

Filename: wait_for_catchup-vs-has_wal_read_bug-v1.patch
Type: text/plain
Part: 0
Message: Re: has_wal_read_bug

Patch

Format: unified
Series: patch v1
File+
contrib/bloom/t/001_wal.pl 0 7
src/test/perl/PostgreSQL/Test/Cluster.pm 17 2
src/test/recovery/t/027_stream_regress.pl 0 7
src/test/recovery/t/032_relfilenode_reuse.pl 0 7
Author:     Noah Misch <noah@leadboat.com>
Commit:     Noah Misch <noah@leadboat.com>

    If wait_for_catchup fails under has_wal_read_bug, skip balance of test.
    
    Test files should now ignore has_wal_read_bug() so long as
    wait_for_catchup() is their only known way of reaching the bug.  That's
    at least five files today, a number expected to grow over time.  This
    commit removes skip logic from three.  By doing so, systems having the
    bug regain the ability to catch other kinds of defects via those three
    tests.  The other two, 002_databases.pl and 031_recovery_conflict.pl,
    have been unprotected.  Back-patch to v15, where done_testing() first
    became our standard.
    
    Reviewed by FIXME.
    
    Discussion: https://postgr.es/m/FIXME

diff --git a/contrib/bloom/t/001_wal.pl b/contrib/bloom/t/001_wal.pl
index f7f16dc..9416a64 100644
--- a/contrib/bloom/t/001_wal.pl
+++ b/contrib/bloom/t/001_wal.pl
@@ -8,13 +8,6 @@ use PostgreSQL::Test::Cluster;
 use PostgreSQL::Test::Utils;
 use Test::More;
 
-if (PostgreSQL::Test::Utils::has_wal_read_bug)
-{
-	# We'd prefer to use Test::More->builder->todo_start, but the bug causes
-	# this test file to die(), not merely to fail.
-	plan skip_all => 'filesystem bug';
-}
-
 my $node_primary;
 my $node_standby;
 
diff --git a/src/test/perl/PostgreSQL/Test/Cluster.pm b/src/test/perl/PostgreSQL/Test/Cluster.pm
index d80134b..d1017b7 100644
--- a/src/test/perl/PostgreSQL/Test/Cluster.pm
+++ b/src/test/perl/PostgreSQL/Test/Cluster.pm
@@ -2606,8 +2606,23 @@ sub wait_for_catchup
 	my $query = qq[SELECT '$target_lsn' <= ${mode}_lsn AND state = 'streaming'
          FROM pg_catalog.pg_stat_replication
          WHERE application_name IN ('$standby_name', 'walreceiver')];
-	$self->poll_query_until('postgres', $query)
-	  or croak "timed out waiting for catchup";
+	if (!$self->poll_query_until('postgres', $query))
+	{
+		if (PostgreSQL::Test::Utils::has_wal_read_bug)
+		{
+			# Mimic having skipped the test file.  If >0 tests have run, the
+			# harness won't accept a skip; otherwise, it won't accept
+			# done_testing().  Force a nonzero count by running one test.
+			ok(1, 'dummy test before skip for filesystem bug');
+			carp "skip rest: timed out waiting for catchup & filesystem bug";
+			done_testing();
+			exit 0;
+		}
+		else
+		{
+			croak "timed out waiting for catchup";
+		}
+	}
 	print "done\n";
 	return;
 }
diff --git a/src/test/recovery/t/027_stream_regress.pl b/src/test/recovery/t/027_stream_regress.pl
index 7982ac0..69d6ddf 100644
--- a/src/test/recovery/t/027_stream_regress.pl
+++ b/src/test/recovery/t/027_stream_regress.pl
@@ -6,13 +6,6 @@ use PostgreSQL::Test::Utils;
 use Test::More;
 use File::Basename;
 
-if (PostgreSQL::Test::Utils::has_wal_read_bug)
-{
-	# We'd prefer to use Test::More->builder->todo_start, but the bug causes
-	# this test file to die(), not merely to fail.
-	plan skip_all => 'filesystem bug';
-}
-
 # Initialize primary node
 my $node_primary = PostgreSQL::Test::Cluster->new('primary');
 $node_primary->init(allows_streaming => 1);
diff --git a/src/test/recovery/t/032_relfilenode_reuse.pl b/src/test/recovery/t/032_relfilenode_reuse.pl
index 499ec34..92ec510 100644
--- a/src/test/recovery/t/032_relfilenode_reuse.pl
+++ b/src/test/recovery/t/032_relfilenode_reuse.pl
@@ -5,13 +5,6 @@ use PostgreSQL::Test::Utils;
 use Test::More;
 use File::Basename;
 
-if (PostgreSQL::Test::Utils::has_wal_read_bug)
-{
-	# We'd prefer to use Test::More->builder->todo_start, but the bug causes
-	# this test file to die(), not merely to fail.
-	plan skip_all => 'filesystem bug';
-}
-
 
 my $node_primary = PostgreSQL::Test::Cluster->new('primary');
 $node_primary->init(allows_streaming => 1);