diff options
Diffstat (limited to 'src/bin/pg_basebackup/t/010_pg_basebackup.pl')
-rw-r--r-- | src/bin/pg_basebackup/t/010_pg_basebackup.pl | 139 |
1 files changed, 72 insertions, 67 deletions
diff --git a/src/bin/pg_basebackup/t/010_pg_basebackup.pl b/src/bin/pg_basebackup/t/010_pg_basebackup.pl index b605fa91c01..4dbf8ca5224 100644 --- a/src/bin/pg_basebackup/t/010_pg_basebackup.pl +++ b/src/bin/pg_basebackup/t/010_pg_basebackup.pl @@ -1,6 +1,7 @@ use strict; use warnings; use Cwd; +use Config; use TestLib; use Test::More tests => 51; @@ -25,11 +26,7 @@ if (open BADCHARS, ">>$tempdir/pgdata/FOO\xe0\xe0\xe0BAR") close BADCHARS; } -open HBA, ">>$tempdir/pgdata/pg_hba.conf"; -print HBA "local replication all trust\n"; -print HBA "host replication all 127.0.0.1/32 trust\n"; -print HBA "host replication all ::1/128 trust\n"; -close HBA; +configure_hba_for_replication "$tempdir/pgdata"; system_or_bail 'pg_ctl', '-D', "$tempdir/pgdata", 'reload'; command_fails( @@ -62,61 +59,6 @@ command_ok([ 'pg_basebackup', '-D', "$tempdir/tarbackup", '-Ft' ], 'tar format'); ok(-f "$tempdir/tarbackup/base.tar", 'backup tar was created'); -my $superlongname = "superlongname_" . ("x" x 100); - -system_or_bail 'touch', "$tempdir/pgdata/$superlongname"; -command_fails([ 'pg_basebackup', '-D', "$tempdir/tarbackup_l1", '-Ft' ], - 'pg_basebackup tar with long name fails'); -unlink "$tempdir/pgdata/$superlongname"; - -# Create a temporary directory in the system location and symlink it -# to our physical temp location. That way we can use shorter names -# for the tablespace directories, which hopefully won't run afoul of -# the 99 character length limit. -my $shorter_tempdir = tempdir_short . "/tempdir"; -symlink "$tempdir", $shorter_tempdir; - -mkdir "$tempdir/tblspc1"; -psql 'postgres', - "CREATE TABLESPACE tblspc1 LOCATION '$shorter_tempdir/tblspc1';"; -psql 'postgres', "CREATE TABLE test1 (a int) TABLESPACE tblspc1;"; -command_ok([ 'pg_basebackup', '-D', "$tempdir/tarbackup2", '-Ft' ], - 'tar format with tablespaces'); -ok(-f "$tempdir/tarbackup2/base.tar", 'backup tar was created'); -my @tblspc_tars = glob "$tempdir/tarbackup2/[0-9]*.tar"; -is(scalar(@tblspc_tars), 1, 'one tablespace tar was created'); - -command_fails( - [ 'pg_basebackup', '-D', "$tempdir/backup1", '-Fp' ], - 'plain format with tablespaces fails without tablespace mapping'); - -command_ok( - [ 'pg_basebackup', '-D', "$tempdir/backup1", '-Fp', - "-T$shorter_tempdir/tblspc1=$tempdir/tbackup/tblspc1" ], - 'plain format with tablespaces succeeds with tablespace mapping'); -ok(-d "$tempdir/tbackup/tblspc1", 'tablespace was relocated'); -opendir(my $dh, "$tempdir/pgdata/pg_tblspc") or die; -ok( ( grep { - -l "$tempdir/backup1/pg_tblspc/$_" - and readlink "$tempdir/backup1/pg_tblspc/$_" eq - "$tempdir/tbackup/tblspc1" - } readdir($dh)), - "tablespace symlink was updated"); -closedir $dh; - -mkdir "$tempdir/tbl=spc2"; -psql 'postgres', "DROP TABLE test1;"; -psql 'postgres', "DROP TABLESPACE tblspc1;"; -psql 'postgres', - "CREATE TABLESPACE tblspc2 LOCATION '$shorter_tempdir/tbl=spc2';"; -command_ok( - [ 'pg_basebackup', '-D', "$tempdir/backup3", '-Fp', - "-T$shorter_tempdir/tbl\\=spc2=$tempdir/tbackup/tbl\\=spc2" ], - 'mapping tablespace with = sign in path'); -ok(-d "$tempdir/tbackup/tbl=spc2", 'tablespace with = sign was relocated'); - -psql 'postgres', "DROP TABLESPACE tblspc2;"; - command_fails( [ 'pg_basebackup', '-D', "$tempdir/backup_foo", '-Fp', "-T=/foo" ], '-T with empty old directory fails'); @@ -137,12 +79,75 @@ command_fails( [ 'pg_basebackup', '-D', "$tempdir/backup_foo", '-Fp', "-Tfoo" ], '-T with invalid format fails'); -mkdir "$tempdir/$superlongname"; -psql 'postgres', - "CREATE TABLESPACE tblspc3 LOCATION '$tempdir/$superlongname';"; -command_ok([ 'pg_basebackup', '-D', "$tempdir/tarbackup_l3", '-Ft' ], - 'pg_basebackup tar with long symlink target'); -psql 'postgres', "DROP TABLESPACE tblspc3;"; +# Tar format doesn't support filenames longer than 100 bytes. +my $superlongname = "superlongname_" . ("x" x 100); +my $superlongpath = "$tempdir/pgdata/$superlongname"; + +open FILE, ">$superlongpath" or die "unable to create file $superlongpath"; +close FILE; +command_fails([ 'pg_basebackup', '-D', "$tempdir/tarbackup_l1", '-Ft' ], + 'pg_basebackup tar with long name fails'); +unlink "$tempdir/pgdata/$superlongname"; + +# The following tests test symlinks. Windows doesn't have symlinks, so +# skip on Windows. +SKIP: { + skip "symlinks not supported on Windows", 10 if ($Config{osname} eq "MSWin32"); + + # Create a temporary directory in the system location and symlink it + # to our physical temp location. That way we can use shorter names + # for the tablespace directories, which hopefully won't run afoul of + # the 99 character length limit. + my $shorter_tempdir = tempdir_short . "/tempdir"; + symlink "$tempdir", $shorter_tempdir; + + mkdir "$tempdir/tblspc1"; + psql 'postgres', + "CREATE TABLESPACE tblspc1 LOCATION '$shorter_tempdir/tblspc1';"; + psql 'postgres', "CREATE TABLE test1 (a int) TABLESPACE tblspc1;"; + command_ok([ 'pg_basebackup', '-D', "$tempdir/tarbackup2", '-Ft' ], + 'tar format with tablespaces'); + ok(-f "$tempdir/tarbackup2/base.tar", 'backup tar was created'); + my @tblspc_tars = glob "$tempdir/tarbackup2/[0-9]*.tar"; + is(scalar(@tblspc_tars), 1, 'one tablespace tar was created'); + + command_fails( + [ 'pg_basebackup', '-D', "$tempdir/backup1", '-Fp' ], + 'plain format with tablespaces fails without tablespace mapping'); + + command_ok( + [ 'pg_basebackup', '-D', "$tempdir/backup1", '-Fp', + "-T$shorter_tempdir/tblspc1=$tempdir/tbackup/tblspc1" ], + 'plain format with tablespaces succeeds with tablespace mapping'); + ok(-d "$tempdir/tbackup/tblspc1", 'tablespace was relocated'); + opendir(my $dh, "$tempdir/pgdata/pg_tblspc") or die; + ok( ( grep { + -l "$tempdir/backup1/pg_tblspc/$_" + and readlink "$tempdir/backup1/pg_tblspc/$_" eq + "$tempdir/tbackup/tblspc1" + } readdir($dh)), + "tablespace symlink was updated"); + closedir $dh; + + mkdir "$tempdir/tbl=spc2"; + psql 'postgres', "DROP TABLE test1;"; + psql 'postgres', "DROP TABLESPACE tblspc1;"; + psql 'postgres', + "CREATE TABLESPACE tblspc2 LOCATION '$shorter_tempdir/tbl=spc2';"; + command_ok( + [ 'pg_basebackup', '-D', "$tempdir/backup3", '-Fp', + "-T$shorter_tempdir/tbl\\=spc2=$tempdir/tbackup/tbl\\=spc2" ], + 'mapping tablespace with = sign in path'); + ok(-d "$tempdir/tbackup/tbl=spc2", 'tablespace with = sign was relocated'); + psql 'postgres', "DROP TABLESPACE tblspc2;"; + + mkdir "$tempdir/$superlongname"; + psql 'postgres', + "CREATE TABLESPACE tblspc3 LOCATION '$tempdir/$superlongname';"; + command_ok([ 'pg_basebackup', '-D', "$tempdir/tarbackup_l3", '-Ft' ], + 'pg_basebackup tar with long symlink target'); + psql 'postgres', "DROP TABLESPACE tblspc3;"; +} command_ok([ 'pg_basebackup', '-D', "$tempdir/backupR", '-R' ], 'pg_basebackup -R runs'); @@ -169,7 +174,7 @@ is($lsn, '', 'restart LSN of new slot is null'); command_ok([ 'pg_basebackup', '-D', "$tempdir/backupxs_sl", '-X', 'stream', '-S', 'slot1' ], 'pg_basebackup -X stream with replication slot runs'); $lsn = psql 'postgres', q{SELECT restart_lsn FROM pg_replication_slots WHERE slot_name = 'slot1'}; -like($lsn, qr!^0/[0-9A-Z]{8}$!, 'restart LSN of slot has advanced'); +like($lsn, qr!^0/[0-9A-Z]{7,8}$!, 'restart LSN of slot has advanced'); command_ok([ 'pg_basebackup', '-D', "$tempdir/backupxs_sl_R", '-X', 'stream', '-S', 'slot1', '-R' ], 'pg_basebackup with replication slot and -R runs'); |