Fix new recovery test for use under msys
authorAndrew Dunstan <[email protected]>
Sat, 12 Jun 2021 12:37:16 +0000 (08:37 -0400)
committerAndrew Dunstan <[email protected]>
Sat, 12 Jun 2021 12:55:55 +0000 (08:55 -0400)
Commit caba8f0d43 wasn't quite right for msys, as demonstrated by
several buildfarm animals, including jacana and fairywren. We need to
use the msys perl in the archive command, but call it in such a way that
Windows will understand the path. Furthermore, inside the copy script we
need to convert a Windows path to an msys path.

src/test/recovery/t/025_stuck_on_old_timeline.pl
src/test/recovery/t/cp_history_files

index 75bbef1bcc5b00a93f4bc269d27087dc8839f0a5..d4a03246b867b139c42d91ac86bb483c14fc3305 100644 (file)
@@ -10,6 +10,8 @@ use strict;
 use warnings;
 use PostgresNode;
 use TestLib;
+
+use File::Basename;
 use FindBin;
 use Test::More tests => 1;
 
@@ -23,12 +25,17 @@ my $node_primary = get_new_node('primary');
 # get there.
 $node_primary->init(allows_streaming => 1, has_archiving => 1);
 my $perlbin = $^X;
-$perlbin =~ s{\\}{\\\\}g if ($TestLib::windows_os);
+if ($^O eq 'msys')
+{
+   $perlbin = TestLib::perl2host(dirname($^X)) . '\\' . basename($^X);
+}
+$perlbin =~ s!\\!/!g if $TestLib::windows_os;
 my $archivedir_primary = $node_primary->archive_dir;
 $node_primary->append_conf('postgresql.conf', qq(
-archive_command = '$perlbin "$FindBin::RealBin/cp_history_files" "%p" "$archivedir_primary/%f"'
+archive_command = '"$perlbin" "$FindBin::RealBin/cp_history_files" "%p" "$archivedir_primary/%f"'
 wal_keep_segments=8
 ));
+local $ENV{PERL_BADLANG}=0;
 $node_primary->start;
 
 # Take backup from primary
@@ -85,7 +92,8 @@ $node_standby->safe_psql('postgres', 'SELECT pg_switch_xlog()');
 # WAL segment, this is enough to guarantee that the history file was
 # archived.
 my $archive_wait_query =
-  "SELECT '$walfile_to_be_archived' <= last_archived_wal FROM pg_stat_archiver;";
+  "SELECT coalesce('$walfile_to_be_archived' <= last_archived_wal, false) " .
+  "FROM pg_stat_archiver";
 $node_standby->poll_query_until('postgres', $archive_wait_query)
   or die "Timed out while waiting for WAL segment to be archived";
 my $last_archived_wal_file = $walfile_to_be_archived;
index cfeea41e5b918ed51fe62878558c2f5401de4e32..66f1b598fea81e70549a1a2727a822a663c10288 100644 (file)
@@ -7,4 +7,11 @@ use warnings;
 die "wrong number of arguments" if @ARGV != 2;
 my ($source, $target) = @ARGV;
 exit if $source !~ /history/;
+if ($^O eq 'msys')
+{
+    # make a windows path look like an msys path if necessary
+    $source =~ s!^([A-Za-z]):!'/' . lc($1)!e;
+    $source =~ s!\\!/!g;
+}
+
 copy($source, $target) or die "couldn't copy $source to $target: $!";