On 1/21/22 22:43, Thomas Munro wrote: > On Sat, Jan 22, 2022 at 3:55 PM Robert Haas <robertmh...@gmail.com> wrote: >> On Fri, Jan 21, 2022 at 5:35 PM Andrew Dunstan <and...@dunslane.net> wrote: >>> # See https://www.msys2.org/wiki/Porting/#filesystem-namespaces >>> local $ENV{MSYS2_ARG_CONV_EXCL} = $source_ts_prefix; >>> Probably in this case just setting it to 'server:' would do the trick. >> Oh, thanks for the tip. Do you want to push a commit that does that, >> or ... should I do it? > Just a thought: Would it prevent the magic path translation and all > just work if the path were already in Windows form? So, if we did > just this change at the top: > > -my $tempdir = PostgreSQL::Test::Utils::tempdir; > +my $tempdir = > PostgreSQL::Test::Utils::perl2host(PostgreSQL::Test::Utils::tempdir);
It's not as simple as that :-( But you're on the right track. My suggestion above doesn't work. The rule for paths is: when you're passing a path to an external program that's not msys aware (typically, one of our build artefacts like psql or pg_basebackup) it needs to be a native path. But when you're passing it to a perl function (e.g. mkdir) or to an external program that's msys aware it needs to be a virtual path, i.e. one not mangled by perl2host. Some recent commits to this file especially have not obeyed this rule. Here's a patch that does it consistently for the whole file. I have tested it on a system very like fairywren, and the test passes. cheers andrew -- Andrew Dunstan EDB: https://www.enterprisedb.com
diff --git a/src/bin/pg_basebackup/t/010_pg_basebackup.pl b/src/bin/pg_basebackup/t/010_pg_basebackup.pl index 95a6bd6778..7cf0480901 100644 --- a/src/bin/pg_basebackup/t/010_pg_basebackup.pl +++ b/src/bin/pg_basebackup/t/010_pg_basebackup.pl @@ -17,6 +17,7 @@ program_version_ok('pg_basebackup'); program_options_handling_ok('pg_basebackup'); my $tempdir = PostgreSQL::Test::Utils::tempdir; +my $real_tempdir = PostgreSQL::Test::Utils::perl2host($tempdir); my $node = PostgreSQL::Test::Cluster->new('main'); @@ -40,15 +41,15 @@ $node->command_fails(['pg_basebackup'], # Sanity checks for options $node->command_fails_like( - [ 'pg_basebackup', '-D', "$tempdir/backup", '--compress', 'none:1' ], + [ 'pg_basebackup', '-D', "$real_tempdir/backup", '--compress', 'none:1' ], qr/\Qpg_basebackup: error: cannot use compression level with method none/, 'failure if method "none" specified with compression level'); $node->command_fails_like( - [ 'pg_basebackup', '-D', "$tempdir/backup", '--compress', 'none+' ], + [ 'pg_basebackup', '-D', "$real_tempdir/backup", '--compress', 'none+' ], qr/\Qpg_basebackup: error: invalid value "none+" for option/, 'failure on incorrect separator to define compression level'); $node->command_fails_like( - [ 'pg_basebackup', '-D', "$tempdir/backup", '--compress', 'none:' ], + [ 'pg_basebackup', '-D', "$real_tempdir/backup", '--compress', 'none:' ], qr/\Qpg_basebackup: error: no compression level defined for method none/, 'failure on missing compression level value'); @@ -64,7 +65,7 @@ $node->set_replication_conf(); system_or_bail 'pg_ctl', '-D', $pgdata, 'reload'; $node->command_fails( - [ @pg_basebackup_defs, '-D', "$tempdir/backup" ], + [ @pg_basebackup_defs, '-D', "$real_tempdir/backup" ], 'pg_basebackup fails because of WAL configuration'); ok(!-d "$tempdir/backup", 'backup directory was cleaned up'); @@ -75,7 +76,8 @@ mkdir("$tempdir/backup") or BAIL_OUT("unable to create $tempdir/backup"); append_to_file("$tempdir/backup/dir-not-empty.txt", "Some data"); -$node->command_fails([ @pg_basebackup_defs, '-D', "$tempdir/backup", '-n' ], +$node->command_fails([ @pg_basebackup_defs, + '-D', "$real_tempdir/backup", '-n' ], 'failing run with no-clean option'); ok(-d "$tempdir/backup", 'backup directory was created and left behind'); @@ -126,7 +128,8 @@ foreach my $filename (@tempRelationFiles) } # Run base backup. -$node->command_ok([ @pg_basebackup_defs, '-D', "$tempdir/backup", '-X', 'none' ], +$node->command_ok([ @pg_basebackup_defs, + '-D', "$real_tempdir/backup", '-X', 'none' ], 'pg_basebackup runs'); ok(-f "$tempdir/backup/PG_VERSION", 'backup was created'); ok(-f "$tempdir/backup/backup_manifest", 'backup manifest included'); @@ -187,8 +190,8 @@ rmtree("$tempdir/backup"); $node->command_ok( [ @pg_basebackup_defs, '-D', - "$tempdir/backup2", '--no-manifest', - '--waldir', "$tempdir/xlog2" + "$real_tempdir/backup2", '--no-manifest', + '--waldir', "$real_tempdir/xlog2" ], 'separate xlog directory'); ok(-f "$tempdir/backup2/PG_VERSION", 'backup was created'); @@ -197,31 +200,34 @@ ok(-d "$tempdir/xlog2/", 'xlog directory was created'); rmtree("$tempdir/backup2"); rmtree("$tempdir/xlog2"); -$node->command_ok([ @pg_basebackup_defs, '-D', "$tempdir/tarbackup", '-Ft' ], +$node->command_ok([ @pg_basebackup_defs, + '-D', "$real_tempdir/tarbackup", '-Ft' ], 'tar format'); ok(-f "$tempdir/tarbackup/base.tar", 'backup tar was created'); rmtree("$tempdir/tarbackup"); $node->command_fails( - [ @pg_basebackup_defs, '-D', "$tempdir/backup_foo", '-Fp', "-T=/foo" ], + [ @pg_basebackup_defs, '-D', "$real_tempdir/backup_foo", '-Fp', "-T=/foo" ], '-T with empty old directory fails'); $node->command_fails( - [ @pg_basebackup_defs, '-D', "$tempdir/backup_foo", '-Fp', "-T/foo=" ], + [ @pg_basebackup_defs, '-D', "$real_tempdir/backup_foo", '-Fp', "-T/foo=" ], '-T with empty new directory fails'); $node->command_fails( [ - @pg_basebackup_defs, '-D', "$tempdir/backup_foo", '-Fp', + @pg_basebackup_defs, '-D', "$real_tempdir/backup_foo", '-Fp', "-T/foo=/bar=/baz" ], '-T with multiple = fails'); $node->command_fails( - [ @pg_basebackup_defs, '-D', "$tempdir/backup_foo", '-Fp', "-Tfoo=/bar" ], + [ @pg_basebackup_defs, + '-D', "$real_tempdir/backup_foo", '-Fp', "-Tfoo=/bar" ], '-T with old directory not absolute fails'); $node->command_fails( - [ @pg_basebackup_defs, '-D', "$tempdir/backup_foo", '-Fp', "-T/foo=bar" ], + [ @pg_basebackup_defs, + '-D', "$real_tempdir/backup_foo", '-Fp', "-T/foo=bar" ], '-T with new directory not absolute fails'); $node->command_fails( - [ @pg_basebackup_defs, '-D', "$tempdir/backup_foo", '-Fp', "-Tfoo" ], + [ @pg_basebackup_defs, '-D', "$real_tempdir/backup_foo", '-Fp', "-Tfoo" ], '-T with invalid format fails'); # Tar format doesn't support filenames longer than 100 bytes. @@ -232,7 +238,7 @@ open my $file, '>', "$superlongpath" or die "unable to create file $superlongpath"; close $file; $node->command_fails( - [ @pg_basebackup_defs, '-D', "$tempdir/tarbackup_l1", '-Ft' ], + [ @pg_basebackup_defs, '-D', "$real_tempdir/tarbackup_l1", '-Ft' ], 'pg_basebackup tar with long name fails'); unlink "$pgdata/$superlongname"; @@ -266,7 +272,6 @@ dir_symlink "$tempdir", $shorter_tempdir; mkdir "$tempdir/tblspc1"; my $realTsDir = "$real_sys_tempdir/tblspc1"; -my $real_tempdir = PostgreSQL::Test::Utils::perl2host($tempdir); $node->safe_psql('postgres', "CREATE TABLESPACE tblspc1 LOCATION '$realTsDir';"); $node->safe_psql('postgres', @@ -350,13 +355,13 @@ foreach my $filename (@tempRelationFiles) } $node->command_fails( - [ @pg_basebackup_defs, '-D', "$tempdir/backup1", '-Fp' ], + [ @pg_basebackup_defs, '-D', "$real_tempdir/backup1", '-Fp' ], 'plain format with tablespaces fails without tablespace mapping'); $node->command_ok( [ @pg_basebackup_defs, '-D', - "$tempdir/backup1", '-Fp', + "$real_tempdir/backup1", '-Fp', "-T$realTsDir=$real_tempdir/tbackup/tblspc1", ], 'plain format with tablespaces succeeds with tablespace mapping'); @@ -426,7 +431,7 @@ $realTsDir =~ s/=/\\=/; $node->command_ok( [ @pg_basebackup_defs, '-D', - "$tempdir/backup3", '-Fp', + "$real_tempdir/backup3", '-Fp', "-T$realTsDir=$real_tempdir/tbackup/tbl\\=spc2", ], 'mapping tablespace with = sign in path'); @@ -438,12 +443,13 @@ mkdir "$tempdir/$superlongname"; $realTsDir = "$real_sys_tempdir/$superlongname"; $node->safe_psql('postgres', "CREATE TABLESPACE tblspc3 LOCATION '$realTsDir';"); -$node->command_ok([ @pg_basebackup_defs, '-D', "$tempdir/tarbackup_l3", '-Ft' ], +$node->command_ok([ @pg_basebackup_defs, + '-D', "$real_tempdir/tarbackup_l3", '-Ft' ], 'pg_basebackup tar with long symlink target'); $node->safe_psql('postgres', "DROP TABLESPACE tblspc3;"); rmtree("$tempdir/tarbackup_l3"); -$node->command_ok([ @pg_basebackup_defs, '-D', "$tempdir/backupR", '-R' ], +$node->command_ok([ @pg_basebackup_defs, '-D', "$real_tempdir/backupR", '-R' ], 'pg_basebackup -R runs'); ok(-f "$tempdir/backupR/postgresql.auto.conf", 'postgresql.auto.conf exists'); ok(-f "$tempdir/backupR/standby.signal", 'standby.signal was created'); @@ -457,39 +463,40 @@ like( 'postgresql.auto.conf sets primary_conninfo'); $node->command_ok( - [ @pg_basebackup_defs, '-D', "$tempdir/backupxd" ], + [ @pg_basebackup_defs, '-D', "$real_tempdir/backupxd" ], 'pg_basebackup runs in default xlog mode'); ok(grep(/^[0-9A-F]{24}$/, slurp_dir("$tempdir/backupxd/pg_wal")), 'WAL files copied'); rmtree("$tempdir/backupxd"); $node->command_ok( - [ @pg_basebackup_defs, '-D', "$tempdir/backupxf", '-X', 'fetch' ], + [ @pg_basebackup_defs, '-D', "$real_tempdir/backupxf", '-X', 'fetch' ], 'pg_basebackup -X fetch runs'); ok(grep(/^[0-9A-F]{24}$/, slurp_dir("$tempdir/backupxf/pg_wal")), 'WAL files copied'); rmtree("$tempdir/backupxf"); $node->command_ok( - [ @pg_basebackup_defs, '-D', "$tempdir/backupxs", '-X', 'stream' ], + [ @pg_basebackup_defs, '-D', "$real_tempdir/backupxs", '-X', 'stream' ], 'pg_basebackup -X stream runs'); ok(grep(/^[0-9A-F]{24}$/, slurp_dir("$tempdir/backupxs/pg_wal")), 'WAL files copied'); rmtree("$tempdir/backupxs"); $node->command_ok( - [ @pg_basebackup_defs, '-D', "$tempdir/backupxst", '-X', 'stream', '-Ft' ], + [ @pg_basebackup_defs, + '-D', "$real_tempdir/backupxst", '-X', 'stream', '-Ft' ], 'pg_basebackup -X stream runs in tar mode'); ok(-f "$tempdir/backupxst/pg_wal.tar", "tar file was created"); rmtree("$tempdir/backupxst"); $node->command_ok( [ @pg_basebackup_defs, '-D', - "$tempdir/backupnoslot", '-X', + "$real_tempdir/backupnoslot", '-X', 'stream', '--no-slot' ], 'pg_basebackup -X stream runs with --no-slot'); rmtree("$tempdir/backupnoslot"); $node->command_ok( - [ @pg_basebackup_defs, '-D', "$tempdir/backupxf", '-X', 'fetch' ], + [ @pg_basebackup_defs, '-D', "$real_tempdir/backupxf", '-X', 'fetch' ], 'pg_basebackup -X fetch runs'); $node->command_fails_like( @@ -505,7 +512,8 @@ $node->command_fails_like( qr/unrecognized target/, 'backup target unrecognized'); $node->command_fails_like( - [ @pg_basebackup_defs, '--target', 'blackhole', '-X', 'none', '-D', "$tempdir/blackhole" ], + [ @pg_basebackup_defs, '--target', 'blackhole', '-X', 'none', + '-D', "$real_tempdir/blackhole" ], qr/cannot specify both output directory and backup target/, 'backup target and output directory'); $node->command_fails_like( @@ -516,7 +524,8 @@ $node->command_ok( [ @pg_basebackup_defs, '--target', 'blackhole', '-X', 'none' ], 'backup target blackhole'); $node->command_ok( - [ @pg_basebackup_defs, '--target', "server:$tempdir/backuponserver", '-X', 'none' ], + [ @pg_basebackup_defs, '--target', "server:$real_tempdir/backuponserver", + '-X', 'none' ], 'backup target server'); ok(-f "$tempdir/backuponserver/base.tar", 'backup tar was created'); rmtree("$tempdir/backuponserver"); @@ -524,57 +533,59 @@ rmtree("$tempdir/backuponserver"); $node->command_fails( [ @pg_basebackup_defs, '-D', - "$tempdir/backupxs_sl_fail", '-X', + "$real_tempdir/backupxs_sl_fail", '-X', 'stream', '-S', 'slot0' ], 'pg_basebackup fails with nonexistent replication slot'); $node->command_fails( - [ @pg_basebackup_defs, '-D', "$tempdir/backupxs_slot", '-C' ], + [ @pg_basebackup_defs, '-D', "$real_tempdir/backupxs_slot", '-C' ], 'pg_basebackup -C fails without slot name'); $node->command_fails( [ @pg_basebackup_defs, '-D', - "$tempdir/backupxs_slot", '-C', + "$real_tempdir/backupxs_slot", '-C', '-S', 'slot0', '--no-slot' ], 'pg_basebackup fails with -C -S --no-slot'); $node->command_fails_like( - [ @pg_basebackup_defs, '--target', 'blackhole', '-D', "$tempdir/blackhole" ], + [ @pg_basebackup_defs, '--target', 'blackhole', + '-D', "$real_tempdir/blackhole" ], qr/cannot specify both output directory and backup target/, 'backup target and output directory'); $node->command_ok( - [ @pg_basebackup_defs, '-D', "$tempdir/backuptr/co", '-X', 'none' ], + [ @pg_basebackup_defs, '-D', "$real_tempdir/backuptr/co", '-X', 'none' ], 'pg_basebackup -X fetch runs'); $node->command_fails( [ @pg_basebackup_defs, '-D', - "$tempdir/backupxs_sl_fail", '-X', + "$real_tempdir/backupxs_sl_fail", '-X', 'stream', '-S', 'slot0' ], 'pg_basebackup fails with nonexistent replication slot'); $node->command_fails( - [ @pg_basebackup_defs, '-D', "$tempdir/backupxs_slot", '-C' ], + [ @pg_basebackup_defs, '-D', "$real_tempdir/backupxs_slot", '-C' ], 'pg_basebackup -C fails without slot name'); $node->command_fails( [ @pg_basebackup_defs, '-D', - "$tempdir/backupxs_slot", '-C', + "$real_tempdir/backupxs_slot", '-C', '-S', 'slot0', '--no-slot' ], 'pg_basebackup fails with -C -S --no-slot'); $node->command_ok( - [ @pg_basebackup_defs, '-D', "$tempdir/backupxs_slot", '-C', '-S', 'slot0' ], + [ @pg_basebackup_defs, '-D', "$real_tempdir/backupxs_slot", + '-C', '-S', 'slot0' ], 'pg_basebackup -C runs'); rmtree("$tempdir/backupxs_slot"); @@ -593,7 +604,8 @@ isnt( 'restart LSN of new slot is not null'); $node->command_fails( - [ @pg_basebackup_defs, '-D', "$tempdir/backupxs_slot1", '-C', '-S', 'slot0' ], + [ @pg_basebackup_defs, '-D', "$real_tempdir/backupxs_slot1", + '-C', '-S', 'slot0' ], 'pg_basebackup fails with -C -S and a previously existing slot'); $node->safe_psql('postgres', @@ -603,11 +615,12 @@ my $lsn = $node->safe_psql('postgres', ); is($lsn, '', 'restart LSN of new slot is null'); $node->command_fails( - [ @pg_basebackup_defs, '-D', "$tempdir/fail", '-S', 'slot1', '-X', 'none' ], + [ @pg_basebackup_defs, '-D', "$real_tempdir/fail", + '-S', 'slot1', '-X', 'none' ], 'pg_basebackup with replication slot fails without WAL streaming'); $node->command_ok( [ - @pg_basebackup_defs, '-D', "$tempdir/backupxs_sl", '-X', + @pg_basebackup_defs, '-D', "$real_tempdir/backupxs_sl", '-X', 'stream', '-S', 'slot1' ], 'pg_basebackup -X stream with replication slot runs'); @@ -619,7 +632,7 @@ rmtree("$tempdir/backupxs_sl"); $node->command_ok( [ - @pg_basebackup_defs, '-D', "$tempdir/backupxs_sl_R", '-X', + @pg_basebackup_defs, '-D', "$real_tempdir/backupxs_sl_R", '-X', 'stream', '-S', 'slot1', '-R', ], 'pg_basebackup with replication slot and -R runs'); @@ -653,7 +666,7 @@ close $file; system_or_bail 'pg_ctl', '-D', $pgdata, 'start'; $node->command_checks_all( - [ @pg_basebackup_defs, '-D', "$tempdir/backup_corrupt" ], + [ @pg_basebackup_defs, '-D', "$real_tempdir/backup_corrupt" ], 1, [qr{^$}], [qr/^WARNING.*checksum verification failed/s], @@ -673,7 +686,7 @@ close $file; system_or_bail 'pg_ctl', '-D', $pgdata, 'start'; $node->command_checks_all( - [ @pg_basebackup_defs, '-D', "$tempdir/backup_corrupt2" ], + [ @pg_basebackup_defs, '-D', "$real_tempdir/backup_corrupt2" ], 1, [qr{^$}], [qr/^WARNING.*further.*failures.*will.not.be.reported/s], @@ -689,7 +702,7 @@ close $file; system_or_bail 'pg_ctl', '-D', $pgdata, 'start'; $node->command_checks_all( - [ @pg_basebackup_defs, '-D', "$tempdir/backup_corrupt3" ], + [ @pg_basebackup_defs, '-D', "$real_tempdir/backup_corrupt3" ], 1, [qr{^$}], [qr/^WARNING.*7 total checksum verification failures/s], @@ -700,7 +713,7 @@ rmtree("$tempdir/backup_corrupt3"); $node->command_ok( [ @pg_basebackup_defs, '-D', - "$tempdir/backup_corrupt4", '--no-verify-checksums', + "$real_tempdir/backup_corrupt4", '--no-verify-checksums', ], 'pg_basebackup with -k does not report checksum mismatch'); rmtree("$tempdir/backup_corrupt4"); @@ -719,7 +732,7 @@ SKIP: $node->command_ok( [ @pg_basebackup_defs, '-D', - "$tempdir/backup_gzip", '--compress', + "$real_tempdir/backup_gzip", '--compress', '1', '--format', 't' ], @@ -727,14 +740,14 @@ SKIP: $node->command_ok( [ @pg_basebackup_defs, '-D', - "$tempdir/backup_gzip2", '--gzip', + "$real_tempdir/backup_gzip2", '--gzip', '--format', 't' ], 'pg_basebackup with --gzip'); $node->command_ok( [ @pg_basebackup_defs, '-D', - "$tempdir/backup_gzip3", '--compress', + "$real_tempdir/backup_gzip3", '--compress', 'gzip:1', '--format', 't' ],