|
1 | 1 | use strict; |
2 | 2 | use warnings; |
3 | 3 | use Cwd; |
| 4 | +use Config; |
4 | 5 | use TestLib; |
5 | | -use Test::More tests => 35; |
| 6 | +use Test::More tests => 46; |
6 | 7 |
|
7 | 8 | program_help_ok('pg_basebackup'); |
8 | 9 | program_version_ok('pg_basebackup'); |
|
25 | 26 | close BADCHARS; |
26 | 27 | } |
27 | 28 |
|
28 | | -open HBA, ">>$tempdir/pgdata/pg_hba.conf"; |
29 | | -print HBA "local replication all trust\n"; |
30 | | -print HBA "host replication all 127.0.0.1/32 trust\n"; |
31 | | -print HBA "host replication all ::1/128 trust\n"; |
32 | | -close HBA; |
| 29 | +configure_hba_for_replication "$tempdir/pgdata"; |
33 | 30 | system_or_bail 'pg_ctl', '-D', "$tempdir/pgdata", 'reload'; |
34 | 31 |
|
35 | 32 | command_fails( |
36 | 33 | [ 'pg_basebackup', '-D', "$tempdir/backup" ], |
37 | 34 | 'pg_basebackup fails because of WAL configuration'); |
38 | 35 |
|
39 | 36 | open CONF, ">>$tempdir/pgdata/postgresql.conf"; |
| 37 | +print CONF "max_replication_slots = 10\n"; |
40 | 38 | print CONF "max_wal_senders = 10\n"; |
41 | 39 | print CONF "wal_level = archive\n"; |
42 | 40 | close CONF; |
|
46 | 44 | 'pg_basebackup runs'); |
47 | 45 | ok(-f "$tempdir/backup/PG_VERSION", 'backup was created'); |
48 | 46 |
|
| 47 | +is_deeply([sort(slurp_dir("$tempdir/backup/pg_xlog/"))], |
| 48 | + [sort qw(. .. archive_status)], |
| 49 | + 'no WAL files copied'); |
| 50 | + |
49 | 51 | command_ok( |
50 | 52 | [ 'pg_basebackup', '-D', "$tempdir/backup2", '--xlogdir', |
51 | 53 | "$tempdir/xlog2" ], |
|
57 | 59 | 'tar format'); |
58 | 60 | ok(-f "$tempdir/tarbackup/base.tar", 'backup tar was created'); |
59 | 61 |
|
60 | | -my $superlongname = "superlongname_" . ("x" x 100); |
61 | | - |
62 | | -system_or_bail 'touch', "$tempdir/pgdata/$superlongname"; |
63 | | -command_fails([ 'pg_basebackup', '-D', "$tempdir/tarbackup_l1", '-Ft' ], |
64 | | - 'pg_basebackup tar with long name fails'); |
65 | | -unlink "$tempdir/pgdata/$superlongname"; |
66 | | - |
67 | | -# Create a temporary directory in the system location and symlink it |
68 | | -# to our physical temp location. That way we can use shorter names |
69 | | -# for the tablespace directories, which hopefully won't run afoul of |
70 | | -# the 99 character length limit. |
71 | | -my $shorter_tempdir = tempdir_short . "/tempdir"; |
72 | | -symlink "$tempdir", $shorter_tempdir; |
73 | | - |
74 | | -mkdir "$tempdir/tblspc1"; |
75 | | -psql 'postgres', |
76 | | - "CREATE TABLESPACE tblspc1 LOCATION '$shorter_tempdir/tblspc1';"; |
77 | | -psql 'postgres', "CREATE TABLE test1 (a int) TABLESPACE tblspc1;"; |
78 | | -command_ok([ 'pg_basebackup', '-D', "$tempdir/tarbackup2", '-Ft' ], |
79 | | - 'tar format with tablespaces'); |
80 | | -ok(-f "$tempdir/tarbackup2/base.tar", 'backup tar was created'); |
81 | | -my @tblspc_tars = glob "$tempdir/tarbackup2/[0-9]*.tar"; |
82 | | -is(scalar(@tblspc_tars), 1, 'one tablespace tar was created'); |
83 | | - |
84 | | -command_fails( |
85 | | - [ 'pg_basebackup', '-D', "$tempdir/backup1", '-Fp' ], |
86 | | - 'plain format with tablespaces fails without tablespace mapping'); |
87 | | - |
88 | | -command_ok( |
89 | | - [ 'pg_basebackup', '-D', "$tempdir/backup1", '-Fp', |
90 | | - "-T$shorter_tempdir/tblspc1=$tempdir/tbackup/tblspc1" ], |
91 | | - 'plain format with tablespaces succeeds with tablespace mapping'); |
92 | | -ok(-d "$tempdir/tbackup/tblspc1", 'tablespace was relocated'); |
93 | | -opendir(my $dh, "$tempdir/pgdata/pg_tblspc") or die; |
94 | | -ok( ( grep { |
95 | | - -l "$tempdir/backup1/pg_tblspc/$_" |
96 | | - and readlink "$tempdir/backup1/pg_tblspc/$_" eq |
97 | | - "$tempdir/tbackup/tblspc1" |
98 | | - } readdir($dh)), |
99 | | - "tablespace symlink was updated"); |
100 | | -closedir $dh; |
101 | | - |
102 | | -mkdir "$tempdir/tbl=spc2"; |
103 | | -psql 'postgres', "DROP TABLE test1;"; |
104 | | -psql 'postgres', "DROP TABLESPACE tblspc1;"; |
105 | | -psql 'postgres', |
106 | | - "CREATE TABLESPACE tblspc2 LOCATION '$shorter_tempdir/tbl=spc2';"; |
107 | | -command_ok( |
108 | | - [ 'pg_basebackup', '-D', "$tempdir/backup3", '-Fp', |
109 | | - "-T$shorter_tempdir/tbl\\=spc2=$tempdir/tbackup/tbl\\=spc2" ], |
110 | | - 'mapping tablespace with = sign in path'); |
111 | | -ok(-d "$tempdir/tbackup/tbl=spc2", 'tablespace with = sign was relocated'); |
112 | | - |
113 | | -psql 'postgres', "DROP TABLESPACE tblspc2;"; |
114 | | - |
115 | 62 | command_fails( |
116 | 63 | [ 'pg_basebackup', '-D', "$tempdir/backup_foo", '-Fp', "-T=/foo" ], |
117 | 64 | '-T with empty old directory fails'); |
|
132 | 79 | [ 'pg_basebackup', '-D', "$tempdir/backup_foo", '-Fp', "-Tfoo" ], |
133 | 80 | '-T with invalid format fails'); |
134 | 81 |
|
135 | | -mkdir "$tempdir/$superlongname"; |
136 | | -psql 'postgres', |
137 | | - "CREATE TABLESPACE tblspc3 LOCATION '$tempdir/$superlongname';"; |
138 | | -command_ok([ 'pg_basebackup', '-D', "$tempdir/tarbackup_l3", '-Ft' ], |
139 | | - 'pg_basebackup tar with long symlink target'); |
140 | | -psql 'postgres', "DROP TABLESPACE tblspc3;"; |
| 82 | +# Tar format doesn't support filenames longer than 100 bytes. |
| 83 | +my $superlongname = "superlongname_" . ("x" x 100); |
| 84 | +my $superlongpath = "$tempdir/pgdata/$superlongname"; |
| 85 | + |
| 86 | +open FILE, ">$superlongpath" or die "unable to create file $superlongpath"; |
| 87 | +close FILE; |
| 88 | +command_fails([ 'pg_basebackup', '-D', "$tempdir/tarbackup_l1", '-Ft' ], |
| 89 | + 'pg_basebackup tar with long name fails'); |
| 90 | +unlink "$tempdir/pgdata/$superlongname"; |
| 91 | + |
| 92 | +# The following tests test symlinks. Windows doesn't have symlinks, so |
| 93 | +# skip on Windows. |
| 94 | +SKIP: { |
| 95 | + skip "symlinks not supported on Windows", 10 if ($windows_os); |
| 96 | + |
| 97 | + # Create a temporary directory in the system location and symlink it |
| 98 | + # to our physical temp location. That way we can use shorter names |
| 99 | + # for the tablespace directories, which hopefully won't run afoul of |
| 100 | + # the 99 character length limit. |
| 101 | + my $shorter_tempdir = tempdir_short . "/tempdir"; |
| 102 | + symlink "$tempdir", $shorter_tempdir; |
| 103 | + |
| 104 | + mkdir "$tempdir/tblspc1"; |
| 105 | + psql 'postgres', |
| 106 | + "CREATE TABLESPACE tblspc1 LOCATION '$shorter_tempdir/tblspc1';"; |
| 107 | + psql 'postgres', "CREATE TABLE test1 (a int) TABLESPACE tblspc1;"; |
| 108 | + command_ok([ 'pg_basebackup', '-D', "$tempdir/tarbackup2", '-Ft' ], |
| 109 | + 'tar format with tablespaces'); |
| 110 | + ok(-f "$tempdir/tarbackup2/base.tar", 'backup tar was created'); |
| 111 | + my @tblspc_tars = glob "$tempdir/tarbackup2/[0-9]*.tar"; |
| 112 | + is(scalar(@tblspc_tars), 1, 'one tablespace tar was created'); |
| 113 | + |
| 114 | + command_fails( |
| 115 | + [ 'pg_basebackup', '-D', "$tempdir/backup1", '-Fp' ], |
| 116 | + 'plain format with tablespaces fails without tablespace mapping'); |
| 117 | + |
| 118 | + command_ok( |
| 119 | + [ 'pg_basebackup', '-D', "$tempdir/backup1", '-Fp', |
| 120 | + "-T$shorter_tempdir/tblspc1=$tempdir/tbackup/tblspc1" ], |
| 121 | + 'plain format with tablespaces succeeds with tablespace mapping'); |
| 122 | + ok(-d "$tempdir/tbackup/tblspc1", 'tablespace was relocated'); |
| 123 | + opendir(my $dh, "$tempdir/pgdata/pg_tblspc") or die; |
| 124 | + ok( ( grep { |
| 125 | + -l "$tempdir/backup1/pg_tblspc/$_" |
| 126 | + and readlink "$tempdir/backup1/pg_tblspc/$_" eq |
| 127 | + "$tempdir/tbackup/tblspc1" |
| 128 | + } readdir($dh)), |
| 129 | + "tablespace symlink was updated"); |
| 130 | + closedir $dh; |
| 131 | + |
| 132 | + mkdir "$tempdir/tbl=spc2"; |
| 133 | + psql 'postgres', "DROP TABLE test1;"; |
| 134 | + psql 'postgres', "DROP TABLESPACE tblspc1;"; |
| 135 | + psql 'postgres', |
| 136 | + "CREATE TABLESPACE tblspc2 LOCATION '$shorter_tempdir/tbl=spc2';"; |
| 137 | + command_ok( |
| 138 | + [ 'pg_basebackup', '-D', "$tempdir/backup3", '-Fp', |
| 139 | + "-T$shorter_tempdir/tbl\\=spc2=$tempdir/tbackup/tbl\\=spc2" ], |
| 140 | + 'mapping tablespace with = sign in path'); |
| 141 | + ok(-d "$tempdir/tbackup/tbl=spc2", 'tablespace with = sign was relocated'); |
| 142 | + psql 'postgres', "DROP TABLESPACE tblspc2;"; |
| 143 | + |
| 144 | + mkdir "$tempdir/$superlongname"; |
| 145 | + psql 'postgres', |
| 146 | + "CREATE TABLESPACE tblspc3 LOCATION '$tempdir/$superlongname';"; |
| 147 | + command_ok([ 'pg_basebackup', '-D', "$tempdir/tarbackup_l3", '-Ft' ], |
| 148 | + 'pg_basebackup tar with long symlink target'); |
| 149 | + psql 'postgres', "DROP TABLESPACE tblspc3;"; |
| 150 | +} |
| 151 | + |
| 152 | +command_ok([ 'pg_basebackup', '-D', "$tempdir/backupR", '-R' ], |
| 153 | + 'pg_basebackup -R runs'); |
| 154 | +ok(-f "$tempdir/backupR/recovery.conf", 'recovery.conf was created'); |
| 155 | +my $recovery_conf = slurp_file "$tempdir/backupR/recovery.conf"; |
| 156 | +# using a character class for the final "'" here works around an apparent |
| 157 | +# bug in several version of the Msys DTK perl |
| 158 | +like($recovery_conf, qr/^standby_mode = 'on[']$/m, 'recovery.conf sets standby_mode'); |
| 159 | +like($recovery_conf, qr/^primary_conninfo = '.*port=$ENV{PGPORT}.*'$/m, 'recovery.conf sets primary_conninfo'); |
| 160 | + |
| 161 | +command_ok([ 'pg_basebackup', '-D', "$tempdir/backupxf", '-X', 'fetch' ], |
| 162 | + 'pg_basebackup -X fetch runs'); |
| 163 | +ok(grep(/^[0-9A-F]{24}$/, slurp_dir("$tempdir/backupxf/pg_xlog")), 'WAL files copied'); |
| 164 | +command_ok([ 'pg_basebackup', '-D', "$tempdir/backupxs", '-X', 'stream' ], |
| 165 | + 'pg_basebackup -X stream runs'); |
| 166 | +ok(grep(/^[0-9A-F]{24}$/, slurp_dir("$tempdir/backupxf/pg_xlog")), 'WAL files copied'); |
| 167 | + |
| 168 | +command_fails([ 'pg_basebackup', '-D', "$tempdir/fail", '-S', 'slot1' ], |
| 169 | + 'pg_basebackup with replication slot fails without -X stream'); |
| 170 | +command_fails([ 'pg_basebackup', '-D', "$tempdir/backupxs_sl_fail", '-X', 'stream', '-S', 'slot1' ], |
| 171 | + 'pg_basebackup fails with nonexistent replication slot'); |
0 commit comments