|
2 | 2 | use warnings;
|
3 | 3 | use Cwd;
|
4 | 4 | use Config;
|
| 5 | +use PostgresNode; |
5 | 6 | use TestLib;
|
6 | 7 | use Test::Moretests=> 51;
|
7 | 8 |
|
8 | 9 | program_help_ok('pg_basebackup');
|
9 | 10 | program_version_ok('pg_basebackup');
|
10 | 11 | program_options_handling_ok('pg_basebackup');
|
11 | 12 |
|
12 |
| -my$tempdir = tempdir; |
13 |
| -start_test_server$tempdir; |
| 13 | +my$tempdir = TestLib::tempdir; |
14 | 14 |
|
15 |
| -command_fails(['pg_basebackup'], |
| 15 | +my$node = get_new_node(); |
| 16 | + |
| 17 | +# Initialize node without replication settings |
| 18 | +$node->init(hba_permit_replication=> 0); |
| 19 | +$node->start; |
| 20 | +my$pgdata =$node->data_dir; |
| 21 | + |
| 22 | +$node->command_fails(['pg_basebackup'], |
16 | 23 | 'pg_basebackup needs target directory specified');
|
17 |
| -command_fails( |
| 24 | +$node->command_fails( |
18 | 25 | ['pg_basebackup','-D',"$tempdir/backup" ],
|
19 | 26 | 'pg_basebackup fails because of hba');
|
20 | 27 |
|
|
26 | 33 | close BADCHARS;
|
27 | 34 | }
|
28 | 35 |
|
29 |
| -configure_hba_for_replication"$tempdir/pgdata"; |
30 |
| -system_or_bail'pg_ctl','-D',"$tempdir/pgdata",'reload'; |
| 36 | +$node->set_replication_conf(); |
| 37 | +system_or_bail'pg_ctl','-D',$pgdata,'reload'; |
31 | 38 |
|
32 |
| -command_fails( |
| 39 | +$node->command_fails( |
33 | 40 | ['pg_basebackup','-D',"$tempdir/backup" ],
|
34 | 41 | 'pg_basebackup fails because of WAL configuration');
|
35 | 42 |
|
36 |
| -open CONF,">>$tempdir/pgdata/postgresql.conf"; |
| 43 | +open CONF,">>$pgdata/postgresql.conf"; |
37 | 44 | print CONF"max_replication_slots = 10\n";
|
38 | 45 | print CONF"max_wal_senders = 10\n";
|
39 | 46 | print CONF"wal_level = archive\n";
|
40 | 47 | close CONF;
|
41 |
| -restart_test_server; |
| 48 | +$node->restart; |
42 | 49 |
|
43 |
| -command_ok(['pg_basebackup','-D',"$tempdir/backup" ], |
| 50 | +$node->command_ok(['pg_basebackup','-D',"$tempdir/backup" ], |
44 | 51 | 'pg_basebackup runs');
|
45 | 52 | ok(-f"$tempdir/backup/PG_VERSION",'backup was created');
|
46 | 53 |
|
47 |
| -is_deeply([sort(slurp_dir("$tempdir/backup/pg_xlog/"))], |
48 |
| - [sortqw(. .. archive_status)], |
49 |
| -'no WAL files copied'); |
| 54 | +is_deeply( |
| 55 | +[sort(slurp_dir("$tempdir/backup/pg_xlog/")) ], |
| 56 | +[sortqw(. .. archive_status) ], |
| 57 | +'no WAL files copied'); |
50 | 58 |
|
51 |
| -command_ok( |
| 59 | +$node->command_ok( |
52 | 60 | ['pg_basebackup','-D',"$tempdir/backup2",'--xlogdir',
|
53 | 61 | "$tempdir/xlog2" ],
|
54 | 62 | 'separate xlog directory');
|
55 | 63 | ok(-f"$tempdir/backup2/PG_VERSION",'backup was created');
|
56 | 64 | ok(-d"$tempdir/xlog2/",'xlog directory was created');
|
57 | 65 |
|
58 |
| -command_ok(['pg_basebackup','-D',"$tempdir/tarbackup",'-Ft' ], |
| 66 | +$node->command_ok(['pg_basebackup','-D',"$tempdir/tarbackup",'-Ft' ], |
59 | 67 | 'tar format');
|
60 | 68 | ok(-f"$tempdir/tarbackup/base.tar",'backup tar was created');
|
61 | 69 |
|
62 |
| -command_fails( |
| 70 | +$node->command_fails( |
63 | 71 | ['pg_basebackup','-D',"$tempdir/backup_foo",'-Fp',"-T=/foo" ],
|
64 | 72 | '-T with empty old directory fails');
|
65 |
| -command_fails( |
| 73 | +$node->command_fails( |
66 | 74 | ['pg_basebackup','-D',"$tempdir/backup_foo",'-Fp',"-T/foo=" ],
|
67 | 75 | '-T with empty new directory fails');
|
68 |
| -command_fails( |
| 76 | +$node->command_fails( |
69 | 77 | ['pg_basebackup','-D',"$tempdir/backup_foo",'-Fp',
|
70 | 78 | "-T/foo=/bar=/baz" ],
|
71 | 79 | '-T with multiple = fails');
|
72 |
| -command_fails( |
| 80 | +$node->command_fails( |
73 | 81 | ['pg_basebackup','-D',"$tempdir/backup_foo",'-Fp',"-Tfoo=/bar" ],
|
74 | 82 | '-T with old directory not absolute fails');
|
75 |
| -command_fails( |
| 83 | +$node->command_fails( |
76 | 84 | ['pg_basebackup','-D',"$tempdir/backup_foo",'-Fp',"-T/foo=bar" ],
|
77 | 85 | '-T with new directory not absolute fails');
|
78 |
| -command_fails( |
| 86 | +$node->command_fails( |
79 | 87 | ['pg_basebackup','-D',"$tempdir/backup_foo",'-Fp',"-Tfoo" ],
|
80 | 88 | '-T with invalid format fails');
|
81 | 89 |
|
82 | 90 | # Tar format doesn't support filenames longer than 100 bytes.
|
83 | 91 | my$superlongname ="superlongname_" . ("x"x100);
|
84 |
| -my$superlongpath ="$tempdir/pgdata/$superlongname"; |
| 92 | +my$superlongpath ="$pgdata/$superlongname"; |
85 | 93 |
|
86 | 94 | open FILE,">$superlongpath"ordie"unable to create file$superlongpath";
|
87 | 95 | close FILE;
|
88 |
| -command_fails(['pg_basebackup','-D',"$tempdir/tarbackup_l1",'-Ft' ], |
| 96 | +$node->command_fails( |
| 97 | +['pg_basebackup','-D',"$tempdir/tarbackup_l1",'-Ft' ], |
89 | 98 | 'pg_basebackup tar with long name fails');
|
90 |
| -unlink"$tempdir/pgdata/$superlongname"; |
| 99 | +unlink"$pgdata/$superlongname"; |
91 | 100 |
|
92 | 101 | # The following tests test symlinks. Windows doesn't have symlinks, so
|
93 | 102 | # skip on Windows.
|
94 |
| -SKIP: { |
95 |
| - skip"symlinks not supported on Windows", 10if ($windows_os); |
| 103 | +SKIP: |
| 104 | +{ |
| 105 | +skip"symlinks not supported on Windows", 10if ($windows_os); |
96 | 106 |
|
97 | 107 | # Create a temporary directory in the system location and symlink it
|
98 | 108 | # to our physical temp location. That way we can use shorter names
|
99 | 109 | # for the tablespace directories, which hopefully won't run afoul of
|
100 | 110 | # the 99 character length limit.
|
101 |
| -my$shorter_tempdir = tempdir_short ."/tempdir"; |
| 111 | +my$shorter_tempdir =TestLib::tempdir_short ."/tempdir"; |
102 | 112 | symlink"$tempdir",$shorter_tempdir;
|
103 | 113 |
|
104 | 114 | 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'); |
| 115 | +$node->psql('postgres', |
| 116 | +"CREATE TABLESPACE tblspc1 LOCATION '$shorter_tempdir/tblspc1';"); |
| 117 | +$node->psql('postgres',"CREATE TABLE test1 (a int) TABLESPACE tblspc1;"); |
| 118 | +$node->command_ok(['pg_basebackup','-D',"$tempdir/tarbackup2",'-Ft' ], |
| 119 | +'tar format with tablespaces'); |
110 | 120 | ok(-f"$tempdir/tarbackup2/base.tar",'backup tar was created');
|
111 | 121 | my@tblspc_tars =glob"$tempdir/tarbackup2/[0-9]*.tar";
|
112 | 122 | is(scalar(@tblspc_tars), 1,'one tablespace tar was created');
|
113 | 123 |
|
114 |
| -command_fails( |
| 124 | +$node->command_fails( |
115 | 125 | ['pg_basebackup','-D',"$tempdir/backup1",'-Fp' ],
|
116 | 126 | 'plain format with tablespaces fails without tablespace mapping');
|
117 | 127 |
|
118 |
| -command_ok( |
| 128 | +$node->command_ok( |
119 | 129 | ['pg_basebackup','-D',"$tempdir/backup1",'-Fp',
|
120 | 130 | "-T$shorter_tempdir/tblspc1=$tempdir/tbackup/tblspc1" ],
|
121 | 131 | 'plain format with tablespaces succeeds with tablespace mapping');
|
122 | 132 | ok(-d"$tempdir/tbackup/tblspc1",'tablespace was relocated');
|
123 |
| -opendir(my$dh,"$tempdir/pgdata/pg_tblspc")ordie; |
| 133 | +opendir(my$dh,"$pgdata/pg_tblspc")ordie; |
124 | 134 | ok( (grep {
|
125 |
| --l"$tempdir/backup1/pg_tblspc/$_" |
126 |
| -andreadlink"$tempdir/backup1/pg_tblspc/$_"eq |
127 |
| -"$tempdir/tbackup/tblspc1" |
128 |
| -}readdir($dh)), |
| 135 | +-l"$tempdir/backup1/pg_tblspc/$_" |
| 136 | +andreadlink"$tempdir/backup1/pg_tblspc/$_"eq |
| 137 | +"$tempdir/tbackup/tblspc1" |
| 138 | +}readdir($dh)), |
129 | 139 | "tablespace symlink was updated");
|
130 | 140 | closedir$dh;
|
131 | 141 |
|
132 | 142 | 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( |
| 143 | +$node->psql('postgres',"DROP TABLE test1;"); |
| 144 | +$node->psql('postgres',"DROP TABLESPACE tblspc1;"); |
| 145 | +$node->psql('postgres', |
| 146 | +"CREATE TABLESPACE tblspc2 LOCATION '$shorter_tempdir/tbl=spc2';"); |
| 147 | +$node->command_ok( |
138 | 148 | ['pg_basebackup','-D',"$tempdir/backup3",'-Fp',
|
139 | 149 | "-T$shorter_tempdir/tbl\\=spc2=$tempdir/tbackup/tbl\\=spc2" ],
|
140 | 150 | 'mapping tablespace with = sign in path');
|
141 |
| -ok(-d"$tempdir/tbackup/tbl=spc2",'tablespace with = sign was relocated'); |
142 |
| -psql'postgres',"DROP TABLESPACE tblspc2;"; |
| 151 | +ok(-d"$tempdir/tbackup/tbl=spc2", |
| 152 | +'tablespace with = sign was relocated'); |
| 153 | +$node->psql('postgres',"DROP TABLESPACE tblspc2;"); |
143 | 154 |
|
144 | 155 | 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;"; |
| 156 | +$node->psql('postgres', |
| 157 | +"CREATE TABLESPACE tblspc3 LOCATION '$tempdir/$superlongname';"); |
| 158 | +$node->command_ok( |
| 159 | +['pg_basebackup','-D',"$tempdir/tarbackup_l3",'-Ft' ], |
| 160 | +'pg_basebackup tar with long symlink target'); |
| 161 | +$node->psql('postgres',"DROP TABLESPACE tblspc3;"); |
150 | 162 | }
|
151 | 163 |
|
152 |
| -command_ok(['pg_basebackup','-D',"$tempdir/backupR",'-R' ], |
| 164 | +$node->command_ok(['pg_basebackup','-D',"$tempdir/backupR",'-R' ], |
153 | 165 | 'pg_basebackup -R runs');
|
154 | 166 | ok(-f"$tempdir/backupR/recovery.conf",'recovery.conf was created');
|
155 | 167 | my$recovery_conf = slurp_file"$tempdir/backupR/recovery.conf";
|
| 168 | + |
156 | 169 | # using a character class for the final "'" here works around an apparent
|
157 | 170 | # 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' ], |
| 171 | +like( |
| 172 | +$recovery_conf, |
| 173 | +qr/^standby_mode = 'on[']$/m, |
| 174 | +'recovery.conf sets standby_mode'); |
| 175 | +like( |
| 176 | +$recovery_conf, |
| 177 | +qr/^primary_conninfo = '.*port=$ENV{PGPORT}.*'$/m, |
| 178 | +'recovery.conf sets primary_conninfo'); |
| 179 | + |
| 180 | +$node->command_ok( |
| 181 | +['pg_basebackup','-D',"$tempdir/backupxf",'-X','fetch' ], |
162 | 182 | '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' ], |
| 183 | +ok(grep(/^[0-9A-F]{24}$/, slurp_dir("$tempdir/backupxf/pg_xlog")), |
| 184 | +'WAL files copied'); |
| 185 | +$node->command_ok( |
| 186 | +['pg_basebackup','-D',"$tempdir/backupxs",'-X','stream' ], |
165 | 187 | 'pg_basebackup -X stream runs');
|
166 |
| -ok(grep(/^[0-9A-F]{24}$/, slurp_dir("$tempdir/backupxf/pg_xlog")),'WAL files copied'); |
| 188 | +ok(grep(/^[0-9A-F]{24}$/, slurp_dir("$tempdir/backupxf/pg_xlog")), |
| 189 | +'WAL files copied'); |
167 | 190 |
|
168 |
| -command_fails(['pg_basebackup','-D',"$tempdir/fail",'-S','slot1' ], |
| 191 | +$node->command_fails( |
| 192 | +['pg_basebackup','-D',"$tempdir/fail",'-S','slot1' ], |
169 | 193 | 'pg_basebackup with replication slot fails without -X stream');
|
170 |
| -command_fails(['pg_basebackup','-D',"$tempdir/backupxs_sl_fail",'-X','stream','-S','slot1' ], |
| 194 | +$node->command_fails( |
| 195 | +['pg_basebackup','-D', |
| 196 | +"$tempdir/backupxs_sl_fail",'-X', |
| 197 | +'stream','-S', |
| 198 | +'slot1' ], |
171 | 199 | 'pg_basebackup fails with nonexistent replication slot');
|
172 | 200 |
|
173 |
| -psql'postgres',q{SELECT * FROM pg_create_physical_replication_slot('slot1')}; |
174 |
| -my$lsn = psql'postgres',q{SELECT restart_lsn FROM pg_replication_slots WHERE slot_name = 'slot1'}; |
| 201 | +$node->psql('postgres', |
| 202 | +q{SELECT * FROM pg_create_physical_replication_slot('slot1')}); |
| 203 | +my$lsn =$node->psql('postgres', |
| 204 | +q{SELECT restart_lsn FROM pg_replication_slots WHERE slot_name = 'slot1'} |
| 205 | +); |
175 | 206 | is($lsn,'','restart LSN of new slot is null');
|
176 |
| -command_ok(['pg_basebackup','-D',"$tempdir/backupxs_sl",'-X','stream','-S','slot1' ], |
| 207 | +$node->command_ok( |
| 208 | +['pg_basebackup','-D',"$tempdir/backupxs_sl",'-X', |
| 209 | +'stream','-S','slot1' ], |
177 | 210 | 'pg_basebackup -X stream with replication slot runs');
|
178 |
| -$lsn = psql'postgres',q{SELECT restart_lsn FROM pg_replication_slots WHERE slot_name = 'slot1'}; |
| 211 | +$lsn =$node->psql('postgres', |
| 212 | +q{SELECT restart_lsn FROM pg_replication_slots WHERE slot_name = 'slot1'} |
| 213 | +); |
179 | 214 | like($lsn,qr!^0/[0-9A-Z]{7,8}$!,'restart LSN of slot has advanced');
|
180 | 215 |
|
181 |
| -command_ok(['pg_basebackup','-D',"$tempdir/backupxs_sl_R",'-X','stream','-S','slot1','-R' ], |
| 216 | +$node->command_ok( |
| 217 | +['pg_basebackup','-D',"$tempdir/backupxs_sl_R",'-X', |
| 218 | +'stream','-S','slot1','-R' ], |
182 | 219 | 'pg_basebackup with replication slot and -R runs');
|
183 |
| -like(slurp_file("$tempdir/backupxs_sl_R/recovery.conf"), |
184 |
| -qr/^primary_slot_name = 'slot1'$/m, |
185 |
| -'recovery.conf sets primary_slot_name'); |
| 220 | +like( |
| 221 | +slurp_file("$tempdir/backupxs_sl_R/recovery.conf"), |
| 222 | +qr/^primary_slot_name = 'slot1'$/m, |
| 223 | +'recovery.conf sets primary_slot_name'); |