|
11 | 11 | use PostgresNode; |
12 | 12 |
|
13 | 13 | use File::Path qw(rmtree); |
14 | | -use Test::More tests => $TestLib::windows_os ? 14 : 18; |
| 14 | +use Test::More tests => 14; |
15 | 15 | use Time::HiRes qw(usleep); |
16 | 16 |
|
17 | 17 | $ENV{PGDATABASE} = 'postgres'; |
|
211 | 211 | } |
212 | 212 | ok($failed, 'check that replication has been broken'); |
213 | 213 |
|
214 | | -$node_primary->stop; |
215 | | -$node_standby->stop; |
| 214 | +$node_primary->stop('immediate'); |
| 215 | +$node_standby->stop('immediate'); |
216 | 216 |
|
217 | 217 | my $node_primary2 = get_new_node('primary2'); |
218 | 218 | $node_primary2->init(allows_streaming => 1); |
|
253 | 253 | timeout => '60')); |
254 | 254 | is($result[1], 'finished', 'check if checkpoint command is not blocked'); |
255 | 255 |
|
256 | | -$node_primary2->stop; |
257 | | -$node_standby->stop; |
258 | | - |
259 | | -# The next test depends on Perl's `kill`, which apparently is not |
260 | | -# portable to Windows. (It would be nice to use Test::More's `subtest`, |
261 | | -# but that's not in the ancient version we require.) |
262 | | -if ($TestLib::windows_os) |
263 | | -{ |
264 | | - done_testing(); |
265 | | - exit; |
266 | | -} |
267 | | - |
268 | | -# Get a slot terminated while the walsender is active |
269 | | -# We do this by sending SIGSTOP to the walsender. Skip this on Windows. |
270 | | -my $node_primary3 = get_new_node('primary3'); |
271 | | -$node_primary3->init(allows_streaming => 1, extra => ['--wal-segsize=1']); |
272 | | -$node_primary3->append_conf( |
273 | | - 'postgresql.conf', qq( |
274 | | - min_wal_size = 2MB |
275 | | - max_wal_size = 2MB |
276 | | - log_checkpoints = yes |
277 | | - max_slot_wal_keep_size = 1MB |
278 | | - )); |
279 | | -$node_primary3->start; |
280 | | -$node_primary3->safe_psql('postgres', |
281 | | - "SELECT pg_create_physical_replication_slot('rep3')"); |
282 | | -# Take backup |
283 | | -$backup_name = 'my_backup'; |
284 | | -$node_primary3->backup($backup_name); |
285 | | -# Create standby |
286 | | -my $node_standby3 = get_new_node('standby_3'); |
287 | | -$node_standby3->init_from_backup($node_primary3, $backup_name, |
288 | | - has_streaming => 1); |
289 | | -$node_standby3->append_conf('postgresql.conf', "primary_slot_name = 'rep3'"); |
290 | | -$node_standby3->start; |
291 | | -$node_primary3->wait_for_catchup($node_standby3->name, 'replay'); |
292 | | -my $senderpid = $node_primary3->safe_psql('postgres', |
293 | | - "SELECT pid FROM pg_stat_activity WHERE backend_type = 'walsender'"); |
294 | | -like($senderpid, qr/^[0-9]+$/, "have walsender pid $senderpid"); |
295 | | -my $receiverpid = $node_standby3->safe_psql('postgres', |
296 | | - "SELECT pid FROM pg_stat_activity WHERE backend_type = 'walreceiver'"); |
297 | | -like($receiverpid, qr/^[0-9]+$/, "have walreceiver pid $receiverpid"); |
298 | | - |
299 | | -# freeze walsender and walreceiver. Slot will still be active, but walreceiver |
300 | | -# won't get anything anymore. |
301 | | -kill 'STOP', $senderpid, $receiverpid; |
302 | | -$logstart = get_log_size($node_primary3); |
303 | | -advance_wal($node_primary3, 4); |
304 | | -ok(find_in_log($node_primary3, "to release replication slot", $logstart), |
305 | | - "walreceiver termination logged"); |
306 | | - |
307 | | -# Now let the walsender continue; slot should be killed now. |
308 | | -# (Must not let walreceiver run yet; otherwise the standby could start another |
309 | | -# one before the slot can be killed) |
310 | | -kill 'CONT', $senderpid; |
311 | | -$node_primary3->poll_query_until('postgres', |
312 | | - "SELECT wal_status FROM pg_replication_slots WHERE slot_name = 'rep3'", |
313 | | - "lost") |
314 | | - or die "timed out waiting for slot to be lost"; |
315 | | - |
316 | | -my $max_attempts = 180; |
317 | | -while ($max_attempts-- > 0) |
318 | | -{ |
319 | | - if (find_in_log( |
320 | | - $node_primary3, |
321 | | - 'invalidating slot "rep3" because its restart_lsn', $logstart)) |
322 | | - { |
323 | | - ok(1, "slot invalidation logged"); |
324 | | - last; |
325 | | - } |
326 | | - sleep 1; |
327 | | -} |
328 | | - |
329 | | -# Now let the walreceiver continue, so that the node can be stopped cleanly |
330 | | -kill 'CONT', $receiverpid; |
331 | | - |
332 | | -$node_primary3->stop; |
333 | | -$node_standby3->stop; |
334 | | - |
335 | 256 | ##################################### |
336 | 257 | # Advance WAL of $node by $n segments |
337 | 258 | sub advance_wal |
|
0 commit comments