|
10 | 10 | use TestLib;
|
11 | 11 | use Test::More;
|
12 | 12 |
|
13 |
| -plantests=>5; |
| 13 | +plantests=>3; |
14 | 14 |
|
15 | 15 | # Test: Create a physical replica that's missing the last WAL file,
|
16 | 16 | # then restart the primary to create a divergent WAL file and observe
|
|
89 | 89 | my$log = slurp_file($node_standby->logfile);
|
90 | 90 | like(
|
91 | 91 | $log,
|
92 |
| -qr[sucessfully skipped missing contrecord at], |
| 92 | +qr[successfully skipped missing contrecord at], |
93 | 93 | "found log line in standby");
|
94 | 94 |
|
95 | 95 | $node->stop;
|
96 | 96 | $node_standby->stop;
|
97 |
| - |
98 |
| - |
99 |
| -# Second test: a standby that receives WAL via archive/restore commands. |
100 |
| -$node = PostgresNode->new('primary2'); |
101 |
| -$node->init( |
102 |
| -has_archiving=> 1, |
103 |
| -extra=> ['--wal-segsize=1']); |
104 |
| -$node->set_replication_conf; |
105 |
| - |
106 |
| -# Note: consistent use of forward slashes here avoids any escaping problems |
107 |
| -# that arise from use of backslashes. That means we need to double-quote all |
108 |
| -# the paths in the archive_command |
109 |
| -my$perlbin = TestLib::perl2host($^X); |
110 |
| -$perlbin =~s!\\!/!gif$TestLib::windows_os; |
111 |
| -my$archivedir =$node->archive_dir; |
112 |
| -$archivedir =~s!\\!/!gif$TestLib::windows_os; |
113 |
| -$node->append_conf( |
114 |
| -'postgresql.conf', |
115 |
| -qq{ |
116 |
| -archive_command = '"$perlbin" "$FindBin::RealBin/idiosyncratic_copy" "%p" "$archivedir/%f"' |
117 |
| -wal_level = replica |
118 |
| -max_wal_senders = 2 |
119 |
| -wal_keep_size = 1GB |
120 |
| -}); |
121 |
| -# Make sure that Msys perl doesn't complain about difficulty in setting locale |
122 |
| -# when called from the archive_command. |
123 |
| -local$ENV{PERL_BADLANG} = 0; |
124 |
| -$node->start; |
125 |
| -$node->backup('backup'); |
126 |
| - |
127 |
| -$node_standby = PostgresNode->new('standby2'); |
128 |
| -$node_standby->init_from_backup($node,'backup',has_restoring=> 1); |
129 |
| - |
130 |
| -$node_standby->start; |
131 |
| - |
132 |
| -$node->safe_psql('postgres','create table filler (a int)'); |
133 |
| -# First, measure how many bytes does the insertion of 1000 rows produce |
134 |
| -$start_lsn = |
135 |
| -$node->safe_psql('postgres',q{select pg_current_wal_insert_lsn() - '0/0'}); |
136 |
| -$node->safe_psql('postgres', |
137 |
| -'insert into filler select * from generate_series(1, 1000)'); |
138 |
| -$end_lsn = |
139 |
| -$node->safe_psql('postgres',q{select pg_current_wal_insert_lsn() - '0/0'}); |
140 |
| -$rows_walsize =$end_lsn -$start_lsn; |
141 |
| - |
142 |
| -# Now consume all remaining room in the current WAL segment, leaving |
143 |
| -# space enough only for the start of a largish record. |
144 |
| -$node->safe_psql( |
145 |
| -'postgres',qq{ |
146 |
| -WITH setting AS ( |
147 |
| - SELECT setting::int AS wal_segsize |
148 |
| - FROM pg_settings WHERE name = 'wal_segment_size' |
149 |
| -) |
150 |
| -INSERT INTO filler |
151 |
| -SELECT g FROM setting, |
152 |
| - generate_series(1, 1000 * (wal_segsize - ((pg_current_wal_insert_lsn() - '0/0') % wal_segsize)) /$rows_walsize) g |
153 |
| -}); |
154 |
| - |
155 |
| -# Now block idiosyncratic_copy from creating the next WAL in the replica |
156 |
| -my$archivedgood =$node->safe_psql('postgres', |
157 |
| -q{SELECT pg_walfile_name(pg_current_wal_insert_lsn())}); |
158 |
| -my$archivedfail =$node->safe_psql( |
159 |
| -'postgres', |
160 |
| -q{SELECT pg_walfile_name(pg_current_wal_insert_lsn() + setting::integer) |
161 |
| -from pg_settings where name = 'wal_segment_size'}); |
162 |
| -openmy$filefail,">","$archivedir/$archivedfail.fail" |
163 |
| -ordie"can't open$archivedir/$archivedfail.fail:$!"; |
164 |
| - |
165 |
| -my$currlsn = |
166 |
| -$node->safe_psql('postgres','select pg_current_wal_insert_lsn() - 1000'); |
167 |
| - |
168 |
| -# Now produce a large WAL record in a transaction that we leave open |
169 |
| -my ($in,$out); |
170 |
| -my$timer = IPC::Run::timeout(180); |
171 |
| -my$h = |
172 |
| -$node->background_psql('postgres', \$in, \$out,$timer,on_error_stop=> 0); |
173 |
| - |
174 |
| -$in .=qq{BEGIN; |
175 |
| -SELECT pg_logical_emit_message(true, 'test 026', repeat('somenoise', 8192)); |
176 |
| -}; |
177 |
| -$h->pump_nb; |
178 |
| -$node->poll_query_until( |
179 |
| -'postgres', |
180 |
| -"SELECT last_archived_wal >= '$archivedgood' FROM pg_stat_archiver"), |
181 |
| -ordie"Timed out while waiting for standby to catch up"; |
182 |
| - |
183 |
| -# Now crash the node with the transaction open |
184 |
| -$node->stop('immediate'); |
185 |
| -$h->finish(); |
186 |
| -$node->start; |
187 |
| -$node->safe_psql('postgres','create table witness (a int);'); |
188 |
| -$node->safe_psql('postgres','insert into witness values (42)'); |
189 |
| -unlink"$archivedir/$archivedfail.fail" |
190 |
| -ordie"can't unlink$archivedir/$archivedfail.fail:$!"; |
191 |
| -$node->safe_psql('postgres','select pg_switch_wal()'); |
192 |
| - |
193 |
| -$until_lsn =$node->safe_psql('postgres',"SELECT pg_current_wal_lsn()"); |
194 |
| -$caughtup_query ="SELECT '$until_lsn'::pg_lsn <= pg_last_wal_replay_lsn()"; |
195 |
| -$node_standby->poll_query_until('postgres',$caughtup_query) |
196 |
| -ordie"Timed out while waiting for standby to catch up"; |
197 |
| - |
198 |
| -my$answer =$node_standby->safe_psql('postgres','select * from witness'); |
199 |
| -is($answer,'42','witness tuple appears'); |
200 |
| - |
201 |
| -# Verify message appears in standby's log |
202 |
| -$log = slurp_file($node_standby->logfile); |
203 |
| -like( |
204 |
| -$log, |
205 |
| -qr[sucessfully skipped missing contrecord at], |
206 |
| -"found log line in standby"); |
207 |
| -$node->stop; |
208 |
| -$node_standby->stop; |